直流电机驱动(PWM)
直流电机介绍
直流电机是一种将电能转换为机械能的装置。一般的直流电机有两个电极,当电极正接时,电机正转,当电极反接时,电机反转,直流电机主要由永磁体(定子)、线圈(转子)和换向器组成,除直流电机外,常见的电机还有步进电机、舵机、无刷电机、空心杯电机等
PWM介绍
PWM(Pulse Width Modulation)即脉冲宽度调制,在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速、开关电源等领域。因为利用的是数字信号的宽度变量,而不是模拟信号的宽度变量,因此对于单片机之类的物品而言,更容易产生对应宽度变量来控制。
PWM重要参数:
频率 = 1 / TS
占空比 = TON / TS
精度 = 占空比变化步距
频率越高,电平变化越快,越能等效出连续的模拟信号曲线。(如果频率较低,应用于电机控制时,会导致电机运行断断续续——因为电平是0跟1之间变化)
占空比指的是在一个频率段(一个高电平加一个低电平)中,高(低)电平所用的时间占据总频率段时间的百分比;
也可用TON:TOFF来进行表示(但是不常用,因为这种表示的是比值,没有百分比直观)
精度指的是相邻占空比的变化步距。举个例子来讲,第一个占空比为1%,第二个为2%,第三个为3%,那么其精度就为1%;而即第一个占空比为0.1%,第二个为0.2%,第三个为0.3%,那么其精度为0.1%;但是,前者的精度没有后者高,精度越高,占空比调节越细致。
在电机所在电路直接接一个电位器进行调速是不可行的,因为电机运行时,电位器只能接入几欧的电阻,而电位器为纯电阻电路部件,因此全部电能转化为热能,最终会导致电位器烧坏,但是电机不会烧坏,因为它是非纯电阻。为了让电机的速度得以调控或更好地保护电路,我们可以利用PWM控制电机的导通,利用1ms通电,1ms断开的思路,来进行操作电机。
代码
呼吸灯代码
#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;
Delay(Time);
LED=1;
Delay(100-Time);
}
}
for(Time=100;Time>0;Time--)
{
for(i=0;i<20;i++)
{
LED=0;
Delay(Time);
LED=1;
Delay(100-Time);
}
}
}
}
直流电机调速代码
#include <REGX52.H>
#include "Key.h"
#include "Delay.h"
#include "Nixie.h"
#include "Timer0.h"
sbit Motor=P1^0;
unsigned char Counter,Compare;
unsigned char KeyNum,Speed;
void main()
{
Timer0_Init();
Compare=5;
while(1)
{
KeyNum=Key();
if(KeyNum==1)
{
Speed++;
Speed%=4;
if(Speed==0){Compare=0;} //电机速度的调节
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;
if(Counter<Compare)
{
Motor=1;
}
else
{
Motor=0;
}
}