数控振荡器(NCO)是一个20位的定时器。它与普通的定时器工作原理不同。
- 普通的定时器每次加1,当累加值达到预设门限的时候,输出变化。
- NCO每次加一个固定值(预设值),当累加值达到最大值并产生溢出时,输出变化
使用NCO来进行分频,输出信号频率值可以线性的改变。
在MCC里面配置NCO,界面如下:
NCO的原理简图如下:
NCO 输入 时钟源
多种时钟源,可供选择。
NCO工作模式
固定占空比模式:每次累加器溢出,产生一次电平翻转(图中D触发器构成的二分频电路)。输出信号频率为翻转频率的1/2,占空比固定为50%。
脉冲频率模式:输出脉冲宽度可选择,宽度为(1/2/4…/128)个输入时钟周期。输出信号周期为累加器溢出两次溢出的间隔周期。
NCO输出方式:
PIN脚输出
产生中断
驱动其他外设
输出状态bit位
MCC生成代码:
代码在nco1.c文件中。
初始化NCO1CON,NCO1CLK,NCO1ACC和NCO1INC寄存器,使能NCO。
void NCO1_Initialize (void)
{
// Set the NCO to the options selected in the GUI
// EN disabled; POL active_hi; PFM PFM_mode;
NCO1CON = 0x01;
// CKS MFINTOSC_500KHz; PWS 1_clk;
NCO1CLK = 0x03;
//
NCO1ACCU = 0x00;
//
NCO1ACCH = 0x00;
//
NCO1ACCL = 0x00;
//
NCO1INCU = 0x00;
//
NCO1INCH = 0x08;
//
NCO1INCL = 0x31;
// Enable the NCO module
NCO1CONbits.EN = 1;
// Clearing IF flag before enabling the interrupt.
PIR7bits.NCO1IF = 0;
// Enabling NCO1 interrupt.
PIE7bits.NCO1IE = 1;
}
查询输出状态
bool NCO1_GetOutputStatus(void)
{
// Return output status on accumulator over flow
return (NCO1CONbits.OUT);
}
当NCO累加器溢出时产生中断
void NCO1_ISR(void)
{
// Clear the NCO1 interrupt flag
PIR7bits.NCO1IF = 0;
}
|