[PIC®/AVR®/dsPIC®产品]

使用MCC学习PIC单片机 – NCO 数控振荡器

[复制链接]
2153|4
手机看帖
扫描二维码
随时随地手机跟帖
oxygenzz|  楼主 | 2019-4-15 16:29 | 显示全部楼层 |阅读模式


数控振荡器NCO)是一个20位的定时器。它与普通的定时器工作原理不同。
-        普通的定时器每次加1,当累加值达到预设门限的时候,输出变化。
-        NCO每次加一个固定值(预设值),当累加值达到最大值并产生溢出时,输出变化
使用NCO来进行分频,输出信号频率值可以线性的改变。

在MCC里面配置NCO,界面如下:


565895cb4403388c8e.png

NCO的原理简图如下:

303085cb440505c554.png


NCO 输入 时钟源

多种时钟源,可供选择。


973285cb4406d87384.png
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;
}




使用特权

评论回复
CoolSilicon| | 2019-4-15 16:35 | 显示全部楼层
加油加油!..还有14个MCC外设模块再等你!

使用特权

评论回复
condition| | 2019-4-15 21:15 | 显示全部楼层
学习一下!感谢楼主分享!

使用特权

评论回复
meeagle| | 2019-9-3 21:21 | 显示全部楼层
用这个,闪存得大几倍

使用特权

评论回复
wangchangwenqq| | 2021-12-8 09:06 | 显示全部楼层
学习了

使用特权

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

本版积分规则

46

主题

190

帖子

11

粉丝