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

关于PIC16F877A PWM计算的问题

[复制链接]
550|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kxsi|  楼主 | 2019-7-25 10:20 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
第一次看这个图时候觉得有的懵~ 后来看懂也就好多了。

对pwm实验,我们一般只关心频率和占空比的问题,下来我来讲解下这个图:

首先假设单片机外接4MHz晶振;

PWM波的周期是由PR2寄存器来决定的,占空比是由CCPR1L+2位组成一个10位分辨率;

而周期却是8位分辨率,分子大于分母,那这PWM还能正常工作吗?

我相信很多人一开始可能跟我一样,有这样的疑惑!


使用特权

评论回复
沙发
kxsi|  楼主 | 2019-7-25 10:21 | 只看该作者

我们看下官方数据手册上面是如何计算周期的:


PWM周期=(PR2+1)*4*Tosc*TMR2分频数

这个公式里有2个地方需要注意:


① Tosc是4MHz,而不是1MHz


② 乘以4这个就是CCPR1L<<2(右移2位)的意思


假设我想实现10kHz占空比90的方波,改怎么填写相关寄存器的值?


首先计算10kHz周期也就是100us


100=(PR2+1)*4*0.25*1(分频数)


则PR2=99


CCPR1L:X:Y=90*4*0.25*1


可以取X:Y=0:0(等式两边同时右移2位)


则CCPR1L=90



到这里我还没有回答为什么分子比分母大?其实分子和分母都是10bit,只不过分母的最低2bit始终是0;

而分子的10bit都是可以设置的,这样的好处是可以精确的设计出想要的占空比,比如27%,61%,84%...


使用特权

评论回复
板凳
kxsi|  楼主 | 2019-7-25 10:21 | 只看该作者
本次实验程序如下:

#include <htc.h>

__CONFIG(0xFF32);


void init_ccp1(void)
{
        TRISC2=0;        //RC2/CCP1设置为输出
#if 0
        PR2=61;                //周期为1ms,占空比40%
        T2CON=0x06;        //TMR2预分频1:16,开始工作
        CCPR1L=0x19;
#else       
        PR2=99;                //周期为100us,占空比90%
        T2CON=0x04;        //TMR2预分频1:1,开始工作
        CCPR1L=90;
#endif       
        CCP1CON=0x0c;        //PWM模式
}

void main()
{
        init_ccp1();
        while(1);
}



使用特权

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

本版积分规则

45

主题

3310

帖子

2

粉丝