目录
STC15F2K60S2(IAP15也可以)中PWM产生的原理图(PWM产生功能是集成在PCA功能模块中的):
产生PWM是使用计数-->比较-->输出的模式
定时器配置及PCA相关寄存器配置源代码:
void Timer0_init(void)//1us作为PCA计数器的计数单位
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x02; //设置定时器模式
TL0 = 0xF5; //设置定时初值
TH0 = 0xF5; //设置定时重载值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
}
void PWM_EN()
{
CCAP0L = 0x80;//PCA0比较寄存器,使占空比达到1:1
CCAP1L = 0x80;//PCA1比较寄存器
CCAP0H = 0x80;//设定PCA0比较寄存器重载值后八位
CCAP1H = 0x80;//设定PCA1比较寄存器重载值后八位
CL = 0;//PCA计数器清零
CH = 0;//PCA计数器清零
CMOD = 0x84; // 空闲模式下PCA计数器停止工作;定时器0溢出做PCA模块的时钟源
CCON= 0x00;
CCAPM0 = 0x42;//使能PWM0和比较器
CCAPM1 = 0x42;//使能PWM1和比较器
PCA_PWM0 = 0x00;//PCA0八位PWM模式,EPC0L(和比较寄存器组成9位数字)置零
PCA_PWM1 = 0x00;//PCA1八位PWM模式
CCON= 0x40;//使能PAC计数器
}
上面代码实现的是CCP0和CCP1管脚输出占空比位为1:1的PWM波:
代码解析:
这里的时钟源采用的是定时器0产生的脉冲,并且不启用PCA计数器的中断
可通过字节操作使能计数器
在这里使能比较器和脉冲宽度调制功能
计数器和比较器的寄存器
效果图:
频率为3.9332KHZ,这个频率和输入的时钟源的频率有关。
也就是计数器溢出一次产生一个周期的PWM波