第一次看这个图时候觉得有的懵~ 后来看懂也就好多了。
对pwm实验,我们一般只关心频率和占空比的问题,下来我来讲解下这个图:
首先假设单片机外接4MHz晶振;
PWM波的周期是由PR2寄存器来决定的,占空比是由CCPR1L+2位组成一个10位分辨率;
而周期却是8位分辨率,分子大于分母,那这PWM还能正常工作吗?
我相信很多人一开始可能跟我一样,有这样的疑惑!
文章图片
我们看下官方数据手册上面是如何计算周期的:
文章图片
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%...
【关于PIC16F877A PWM计算的问题】本次实验程序如下:
#include __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);
}
如果您觉得我这篇文章对你有用,那请点个赞吧 :)
推荐阅读
- PIC 定时器中断1(外设中断)
- PIC之休眠问题
- PIC单片机之看门狗
- PIC单片机之SPI从机框架
- PIC CCP_PWM 呼吸灯
- PIC单片机之PWM
- PIC单片机-PWM波
- PIC单片机|PIC单片机的PWM波的简单调制+proteus仿真实现直流电机的启动