打印
[经验分享]

MG32F02A/U 64/128 NCO(数字控制振荡器)

[复制链接]
39020|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
MG_FAE|  楼主 | 2021-7-2 10:37 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
数字控制振荡器(Numerically Controlled Oscillator)

什麼是数字控制振荡器?

  NCO是一个非常好用的功能,可藉由程控产生任意频率的方波, 且不会造成主频变动.


数字控制振荡器的好處

1.产生最快24Mhz的频率组合
2.可输出给外部使用
3.可当成M0的追频函数






NCO溢出频率

(NCO输出频率需 < NCO输入频率/2 且 < APB频率/4)
  


代码简介
#include "MG32x02z_APB_DRV.h"

//*** <<< Use Configuration Wizard in Context Menu >>> ***

// ----------------------------------------------------------------------------
//  <o0> NCO input clock source select.
//      <0=> CK_IHRCO
//      <1=> CL_PLL
//      <2=> CK_APB
//      <3=> CK_LS
//      <4=> TM00_TRGO
//      <5=> NCO_CK0 (input pin)
#define NCOClock        0
选择NCO的时钟来源
// ----------------------------------------------------------------------------
//  <o0> NCO output mode <0=>FDC mode <1=>PFM mode  
#define NCOOutputMode   0  
选择NCO的输出模式
FDC模式是固定占空比模式
PFM模式是脉冲频率模式
// ----------------------------------------------------------------------------
//  <o0> Inverse NCO output <1=>ENABLE <0=>DISABLE
#define InverseNCO      0   
设置NCO的输出反相
// ------------------------------------------------------------------------
//  <o0> input range from 0 to 1048575 (2^20 - 1)
#define NCOINCVal       1000
NC0的输入范围,根据前面公式设置该值,获得想要的频率
// ----------------------------------------------------------------------------
//  <o0> APB NCO PFM width select (only support PFM mode)
//      <0=> 1 CK_NCOn clock period
//      <1=> 2 CK_NCOn clock period
//      <2=> 4 CK_NCOn clock period
//      <3=> 8 CK_NCOn clock period
//      <4=> 16 CK_NCOn clock period
//      <5=> 32 CK_NCOn clock period
//      <6=> 64 CK_NCOn clock period
//      <7=> 128 CK_NCOn clock period
#define NCO_PFMWidth    7
设置NCO PFM输出模式下的脉冲宽度
//*** <<< end of configuration section >>>    ***

/**
*******************************************************************************
* [url=home.php?mod=space&uid=247401]@brief[/url]            Initial NCO peripheral.
* [url=home.php?mod=space&uid=1543424]@Details[/url]     Initial NCO with start it.
* [url=home.php?mod=space&uid=266161]@return[/url]                None
*******************************************************************************
*/
void Sample_APB_NCO(void)
{  
   
    // make sure :
        
    //===Set CSC init====
    //MG32x02z_CSC_Init.h(Configuration Wizard)
    //Select CK_HS source = CK_IHRCO
    //Select IHRCO = 12M
    //Select CK_MAIN Source = CK_HS
    //Configure PLL->Select APB Prescaler = CK_MAIN/1
    //Configure Peripheral On Mode Clock->APB = Enable
        在初始化之前确保设置好了想要的时钟
    //==Set GPIO init
    //NCO_P0 pin config:
    //MG32x02z_GPIO_Init.h(Configuration Wizard)->Use GPIOB->PB3
    //GPIO port initial is 0xFFFF
    //PB3 mode is PPO
    //PB3 function NCO_P0
确保相应的IO口设置到了相应的模式和功能复用。


    // ------------------------------------------------------------------------
    // initial NCO
    APB_NCOClockSource_Select((APB_NCOInputClockSrcDef) NCOClock);
    APB_NCOOutputMode_Select((APB_NCOOutputMode) NCOOutputMode);
    APB_NCOInverseOutput_Cmd((FunctionalState) InverseNCO);
   
    APB_NCOPFMWidth_Select((APB_NCOPFMWidtrhSelDef) NCO_PFMWidth);
   
    APB_NCOSetINC(NCOINCVal);
    APB_NCOSetACC(999);
   
    APB_NCO_Cmd(ENABLE);
        

初始化NCO的步骤:
1.选择输入时钟
2.选择输出模式
3.选择是否进行反相
4.设置PFM宽度(若使用PFM模式)
5.设置好输入比较值和计数值
6.使能输出。


    return;
}


使用特权

评论回复
沙发
daichaodai| | 2021-7-5 20:35 | 只看该作者
其它地方叫MCO

使用特权

评论回复
板凳
麻花油条| | 2021-8-6 16:13 | 只看该作者
看看研究一下

使用特权

评论回复
地板
两只袜子| | 2022-7-6 09:53 | 只看该作者
数字控制振荡器简称NCO

使用特权

评论回复
5
gouguoccc| | 2024-8-1 08:27 | 只看该作者
笙泉的MCU感觉用的人很少啊,资源好找吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

87

主题

319

帖子

9

粉丝