PWM控制在很多地方都会用到,比如使用PWM来控制电机的速度,使用PWM来生成想要的波形。
一、PWM
PWM即脉冲宽度调制,在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效的获得所需要的模拟参量;说白了就是通过控制高低电平的时间,来对输出的波形进行控制。
其中有几个重要的参数
- 频率:周期分之一
- 占空比:高电平在整个周期内所占的时间,即高电平和周期时间的比值
- 精度:占空比变化的步距。应该可以这样理解:最小占空比/周期=精度;
假设精度是1%,则最小占空比是1%,将周期分为100份,其中1份为高电平,99份为低电平,即周期为1秒的PWM,
0.01秒是高电平,0.99秒为低电平;
精度越高,PWM产生的某种效果就越好,例:PWM信号RC滤波转电压,若精度是1%,则可以使产生的电压达到1%的精度。
二、产生PWM的方法
就是通过定时器定时自增,设置一个比较值,然后通过判断计数器和比较值的大小,输出对应的高低电平。因此,也叫定时器的输出比较功能。
波形详解,就比如第一个周期内,小于比较值60的部分输出的是低电平,大于比较值60的部分输出高电平。两图的波形等效,PWM波形就这样产生了,控制不同的高低电平存在的时间,然后输出。
使用定时器产生一个恒定的周期
这里没有限制使用什么定时器,当使用多个定时器的时候,一定要注意不同定时器中断和外部中断的优先级,因为如果不同定时器的中断优先级不相同,就有可能一个优先级较高的定时器中断打破了当前定时器产生的中断。使当前中断失效。下方为中断优先级以及使用C语言编程使用到的中断号。
void Timer0_Init(void) //100微秒
{
TMOD &= 0xF0; //设置定时器模式
TMOD |= 0x01; //设置定时器模式
// TMOD = 0X01;
TL0 = 0x9C; //设置定时初值
TH0 = 0xFF; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
EA = 1;
ET0 = 1;
PT0 = 0;
}
void Timer0_Routine() interrupt 1
{
unsigned int counter = 0;
TL0 = 0x9C; //设置定时初值
TH0 = 0xFF; //设置定时初值
counter++;
if(counter == 100)
{
counter = 0;
}
}
TMOD是一个不能位寻址的寄存器,所以用此种方法赋值。 TMOD&=0x0f的意思是:TMOD=(TMOD&0x0f),&与运算的作用是“有0得0”,则这条语句,让TMOD高四位清零,并保存低四位不变化。 TMOD|=0x01的意思是:TMOD=(TMOD|0x01),|或运算的作用是“有1得1”,则这条语句,让TMOD低四位其它位不变,选择定时器0工作方式为方式1,即16位定时器。