基于51单片机直流电机驱动论文

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于51单片机的直流电机驱动

中图分类号:tp 文献标识码:a 文章编号:1007-0745(2011)10-0052-02

摘要:利用at89c51设计一个直流电机的软件模拟pwm驱动及测速系统。单片机读取键盘值来设定转速和正反转,并且通过红外对管来测量转速。本系统具有精度高,成本低,使用方便等优点。

关键词:at89c51pwm测速

引言

随着社会的发展,各种智能化的产品日益走入寻常百姓家。为了实现产品的便携性、低成品以及对电源的限制,小型直流电机应用相当广泛。对直流电机的速度调节,我们可以采用多种办法,本文给出一种用单片机软件实现pwm调速的方法及红外对管测转速。

一、直流电机调速

知道通过调节直流电机的电压可以改变电机的转速,但是一般我们设计的电源大都是固定的电压,而且模拟可调电源不易于单片机控制,数字可调电源设计麻烦。所以这里用脉宽调制(pwm)来实现调速。方波的有效电压跟电压幅值和占空比有关,我们可以通过站空比实现改变有效电压。一般用软件模拟pwm可以有延时和定时两种方法,延时方法占用大量的cpu,所以这里采用定时方法。

二、直流电机旋转方向

一般利用h桥电路来实现调速。h桥驱动电路:图4.12中所示为一个典型的直流电机控制电路。电路得名于“h桥驱动电路”是

因为它的形状酷似字母h。4个三极管组成h的4条垂直腿,而电机就是h中的横杠(注意:图4.12及随后的两个图都只是示意图,而不是完整的电路图,其中三极管的驱动电路没有画出来)。

如图所示,h桥式电机驱动电路包括4个三极管和一个电机。要使电机运转,必须导通对角线上的一对三极管。根据不同三极管对的导通情况,电流可能会从左至右或从右至左流过电机,从而控制电机的转向。

图4.12 h桥驱动电路

要使电机运转,必须使对角线上的一对三极管导通。例如,如图4.13所示,当q1管和q4管导通时,电流就从电源正极经q1从左至右穿过电机,然后再经q4回到电源负极。按图中电流箭头所示,该流向的电流将驱动电机顺时针转动。当三极管q1和q4导通时,电流将从左至右流过电机,从而驱动电机按特定方向转动(电机周围的箭头指示为顺时针方向)。

图4.13 h桥电路驱动电机顺时针转动

图4.14所示为另一对三极管q2和q3导通的情况,电流将从右至左流过电机。当三极管q2和q3导通时,电流将从右至左流过电机,从而驱动电机沿另一方向转动(电机周围的箭头表示为逆时针方向)。

图4.14 h桥驱动电机逆时针转动

可以把q1跟q4接在一起,q3跟q2接在一起,这样只要两个单片机i/o口就行。下面的程序中lun1、lun2就表单片机的两个i/o

口。这个桥式电路图只用来说明原理,实际应用还要看电机的额定电压、电流。也可以用l293、l298直流的集成芯片。

三、pwm程序

void timer0() interrupt 1

{

if(temp)

{th0=time_h_0;tl0=time_l_0;//设置低电平时间temp=0;

}

else

{

th0=time_h_1;

tl0=time_l_1;//设置高电平时间,可以通过键盘设定来达到调速功能。

temp=1;

t0_count++ ;//作测速定时用

}//这样定时在两个时间里变化起到类似两个定时器的作用

// qianjin从键盘读取

if(qianjin==1) //正转

{

lun1=temp;

lun2=1;//低电平有效}

else if(qianjin==2)//反转

{

lun1=1;

lun2=temp;

}

else if(qianjin==3) //停止

{

lun1=1;

lun2=1;

}

}

这样就可以实现直流电机正反转和调速。当然键盘程序比较简单,篇幅所限,不详细给出

四、测速

通过红外对管来测量轮子转速,电路图如下:

测速可以分3种:测频法、测周法和测频侧周混合法。这里我只介绍测频法,因为已经用了一个定时器,可以在这个定时器基础上设定时间,程序中t0_count就是时间变量。若要用侧周法,会有一个误差,主要来自定时器的误差。

时间定了后接下来要测脉冲数,可以用计数器或者外部中断,采用计数器比较方便。程序

if(t0_count>=125)

{

tr1 =0; //关闭计数器

t0_count =0;

int_h =th1; //t1计数缓冲单元

int_l =tl1;

th1 =0; //清计数器

tl1 =0;

t1_count =0;

tr1 =1; //开启计数器

}

// time1中断服务函数

// 对t1溢出产生中断的次数进行计数

// 计满65535,产生一次溢出中断

void timer1() interrupt 3

{

//因为电机转速实际测量中电机转速并不超过65536的计数,所以不会进入中断。不然可以

//用一个变量来计数

}

显然转速=(int_h*256+ int_l)/ 125*pwm脉冲周期。

这里有一个误差需要修正,因为进入定时中断需要进行进行压栈等工作所以会有一定误差。摘取进入定时器中断的反汇编程序:78: void timer0() interrupt 1

79: {

80:

c:0x0250 c0e0 push acc(0xe0)

c:0x0252 c0d0 push psw(0xd0)

81: if(temp) c:0x0254 30.000a jnb temp(0x20.0), c:0261

82: {

83: th0=time_h_0;

c:0x0257 85088c mov th0(0x8c),time_h_0(0x08) 84: tl0=time_l_0;

c:0x025a 850a8a mov tl0(0x8a),time_l_0(0x0a) 85: temp=0;

c:0x025d c200 clr temp(0x20.0)

86:}

87: else c:0x025f 800a sjmp c:026b

88: {

89: th0=time_h_1;

c:0x0261 85098c mov th0(0x8c),time_h_1(0x09) 90: tl0=time_l_1;

c:0x0264 850b8a mov tl0(0x8a),time_l_1(0x0b) 91: temp=1;

c:0x0267 d200 setb temp(0x20.0)

相关文档
最新文档