51/AVR单片机技术驿站!  <在线翻译>     便利工具    特色网址   无弹窗、无插件的绿色站点...  英才招聘   学历查询  喜欢>>收藏我站 

当前位置:首页 > 单片机技术文章 > 51单片机 > 详细内容
基于单片机软件实现直流电机PWM以及电机测速
作者:叶祥祥  发布时间:2009/10/14  阅读次数:2729  字体大小: 【】 【】【

一、摘要

利用AT89C51设计一个直流电机的软件模拟PWM驱动及测速系统。单片机读取键盘值来设定转速和正反转,并且通过红外对管来测量转速。本系统具有精度高,成本低,使用方便等优点。
关键词:AT89C51;PWM;测速。
引言
随着社会的发展,各种智能化的产品日益走入寻常百姓家。为了实现产品的便携性、 低成品以及对电源的限制,小型直流电机应用相当广泛。对直流电机的速度调节,我们可以采用多种办法,本文给出一种用单片机软件实现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)
92: T0_count++ ;
C:0x0269 050C INC T0_count(0x0C)
93: }
显然在进入中断后首先要进行ACC和PSW压栈,这里需要4个机器周期。接着要判断是否temp==1,用到JNB指令需要2个机器周期。另外还有两个MOV指令。把这些时间算进去后,精度就会比较高。估计在4000hz情况下测到的是4006hz左右,这里的误差可能是中断响应需要一定时间,可以通过加上7、8个机器周期来修正。最后能得到4000hz以内误差只在1hz。

六、结论
本系统实现了直流电机的转速、方向的设定和转速的测量,而且测速精度非常高。
参考文献
1、古欣 朱岩 王智涌 喻巧群 原瑞花,自动寻迹小车
2、http://blog.163.com/dodo_1863@126/blog/static/115058766200931515547335/等
  
来源:温州大学物理与电子信息学院
我要评论
  • 匿名发表
  • [添加到收藏夹]
  • 发表评论:(匿名发表无需登录,已登录用户可直接发表。) 登录状态:未登录
最新评论
所有评论[0]
    暂无已审核评论!

网站导航 管理登陆 ┊ 免责声明 问题反馈  友链说明
本站部分内容来自网络共享资源,如有冒犯您的权利请来信告之删除或纠正!
不得对本站进行复制、盗链或镜像,转载内容须获得同意或授权;欢迎友情链接、站务合作!

    我要报警 Alexa
 mcusy_cn#126.com (请把#改成@) 交流:522422171
本站学习交流群:138..158(高级群1-)、77930286(高级群2)、61804809(群3)
Copyright© MCUSY All Rights Reserved
本站网警备案号: WZ36040002485
  ICP备案证书号:粤ICP备09034963号