以下内容来源《51单片机轻松入门-基于STC15W4K系列》
4、脉宽调节模式 PWM意为脉冲宽度调制,可用于调整输出直流平均电压,对于矩形波而言,输出平均压等于峰值电压×占空比,占空比是一个脉冲周期内高电平时间与周期的比值,例如,峰值电压等于5V,占空比等于50%的方波信号平均电压等于2.5V,也就是万用表直流档测量得到的电压值,8位PWM模式结构如图8-6所示, PWM输出不需要使用中断。 图8-6 8位PWM模式结构图 通过程序设定寄存器PCA_PWMn(n=0,1,2,下同)中的位EBSn_1及EBSn_0,使其工作于8位PWM或7位PWM或6位PWM模式,当[EBSn_1,EBSn_0]=[0,0](默认值)或[1,1]时,PCA模块n工作于8位PWM模式,此时将{0,CL[7:0]}与[EPCnL,CCAPnL[7:0]]进行比较,当{0,CL[7:0]}中的值小于{EPCnL,CCAPnL[7:0]}时,输出为低,当{0,CL[7:0]}中的值等于或大于{EPCnL,CCAPnL[7:0]}时,输出为高,当EPCnL=0且CCAPnL=00H时,PWM固定输出高,当EPCnL=1且CCAPnL=FFH 时,PWM固定输出低。当CL的值由FF变为00溢出时,{EPCnH,CCAPnH[7:0]}的内容自动装载到{EPCnL,CCAPnL[7:0]}中,这样可实现无干扰地更新PWM占空比,要使能PWM模式,模块CCAPMn寄存器的ECOMn和PWMn位必须置位。 PCA时钟输入源可以从以下8种中选择一种:SYSclk/12、SYSclk /8、SYSclk/6、SYSclk /4、SYSclk /2、SYSclk、定时器0的溢出、ECI/P1.2输入,PWM输出占空比由{EPCnL,CCAPnL[7:0]}确定。 8位PWM的周期 = 计数脉冲周期×256 8位PWM的频率 = 计数脉冲频率/256 8位PWM的脉宽时间(高电平时间)= 计数脉冲周期×(256-CCAPnL) 8位PWM的占空比 = 脉宽时间/PWM周期 = (1- CCAPnL/256) ×100% 如果要实现给定频率的PWM输出,可选择定时器0的溢出或者ECI(P1.2)脚的输入作为PCA的时钟输入源。所有PCA模块都可用作PWM输出,由于所有模块共用PCA定时器,所以它们的输出频率相同,各个模块的输出占空比是独立变化的,当某个I/O 口作为PWM使用时,该口的状态如表8-9所示。 表8-9 I/O口作为PWM使用时的状态
PWM之前的状态 | | | 强推挽输出/强上拉输出,要加输出限流电阻1KΩ-10KΩ | | 强推挽输出/强上拉输出,要加输出限流电阻1KΩ-10KΩ | | | | |
例8.5 利用PCA 模块实现占空比固定的PWM输出。 例8.5 利用PCA 模块实现占空比固定的PWM输出。 说明:利用PCA模块0实现在P1.1输出占空比固定的PWM信号,假设R/C时钟频率Fosc = 22.1184MHz。 #include"STC15W4K.H" // 包含STC15W4K寄存器定义文件 void initPWM() { CMOD=0x80; // #10000000B 空闲模式下停止PCA计数器工作 // 选择PCA时钟源为Fosc/12,禁止PCA计数器溢出时中断 CCAPM0=0x42; // 设置PCA模块为PWM输出方式。 CR=1; // PCA计数器开始运行 } void main() { initPWM(); CCAP0H=0x20; // 脉宽控制 while(1); //让程序停在这里。 }
实验结果:用万用表测量P1.1输出频率为7.210KHz,占空比为87.5%。理论计算P1.1频率=计数脉冲频率/256 = 22118400/12/256=7.2 KHz,占空比=(1- CCAPnL/256)×100%=(1-32/256)×100%=87.5%。可见理论计算与实际结果是一致的。
|