第一次看這個圖時候覺得有的懵~ 後來看懂也就好多了。
對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%...
本次實驗程式如下:
#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);
}