天天看點

關于PIC16F877A PWM計算的問題

第一次看這個圖時候覺得有的懵~ 後來看懂也就好多了。

對pwm實驗,我們一般隻關心頻率和占空比的問題,下來我來講解下這個圖:

首先假設單片機外接4MHz晶振;

PWM波的周期是由PR2寄存器來決定的,占空比是由CCPR1L+2位組成一個10位分辨率;

而周期卻是8位分辨率,分子大于分母,那這PWM還能正常工作嗎?

我相信很多人一開始可能跟我一樣,有這樣的疑惑!

關于PIC16F877A PWM計算的問題

我們看下官方資料手冊上面是如何計算周期的:

關于PIC16F877A 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

關于PIC16F877A PWM計算的問題

到這裡我還沒有回答為什麼分子比分母大?其實分子和分母都是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);
}

           

如果您覺得我這篇文章對你有用,那請點個贊吧 :)