目录
一、原理
1.脉冲宽度调制(PWM)是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可以使用PWM进行编码。
2、配置PWM模块的功能,具体有:
①:设置PWM定时器周期,该参数决定PWM波形的频率。
②:设置PWM定时器比较值,该参数决定PWM波形的占空比。
3.简单来说,就是通过控制PWM的占空比duty(高电平所占时间)来实现所需的功能;(第七届比赛赛题)
二、设置思路:
计算出占空比在给定频率(1KHz)下的时间,通过引入count变量,以一个脉冲周期100次为例,60%占空比就是count++到60次高电平状态;当count=duty(占空比)时,执行操作;
对于多状态转换,使用状态机更好
三、题目练习
以b站小蜜蜂老师的题目为引例:
#include "reg52.h" sbit L1 = P0^0; sbit S7 = P3^0; void SelectHC573(unsigned char channel) { switch(channel) { case 4: P2 = (P2 & 0x1f) | 0x80; break; case 5: P2 = (P2 & 0x1f) | 0xa0; break; case 6: P2 = (P2 & 0x1f) | 0xc0; break; case 7: P2 = (P2 & 0x1f) | 0xe0; break; } } unsigned char count=0; unsigned char pwm_duty=0; //占空比设置为可变 void InitTimer0() { TMOD = 0x01; TH0 = (65535 - 100) / 256; TL0 = (65535 - 100) % 256; ET0 = 1; EA = 1; } void ServiceTimer() interrupt 1 { TH0 = (65535 - 100) / 256; //10 ms = 10000us 定时中断100us,则100次中断达到一个周期 TL0 = (65535 - 100) % 256; // 将一个脉冲划分为100份,若占空比10%,则计数10次高电平后计数90次低电平后置零完成 count++; if(count == pwm_duty) { L1 = 1 ; } else if(count == 100) { L1 = 0; count = 0; } } void Delay(unsigned char t) { while(t--); } unsigned char stat=0; void ScanKey() { if(S7 == 0) { Delay(500); if(S7 == 0) { //多状态时使用状态机的跳转 switch(stat) { case 0 : L1 = 0; TR0 = 1; pwm_duty = 10; stat = 1; break; case 1 : pwm_duty = 50; stat = 2; break; case 2 : pwm_duty = 90; stat = 3; break; case 3 : L1 = 1; TR0 = 0; stat=0; break; } while (S7 == 0); //防止出现误判误操作 } } } void main() { SelectHC573(4); L1 = 1; InitTimer0(); while(1) { ScanKey(); } }