本节进入到一个更加常用的环节PWM的产生与应用,日常生活中,电机的使用非常普及,如何控制转速?其实就可以应用我的PWM。
一、PWM的产生原理
PWM(Pulse Width Modulation)即脉冲宽度调制,在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速、开关电源等领域。
我们在研究PWM的时候需要关注一下几个大的方面:1、频率:这个决定了电机的连贯性,因为,PWM调速的本质其实就是在一个周期之内,运行一部分时间,剩下时间不运行,借助运动的惯性保持一致运转的状态,所以如果频率太低就会卡顿;2、占空比:在一个周期里,占空比越大,代表运行时间更长,所以转速会更快;3、精度:精度其实就是占空比的最小值,越小代表越准确;
那么PWM的产生原理是什么呢?其实就是设置一个标定值,然后利用定时器自增小于输出0,大于输出一。
二、使用PWM实现电机调速
#include <REGX52.H>
#include "Delay.h"
#include "Key.h"
#include "Nixie.h"
#include "Timer0.h"
sbit Motor=P1^0;
unsigned char Counter,Compare; //计数值和比较值,用于输出PWM
unsigned char KeyNum,Speed;
void main()
{
Timer0_Init();
while(1)
{
KeyNum=Key();
if(KeyNum==1)
{
Speed++;
Speed%=4;
if(Speed==0){Compare=0;} //设置比较值,改变PWM占空比
if(Speed==1){Compare=50;}
if(Speed==2){Compare=75;}
if(Speed==3){Compare=100;}
}
Nixie(1,Speed);
}
}
void Timer0_Routine() interrupt 1
{
TL0 = 0x9C; //设置定时初值
TH0 = 0xFF; //设置定时初值
Counter++;
Counter%=100; //计数值变化范围限制在0~99
if(Counter<Compare) //计数值小于比较值
{
Motor=1; //输出1
}
else //计数值大于比较值
{
Motor=0; //输出0
}
}
我们先看中断处理,每次进入中断,先重装计数器初值,随后对计数变量Counter加一,随后讲计数变量和用户设定的变量Compare对比,决定端口的输出。
在我们的大循环中,每按一下按键一,速度提升一档,占空比从0-50%-75%-100%变化。
数码管Nixie,独立键盘Key都是之前讲过的,可以回去看。
三、利用PWM思想实现呼吸灯效果
#include <REGX52.H>
sbit LED=P2^0;
void Delay(unsigned int t)
{
while(t--);
}
void main()
{
unsigned char Time,i;
while(1)
{
for(Time=0;Time<100;Time++) //改变亮灭时间,由暗到亮
{
for(i=0;i<20;i++) //计次延时
{
LED=0; //LED亮
Delay(Time); //延时Time
LED=1; //LED灭
Delay(100-Time); //延时100-Time
}
}
for(Time=100;Time>0;Time--) //改变亮灭时间,由亮到暗
{
for(i=0;i<20;i++) //计次延时
{
LED=0; //LED亮
Delay(Time); //延时Time
LED=1; //LED灭
Delay(100-Time); //延时100-Time
}
}
}
}
呼吸灯的原理和电机调速一样,亮一段时间,暗一段时间。亮的越久,视觉上的亮度越高。
我们的函数的思想就是,每次循环亮的占比从0%升高到100%,然后再从100%降到0%结束。
标签:11,Compare,include,C51,unsigned,---,占空比,PWM,Speed From: https://blog.csdn.net/SPIRITE_SYF/article/details/139479919