资源描述
课程设计报告
课程名称: 专业课课程设计II
课设题目: 简易测量电机转速和转角装置
专业班级: 电子信息工程1001
姓 名: 郭阳 学 号: 100402124
课设时间: 2013.12 批阅时间:
指导教师: 桂珺 成 绩:
13
任务书
题目:简易测量电机转速和转角装置
参数:
处理器——————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. 方案一。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。4
2. 方案二。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。4
3. 方案选择。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。4
二、 编码器介绍。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。5
1. 编码器原理。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。5
2. 编码器选型。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。5
三、 编码器测量电机转速。。。。。。。。。。。。。。。。。。。。。。。。。。。6
1. 原理介绍。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。6
2. 程序框图。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。6
3. 编程实现。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。6
4. 改错心得。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。7
四、 编码器测量电机转角。。。。。。。。。。。。。。。。。。。。。。。。。。9
1.原理介绍。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。9
2.程序框图。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。9
3.编程实现。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。9
4.改错心得。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。10
五、 实验检测。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。11
1. 实验描述。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。11
2. 实验结果。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。11
六、 总结。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。11
简易测量电机转速和转角装置
摘要
本文介绍了基于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. 程序框图 否
是否进入外部中断
开始
是
y++
时间是否过了1s
V=y;y=0;
显示函数
是 否
图3.2
3. 编程实现
首先要在初始化函数里打开定时器0中断和外部0中断,并且给定时器设定初始值,由于目标为定时1秒大于65535,可以实行定时50ms,然后在定时器中断服务程序里设一个变量,每进一次中断变量加一,加到20次,即时间过1秒后,查看变量y,把y的值赋予给转速v,并且使y=0,意义为每秒重新计数。外部中断0要设置成下降沿中断,服务程序为y++,即每转一圈变量加一。
void quanshu() interrupt 0 // 外部中断 0 计C相脉冲数
{
y++;
}
void zhuansu() interrupt 1 //定时器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轴。这样做既减少了一个中断处理,又避免了误差,大大提高了系统的稳定性与实时性。根据这样的思路更改程序框图如下:
否
是否进入外部中断1
开始
是
y++
时间是否过了0.5s
V=y*0.01;y=0;
显示函数
是 否
图3.4
当然程序也要做相应的改变。首先把外部中断0全部关断,在外部中断1中加一句话y++;,由于转速的定义为每秒转的圈数,我每0.5秒查看一次y的数值,转换公式为v=y/(2000*0.5),即v=y*0.001,因为显示方便,这里使v=y*0.01,然后把个位赋值给小数点后一位,把十位赋值给个位就可以正确显示了,更改后的程序如下:
void jiaodu() interrupt 2 //外部中断 1 计A相脉冲数
{
y++;
}
void zhuansu() interrupt 1 //定时器0中断每隔 0.5 秒查一次A转过的脉冲数
{
TR0=0;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
count++;
if(count==10)
{
v=y*0.01;//转速换算
y=0;
count=0;
}
TR0=1;
}
经过如此的更改就解决了之前的问题,显示非常稳定,误差也减小了很多。再给51系列单片机编程时应尽量的减少中断的使用,尤其是输入信号频率高,要求精度高,硬件设备质量低的情况。最好是根据有用信号,即用最少的输入信号得到最多的有用信息,通过编程减少外部设备,这样做不仅能够有效的减少误差,还可以节约资源。
四、 采用编码器测量电机转角
1. 原理介绍
利用编码器的A轴和B轴来判断正反转和角度。这里的正反是以开机时电机的初始位置为标准的。正反转的判别方法:因为A和B 相差90度,假设正转时A超前B90度,则反转时B超前A90度,利用这一特点可以判断正反。把A接到外部中断1,B接到P0^0口,当进入中断时,判断B轴是高电平还是低电平就可以判断正反了。角度的计算方法:电机转一圈是360度,编码器转一圈发出2000个矩形波,有这个关系就可以计算角度,即角度=计数个数*360、2000.
2. 程序框图
开始
是否进入中断
X=|x|*360/2000
否
显示函数
X--
X++
P0^0是否为1
是 否
图4.2
3. 编程实现
首先在初始化函数里要打开外部中断1,并且设置成下降沿触发。但A轴有信号来临时,进入到外部中断1服务程序,先判断P0^0口的高低电平,若为高电平,则计数变量加一,反之,计数变量减一。如果计数变量X大于2000或小于-2000,则使X等于0.这样做减轻了变换角度的计算量,使系统认为编码器一直在正一周或负一周之内活动。接下来就可以将计数变量通过公式转换成角度显示了。显示正负角则可以判断计数变量的正负来确定。
void jiaodu() interrupt 2 //外部中断 1 计A相脉冲数
{
if(d1==1)
x++;
else
x--;
if((x>2000)||(x<(-2000)))
x=0;
}
uint jiaodujisuan()//角度计算
{ uint j;
if(x<0)
{
wela=1; //显示角度符号位
P0=0xfb;
wela=0;
dula=1;
P0=0x40;
dula=0;
delay(3);
}
j=fabs(x);
j=j*0.18; //角度转换公式
return j;
}
4. 改错及心得
开始没有设置计数变量的上下限,使测量角度大于360度,改正后效果正确。开始角度转换公式为X=X*360/2000,结果显示不正确,后来改为X=X*0.18,显示正确。这段程序很考察细节,一个注意不到的地方有可能使程序出错。
五、 试验检测
1. 实验过程
把编码器与直流电机用联轴器固定在一起,通过改变只直流电压改变直流电机的转速,观察数码管显示的变化。停止直流电机,用手拧动编码器,可方便观察转角的变化。
2. 实验结果
系统可以实时的显示电机的转速及转角。
六、 总结
这次课程设计让我学到了很多。对于编码器与电机的应用又多了一层的认识,在编程上也有了大大的提高,对单片机的理解,尤其是对中断的处理加深了认识。在实验过程中,我曾经出现了很多次错误,大多数都是很细节的东西,这时就需要耐心与分析问题的能力来一次次的解决,也正是因为无数次的改正错误才使最后的程序调试成功。
展开阅读全文