前言
51单片机我已经很久没用过了,毕竟是十年前的产物了,但是由于工作室的学弟学妹需要学习,加之马上就要举行循迹小车比赛,很多人反映看不懂PWM,或者看了不会用,于是写一篇文章简单介绍一下。
PWM普遍应用于惯性系统,我们知道单片机几乎只能输出“1”和“0”两种状态,即开和关,想要输出模拟量是不太容易实现的,那么怎样才能使单片机输出平滑的线性信号呢?没接触过PWM的小伙伴可能第一时间想到的就是高中时学过的电位器(也就是滑动变阻器),利用欧姆定律调整阻值而改变电流,但这种方法精度低,效率低,功耗高,故障率也高,于是聪明的人们发明出了PWM,它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中,如呼吸灯,电机控速、开关电源等(顺嘴一提,来工作室那条路上的灯,走近就缓缓变亮,也运用到了这种技术)。
一、PWM的介绍
PWM(Pulse Width Modulation)即脉冲宽度调制,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量。
何为脉冲宽度调制?比如说,我们先输出1ms的高电平,再输出1ms的低电平以此快速进行输出(即周期时间为2ms,占空比则为50%),那么这段电信号并没有以全程高电平的状态输出,也没有以全程低电平的状态输出,而是以稳定的中间电平状态输出。再比方说周期的时间是10ms,脉宽时间是8ms 那么低电平时间就是2ms 总的占空比 8/(8+2)= 80%(高电平时间 / 周期时间=占比),就会以80%总电流的强度输出。根据这个就可以控制电机的速度或LED灯的亮度。
但是值得一提的是,这种调制方法只适用于惯性系统,例如电机的转动,当从高电平跳变到低电平时,电机不会马上停止转动,而是靠着惯性继续旋转。LED灯则是根据人眼的视觉暂留效果,当它熄灭的一瞬间会留有余晖,连当频率很快的时候,LED灯的亮暗过度就会看上去很自然,所以周期过长,就会出现肉眼可见的闪烁。
pwm的频率:
是指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期);
也就是说一秒钟PWM有多少个周期
单位: Hz
表示方式: 50Hz 100Hz
pwm的占空比:
是一个脉冲周期内,高电平的时间与整个周期时间的比例
单位: %取值范围:(0%-100%)
pwm的周期:
即:一个脉冲信号的时间 1s内测周期次数等于频率
T=1/f
周期=1/频率
50Hz = 20ms 一个周期如果频率为50Hz ,也就是说一个周期是20ms 那么一秒钟就有 50次PWM周期
pwm的脉宽时间:高电平时间
二、 如何在定时器中配置PWM
高级的MCU都有配备相应的PWM功能的,可见PWM这一技术的应用还是偏多的,而8051系列单片机没有配备这一功能,我们需要采用定时器中断的方法来生成。用定时器输出一段连续变化的方波,由于方波的占空比不同输出的电流也不相同,这样就可以模拟出稳定变化的电信号。
简单来说,PWM就是一个DA转换,通过产生数字信号模拟输出了模拟信号。
PWM实现的原理是通过锯齿波/三角波(上图)所需要合成的波形(下图)进行比较,然后确定PWM所需要输出的电平,锯齿波输入,将5V作为参考电压,给比较器同相参考电压输出0~10V的锯齿波,当锯齿波电压小于参考电压则输出低电平,而当锯齿波大于参考电压时比较器输出高电平。
举一反三,如何产生一个不同占空比的PWM:
当我们从反相端接锯齿波,大于参考电压输出为0,而小于参考电压为1,通过改变参考电压的值,从而产生了不同占空比的信号。
将PWM转换为正弦波:
三、代码
下边是通过延时的方法,实现LED的亮暗变换实现呼吸灯的代码
其中,100ms为一个周期,在第一个for循环中,Time为高电平,100-Time为低电平,同时Time的值还会变化,也就对应上了上图产生不同占空比的PWM,占空比不一样,电流输出强度也就不一样,灯的亮度自然也不一样,于是就产生了呼吸灯的效果。
使用PWM对电机的控制这里我仅给出部分代码,大家C语言都学的那么好,相信都能看懂。
这是我上学期循迹小车的部分代码
这两个代码其实大差不差
说白了,PWM就是设置一个恒定的周期内,通过设置计时数和设置的比较值的大小,是在计时数比比较值小置高低电平,则要依据自己的需求来进行设置。
同时,由于单片机PWM信号强度弱,所以一般不直接接在负载上,而是通过驱动电路控制负载。
如L298N、TB6612。
四、结语
上图的正弦波形只是在理想状态下的,也就是说,PWM的占空比和电机的转速其实并不完全成正比,随着学习的知识越来越多,就会了解到一个叫PID算法的东西(现在不需要了解,就你们做的小车用不了PID),PID算法会用到闭环调节,也就是根据当前误差、误差积分和误差变化率的信息,计算出一个控制量,用于调节输出,以使系统的实际值与期望值尽可能接近。PID控制适用于需要精确控制和稳定性的应用,通过根据实际值与期望值的误差来进行调整,以使系统保持在期望状态。也就是说他具有自适应能力,可以根据实际情况动态调整控制参数。它可以在稳定状态下快速响应,并且能够抵抗外部扰动和系统变化。