基于编码器电机测量转速及转角课程设计Word文档下载推荐.docx
《基于编码器电机测量转速及转角课程设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《基于编码器电机测量转速及转角课程设计Word文档下载推荐.docx(10页珍藏版)》请在冰豆网上搜索。
处理器——————89C52
显示设备———————LCM1602
编码器————————欧姆龙H38S6-2000-3-2-24
电机——————————GM12F-N20VA08260/298-R
要求:
利用C语言设计,基于单片机实现简易的电机转速和转角测量。
当电机转动时能够实时的显示转角和转速,转角要求有正负(以初始位置为0度)。
当电机停止转动时,用手拧动编码器的轴也可实现转角测量。
日程安排:
12月19---12月20,查阅资料,确定课设题目
12月23---12月26,进行电机测转速的编程及仿真工作。
12月27---12月31,进行电机测角度的编程及仿真工作。
1月2,老师进行检查
1月3----1月7日,进行最后的补充与修改及写报告
摘要。
。
3
一、总体方案。
4
1.方案一。
2.方案二。
3.方案选择。
二、编码器介绍。
5
1.编码器原理。
2.编码器选型。
三、编码器测量电机转速。
6
1.原理介绍。
2.程序框图。
3.编程实现。
4.改错心得。
7
四、编码器测量电机转角。
9
10
五、实验检测。
11
1.实验描述。
2.实验结果。
六、总结。
摘要
本文介绍了基于89C52单片机的测量电机转速和转角的系统,概述了编码器的工作原理和应用,详细阐述了测速及测转角的基本原理、实现的步骤和软硬件的设计,采用C语言编程,用1602液晶屏显示数据,结果表明该方法具有简单、精度高、稳定性好的优点。
关键词:
89C52单片机测速测转角编码器电机
一、整体方案
1.方案一
采用红外光电对管数据采集电路,红外对管根据电机转动时开口遮光片的位置,每转一圈输送几个低脉冲实现转速及转角的测量。
2.方案二
采用编码器采集信号,将编码器的轴与电机的轴通过联轴器固定,电机带动编码器转动,同时想单片机发出信号,经过单片机处理测出转速及转角。
3.方案选择
采用编码器测量系统具有低惯性、低噪声、高分辨率和高精度的优点,光栅的成功应用使编码器在检测和控制领域得到了广泛的应用。
选择编码器做传感器使得系统拥有测量准确度高、采样速度快、测量范围宽和测量精度与被测速度无关等优点。
所以选择方案二。
二、编码器介绍
1.编码器原理
编码器是将信号或数据进行编制、转换为可用以通讯、传输和存储的信号形式的设备。
编码器把角位移或直线位移转换成电信号。
按照读出方式编码器可以分为接触式和非接触式两种;
按照工作原理编码器可分为增量式和绝对式两类。
增量式编码器是将位移转换成周期性的电信号,再把这个电信号转变成计数脉冲,用脉冲的个数表示位移的大小。
绝对式编码器的每一个位置对应一个确定的数字码,因此它的示值只与测量的起始和终止位置有关,而与测量的中间过程无关。
现在编码器的厂家生产的系列都很全,一般都是专用的,如电梯专用型编码器、机床专用编码器、伺服电机专用型编码器等,并且编码器都是智能型的,有各种并行接口可以与其它设备通讯。
编码器由一个中心有轴的光电码盘,其上有环形通、暗的刻线,有光电发射和接收器件读取,获得四组正弦波信号组合成A、B、C、D,每个正弦波相差90度相位差,将C、D信号反向,叠加在A、B两相上,可增强稳定信号;
另每转输出一个Z相脉冲以代表零位参考位。
优点:
体积小,精密,本身分辨度可以很高,无接触无磨损;
同一品种既可检测角度位移,又可在机械转换装置帮助下检测直线位移;
多圈光电绝对编码器可以检测相当长量程的直线位移(如25位多圈)。
寿命长,安装随意,接口形式丰富,价格合理。
成熟技术,多年前已在国内外得到广泛应用。
缺点:
精密但对户外及恶劣环境下使用提出较高的保护要求;
量测直线位移需依赖机械装置转换,需消除机械间隙带来的误差;
检测轨道运行物体难以克服滑差。
2.编码器选型
选型的三个要素是机械安装尺寸,分辨率和电气接口。
我选用了欧姆龙H38S6-2000-3-2-24这款编码器。
外径38mm,止口20mm,轴径6mm,电缆侧出,标准配线2米。
尺寸符合标准。
选用2000转的高分辨率,完全可以测角度,单片机也可计算。
集电极开路是常用的一般电路选择。
图2.2
三、采用编码器测量电机转速
1.原理介绍
利用编码器的Z轴每当转一圈会发一个脉冲,将Z轴信号接到外部中断0引脚,每当有下降沿信号则使变量加1。
同时采用定时器中断,每隔一秒查看变量增加的个数,即可算出每秒转过的圈数。
再把这个转速送给显示函数,用数码管显示出来。
2.程序框图否
是
是否
图3.2
3.编程实现
首先要在初始化函数里打开定时器0中断和外部0中断,并且给定时器设定初始值,由于目标为定时1秒大于65535,可以实行定时50ms,然后在定时器中断服务程序里设一个变量,每进一次中断变量加一,加到20次,即时间过1秒后,查看变量y,把y的值赋予给转速v,并且使y=0,意义为每秒重新计数。
外部中断0要设置成下降沿中断,服务程序为y++,即每转一圈变量加一。
voidquanshu()interrupt0//外部中断0计C相脉冲数
{
y++;
}
voidzhuansu()interrupt1//定时器0中断每隔1秒查一次转过的圈数
{
TR0=0;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==20)
v=y;
y=0;
count=0;
}
TR0=1;
4.改错及心得
进行测量时出现误差,并且转速值不稳定。
原因有两个:
第一个是使用过多的外部中断占用了CPU过多的时间,使一些信号采集不准确,导致误差。
第二个是Z轴信号本身的缺陷,只有到一个固定位置时才会发一个脉冲信号,使得无法实时的计算速度,即如果1s内没转够1圈,无论速度多快或多慢,系统就认为速度是零。
经过重新思考,决定不用Z轴做采集信号,而是用A轴。
这样做既减少了一个中断处理,又避免了误差,大大提高了系统的稳定性与实时性。
根据这样的思路更改程序框图如下:
否
图3.4
当然程序也要做相应的改变。
首先把外部中断0全部关断,在外部中断1中加一句话y++;
,由于转速的定义为每秒转的圈数,我每0.5秒查看一次y的数值,转换公式为v=y/(2000*0.5),即v=y*0.001,因为显示方便,这里使v=y*0.01,然后把个位赋值给小数点后一位,把十位赋值给个位就可以正确显示了,更改后的程序如下:
voidjiaodu()interrupt2//外部中断1计A相脉冲数
voidzhuansu()interrupt1//定时器0中断每隔0.5秒查一次A转过的脉冲数
if(count==10)
v=y*0.01;
//转速换算
经过如此的更改就解决了之前的问题,显示非常稳定,误差也减小了很多。
再给51系列单片机编程时应尽量的减少中断的使用,尤其是输入信号频率高,要求精度高,硬件设备质量低的情况。
最好是根据有用信号,即用最少的输入信号得到最多的有用信息,通过编程减少外部设备,这样做不仅能够有效的减少误差,还可以节约资源。
四、采用编码器测量电机转角
1.原理介绍
利用编码器的A轴和B轴来判断正反转和角度。
这里的正反是以开机时电机的初始位置为标准的。
正反转的判别方法:
因为A和B相差90度,假设正转时A超前B90度,则反转时B超前A90度,利用这一特点可以判断正反。
把A接到外部中断1,B接到P0^0口,当进入中断时,判断B轴是高电平还是低电平就可以判断正反了。
角度的计算方法:
电机转一圈是360度,编码器转一圈发出2000个矩形波,有这个关系就可以计算角度,即角度=计数个数*360、2000.
2.程序框图
否
是否
图4.2
3.编程实现
首先在初始化函数里要打开外部中断1,并且设置成下降沿触发。
但A轴有信号来临时,进入到外部中断1服务程序,先判断P0^0口的高低电平,若为高电平,则计数变量加一,反之,计数变量减一。
如果计数变量X大于2000或小于-2000,则使X等于0.这样做减轻了变换角度的计算量,使系统认为编码器一直在正一周或负一周之内活动。
接下来就可以将计数变量通过公式转换成角度显示了。
显示正负角则可以判断计数变量的正负来确定。
if(d1==1)
x++;
else
x--;
if((x>
2000)||(x<
(-2000)))
x=0;
uintjiaodujisuan()//角度计算
{uintj;
if(x<
0)
{
wela=1;
//显示角度符号位
P0=0xfb;
wela=0;
dula=1;
P0=0x40;
dula=0;
delay(3);
}
j=fabs(x);
j=j*0.18;
//角度转换公式
returnj;
4.改错及心得
开始没有设置计数变量的上下限,使测量角度大于360度,改正后效果正确。
开始角度转换公式为X=X*360/2000,结果显示不正确,后来改为X=X*0.18,显示正确。
这段程序很考察细节,一个注意不到的地方有可能使程序出错。
五、试验检测
1.实验过程
把编码器与直流电机用联轴器固定在一起,通过改变只直流电压改变直流电机的转速,观察数码管显示的变化。
停止直流电机,用手拧动编码器,可方便观察转角的变化。
2.实验结果
系统可以实时的显示电机的转速及转角。
六、总结
这次课程设计让我学到了很多。
对于编码器与电机的应用又多了一层的认识,在编程上也有了大大的提高,对单片机的理解,尤其是对中断的处理加深了认识。
在实验过程中,我曾经出现了很多次错误,大多数都是很细节的东西,这时就需要耐心与分析问题的能力来一次次的解决,也正是因为无数次的改正错误才使最后的程序调试成功。