所谓的pwm输出就是让单片机在某个管脚上按照时间输出特定频率和占空比的矩形方波。这里面有两个参数,一是频率,二是占空比。两者互不干涉。以STC12C5A60S2为例子,本51型单片机可以有两路pwm输出。以其中的一路为例说明;
首先说频率。单片机内部CL计数器,用来计数输入的脉冲信号。CH无作用。从00开始,到FF结束。单调递增,不受干扰。输入的脉冲信号源有8种。三个比特位,用来选择脉冲信号来自哪里。这三位是CPS2,CPS1,CPS0。这三位位于寄存器CMOD上的3,2,1位。
最具有实用性的是010,定时器0的溢出脉冲。
设置定时器0。让定时器0按照需要的频率的256倍频率溢出。例如需要1000赫兹的频率,让计数器溢出频率为256K。
下面说占空比:
计数器每来一个脉冲,计数器CL的值增一。同时与另外的寄存器CCAP0L比较。一旦相等,就立即输出高电平。
若CCAP0L的值为0,则计数器从0开始就让输出脚输出高电平,此时的占空比为100%。如果CCAP0L的值是0xFF。此时的占空比为0。下面是pwm初始化函数
void PCA_Init(void)
{
CCON = 0; //PCA初始化
CMOD = 0x04; //空闲时不计数,不产生中断,时钟源为定时器0的溢出
CL = 0x00; //PCA低8位清零
CH = 0x00; //PCA高8位清零
CCAPM0 = 0x42; //PWM模式,无中断
CCAP0H = 0x80; //PWM0占空比(调节此处值调节PWM占空比)
CCAP0L = 0x80; //PWM0占空比(调节此处值调节PWM占空比)
CR = 1; //启动PCA计数器
}
CL从FF溢出到00的时候 CCAP0H的值自动装载到CCAP0L可以实现无干扰的调整占空比。