单片机对直流电机的调速控制电路
刘新阳李静晶摘要:
脉宽调制(PWM)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
在所设计的这个电路中,用PWM对直流电机转速做精确控制。
电路中用到的电机驱动芯片L298N是SGS公司的产品,内部包含4通道逻辑驱动电路,是一种二相和四相电机的专用驱动器,即内含二个H桥的高电压大电流双全桥式驱动器,接收标准TTL逻辑电平信号,可驱动46V、2A以下的电机。
关键字:
PWM 单片机L298 直流电机
一、引言
提到电机转速控制一般大家都会想到调节电机的供电电压,但调节电压会使电机的转矩发生很大的变化。
在实际生活中,很多时候我们希望能在电机转速得到控制的前提下保持电机的转矩,怎样克服这个问题呢,在查询了很多资料和进行了大量实验后我认为使用电机的PWM控制可以很好的解决这一问题。
二、设计原理
在电机控制中我采用了脉宽调制PWM,脉宽宽度调制式(PWM)开关型稳压电路是在控制电路输出频率不变的情况下,通过电压反馈调整其占空比,从而达到稳定输出电压的目的。
模拟信号的值可以连续变化,其时间和幅度的分辨率都没有限制。
9V电池本身就是一种模拟器件,因为它的输出电压并不精确地等于9V,而是随时间发生变化,并可取任何实数值。
与此类似,从电池吸收的电流也不限定在一组
可能的取值范围之内。
而模拟信号与数字信号的区别在于后者的取值通常只能属于预先确定的可能取值集合之内,例如在{0V, 5V}这一集合中取值。
尽管模拟控制看起来可能直观而简单,但它并不总是非常经济或可行的。
其中一点就是,模拟电路容易随时间漂移,因而难以调节。
能够解决这个问题的精密模拟电路可能非常庞大、笨重(如老式的家庭立体声设备)和昂贵。
模拟电路还有可能严重发热,其功耗相对于工作元件两端电压与电流的乘积成正比。
模拟电路还可能对噪声很敏感,任何扰动或噪声都肯定会改变电流值的大小。
通过以数字方式控制模拟电路,可以大幅度降低系统的成本和功耗。
简而言之,PWM是一种对模拟信号电平进行数字编码的方法。
通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。
PWM信号仍然是数字的,因为在给定的任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。
电压或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去的。
通的时候即是直流供电被加到负载上的时候,断的时候即是供电被断开的时候。
只要带宽足够,任何模拟值都可以使用PWM进行编码。
例如使用9V电池来给一个白炽灯泡供电。
如果将连接电池和灯泡的开关闭合50ms,灯泡在这段时间中将得到9V供电。
如果在下一个50ms中将开关断开,灯泡得到的供电将为0V。
如果在1秒钟内将此过程重复10次,灯泡将会点亮并像连接到了一个4.5V电池(9V的50%)上一样。
这种情况下,占空比为50%。
这样利用PWM对电机的控制,就可以在不改变电机转矩前提下对电机进行调速控制了。
三、电路
电路中用到的单片机和电机驱动芯片L298N都用到5V电源,而电机使用的是12V电压,所以我用7805做稳压芯片,如图1。
输入端和输出端的电容起到去耦作用。
图1
直流电机控制采用高性能单片机AT89S52输出可调占空比的PWM方波。
电机驱动芯片为L298N。
直流电机驱动就是利用PWM脉宽控制L298N电流输出大小。
其电路图如图2所示。
图2
图中单片机使用12MHZ晶振,P1.1产生PWM信号,P1.0和P1.2分别产生高低电位控制电机旋转方向。
电机驱动芯片L298N其实就是一个全桥驱动电路。
如图3所示。
它接收的是PWM方波,输出为跟PWM方波占空比相同的外接电压方波。
图3
接线中容易出错的事是L298的15脚和1脚没有接地,这样导致电流不能流向地,电机不转。
芯片的第1、5、6、7引脚控制一个桥,5、7接入高低电平控制电机旋转方向,6号引脚为使能端它接收单片机传来的PWM信号,它们控制的电机由2、3号引脚输出。
10、11、12、15和13、14引脚控制另外的一个桥。
图4为L298N的内部电路。
图4
四、程序
#include <reg51.h>
#include <stdio.h> //PWM调制
#include <math.h>
sbit P10=P1^0; //端口设置
sbit P11=P1^1;
sbit P12=P1^2;
unsigned int j;
void delay (unsigned int m) //延时m*1/31ms子程序{ unsigned int r;
for (;m>0;m--)
{ for (r=0;r<4;r++)
{ ; }
}
}
//主程序
void main (void)
{ void OutputPWM( );
P10=1;
P12=0;
//电机正转
for(j=0;j<32;j++)//输出连续变化的PWM信号,占空比从0开始每秒增加1/31 { OutputPWM ( ); //输出PWM
delay (31000); //延时1S
};
P10=1;
P12=1; //快速停止
delay (3100); //延时0.1S
P10=0;
P12=1;
//电机反转
for (j=10;j<32;j++)//输出连续变化的PWM信号,占空比从0开始每秒增加1/31 { OutputPWM ( ); //输出PWM
delay (31000); //延时1S
};
P10=1;
P12=1; //快速停止
delay (3100); //延时0.1S
}
void OutputPWM (void)
{ P11=0;
delay (31-j);
P11=1;
delay (j);
}
五、实验
PWM调速,试验中是开环的,没有检测装置。
这种其实是没有使用价值的。
PWM的占空比与速度完全不成线性关系。
不要期望精确调速,而且有很大一段PWM死区,即电机不动,这是平均电压没有达到直流电机的启动电压的原因。
PWM波从0-31,满电压为12V,占空比一直到12都不转。
过了12以后非线性非常非常严重。
几乎到21就升到12V再改变也没有意义了。
估计有什么问题。
注意一个很重要的问题,电路中5V和12V一定要共地。
如果不共地,芯片将会无法正常工作。
图5。