PIC单片机之PWM

2019-04-15 11:35发布

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,因为PWM10位精度的,而后面的CCPR只有8位(8位单片机麻),所以在这里弄了两个低两位出来,不合理,但合情。
如手册所说,CCPR1L是用于占空比的计算的比较值CCPR1H不用我们去设。
PR2用于控制PWM输出信号的周期。
逻辑从那个RS触发器看到出来很简单,就是当前计数值>CCPR时复位,当前计数值>PR2时,复位计数器,重装CCPR1H,置位输出。CCPR1H1L的关系,手册提到如下:
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其实也是用来分频的。不难理解。TOSCTimer2的输出,怎么会有个4?看PWM结构图吧,10位的PWM,但PR2只有8位喔,相当于左移了2位,也就是乘了个4.
如果TOSC4M,我们想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>为:000x0)。
OK,任务结束。
/*******************************************************************************************/
void CCP1INT() {  CCPR1L=0x7F;  CCP1CON=0X3C; INTOCN=0X00; PR2=0XFF;   //设置PWM的工作周期 TRISC=0XFB; //设置CCP1引脚为输出 } void Start_Pwm {     T2CON=0X04; }