PIC单片机的PWM功能主要是设置占空比
首先,要用Pwm功能,必须设定的PWM模式。见CCP1CON寄存器定义:
bit 3-0 CCPxM3:CCPxM0: CCPx Mode Selectbits 设定为11xx = PWM mode。
这里要注意的是bit 5-4 CCPxX:CCPxY: PWM Least Significant bits,因为PWM的10位精度的,而后面的CCPR只有8位(8位单片机麻),所以在这里弄了两个低两位出来,不合理,但合情。
如手册所说,CCPR1L是用于占空比的计算的比较值,CCPR1H不用我们去设。
PR2用于控制PWM输出信号的周期。
逻辑从那个RS触发器看到出来很简单,就是当前计数值>CCPR时复位,当前计数值>PR2时,复位计数器,重装CCPR1H,置位输出。CCPR1H和1L的关系,手册提到如下:
CCPR1L and CCP1CON<5:4> can bewritten to at any time, but the duty cycle value is not latched into CCPR1Huntil after a match between PR2 and TMR2 occurs (i.e., the period is complete).In PWM mode, CCPR1H is a read-only register。
好事情,也就是说我们不用管CCPR1H。
好了,来看看周期的公式吧。
PWM period = [(PR2) + 1] • 4 • TOSC •(TMR2prescale value)
哦,从这可以看出来,TMR2其实也是用来分频的。不难理解。TOSC为Timer2的输出,怎么会有个4?看PWM结构图吧,10位的PWM,但PR2只有8位喔,相当于左移了2位,也就是乘了个4.
如果TOSC为4M,我们想PWM输出的频率为22KHz,为了增加精度,我们把TMR2设为1,则RP2
= (4000KHz / 22KHz)/4 - 1 =44.5 = 44;
好,再来看PWM占空比吧,
先看公式:
PWM duty cycle =(CCPR1L:CCP1CON<5:4>)•TOSC • (TMR2 prescale value)
如果要让占空比为50%,因为PWM period= 1/22KHz = 45us, 则PWM
duty cycle =45us * 50% = 23us
好吧,同样,TMR2=1,(CCPR1L:CCP1CON<5:4>) = 23us / TOSC = 23us / (1/4Mhz) = 23us /0.25us = 92。二进制为1011100,则CCPR1L为:10111(0x17),CCP1CON<5:4>为:00(0x0)。
OK,任务结束。
/*******************************************************************************************/
void CCP1INT()
{
CCPR1L=0x7F;
CCP1CON=0X3C;
INTOCN=0X00;
PR2=0XFF; //设置PWM的工作周期
TRISC=0XFB; //设置CCP1引脚为输出
}
void Start_Pwm
{
T2CON=0X04;
}