传感测速论文解析.docx
《传感测速论文解析.docx》由会员分享,可在线阅读,更多相关《传感测速论文解析.docx(20页珍藏版)》请在冰豆网上搜索。
传感测速论文解析
编号:
传感器综合设计
实训(论文)说明书
题目:
霍尔测速器设计
院(系):
信息与通信学院
专业:
电子信息工程
学生姓名:
学号:
指导教师:
2012年7月5日
摘要
本文介绍了基于霍尔传感器,采用单片机AT89S51控制的直流电机转速测量控制系统的工作原理及软硬件设计方法,通过LCD1602上直观地显示电机的转速值。
此外,还可以根据需要通过脉冲宽度调制控制电机的转速。
测试结果表明,该转速测量系统满足设计要求,并且具有硬件结构简单,易于调节电机转速及系统性能稳定等优点。
关键词:
霍尔传感器;单片机;直流电机;脉冲宽度调制;测速;调速
Abstract
ThisarticledescribesthephotoelectricsensorbasedonusingAT89S51microcontroller-controlledDCmotorspeedcontrolsystemformeasuringtheworkingprincipleofsoftwareandhardwaredesignmethods,ThevisualmotorspeedvaluedisplayonLCD1602.Inaddition,itcancontrolthemotorspeedthroughpulsewidthmodulation.TestresultsshowthatthespeedmeasuringsystemtomeetthedesignrequirementsandwithasimplehardwarestructureEasytoadjustthemotorspeedandsystemperformanceandstabilityadvantages.
Keywords:
Hallsensor;Microcontroller-controlled;DCmotor;Pulsewidthmodulation;Getspeed;Therateofchange
引言1
1方案设计1
1.1总体方案设计1
2霍尔传感器1
3单片机部分及其接口电路2
3.1直流电机驱动3
3.2按键输入电路4
3.3LCD显示模块5
4调试过程7
4.1静态测试整板测试7
4.2上电功能测试7
4.3调试所需仪器8
5结论8
谢辞9
参考文献10
附录1电路设计总图11
附录2电路PCB12
附录3程序13
引言
随着单片机的不断推陈出新,特别是高性价比的单片机的涌现,转速测量控制普遍采用了以单片机为核心的数字化、智能化的系统。
本文介绍了一种由单片机AT89C52作为主控制器并通过脉冲宽度调制(PWM)来调节电机速率,使用光电传感器进行测量的直流电机转速测量系统。
1方案设计
1.1总体方案设计
霍尔传感器由和磁钢组成,当霍尔元件和磁钢相对运动时,就会产生脉冲信号,根据磁钢和脉冲数量就可以计算转速。
为了便于验证测量效果,系统外加设计了电机变速模块,通过按键改变电机的转速并通过LCD进行显示。
用以验证红外测速模块能够正常的工作。
本设计在硬件电路上共分为4个部分,单片机部分、直流电机驱动、按键控制转速输入、测速显示电路。
以下面本文将详细介绍每一部分的功能原理以及元器件的选取。
2霍尔传感器
霍尔传感器是一种磁传感器。
用它可以检测磁场及其变化,可在各种与磁场有关的场合中使用。
霍尔传感器以霍尔效应为其工作基础,是由霍尔元件和它的附属电路组成的集成传感器。
霍尔传感器在工业生产、交通运输和日常生活中有着非常广泛的应用。
测转速或转数如图1所示,在非磁性材料的圆盘边上粘一块磁钢,霍尔传感器放在靠近圆盘边缘处,圆盘旋转一周,霍尔传感器就输出一个脉冲,从而可测出转数(计数器),若接入频率计,便可测出转速,
图1霍尔传感器磁传感应
如果把开关型霍尔传感器按预定位置有规律地布置在轨道上,当装在运动车辆上的永磁体经过它时,可以从测量电路上测得脉冲信号。
根据脉冲信号的分布可以测出电机运动速度。
如图2所示
图2霍尔传感器引脚图
3单片机部分及其接口电路
图3最小系统
本设计采用的是STC的89C52单片机,选用STC的单片机是因为它是宽电压供电,工作电压范围为5.5V-3.4V,比起一般51系列单片机的5.5V-4.5V更能有效的避免电源抖动所带来的问题。
晶振选用石英晶振,频率为20MHz,比起传统的12MHz能有更快的处理速度。
在第9脚-RST,复位脚外,加了一个复位按键和复位电路,复位原理为:
第一次上电时,+5V通过给电容充电,于是此时电容相当于短路,+5V直接加到RST脚上,单片机自动复位。
过了极短的时间,电容充电完毕,此时电容则相当于开路,于是RST脚被电阻R113拉为低,单片机开始正常工作。
当RESET键按下时,+5V通过按键加到RST脚上,单片机复位,RESET键弹起之后,RST脚重新被R113拉为低,单片机开始正常工作。
+5V给单片机和显示部分供电。
3.1直流电机驱动
直流电机驱动运用典型的H桥电路,其原理:
图4H桥电路
H桥式电机驱动电路包括4个三极管和一个电机。
要使电机运转,必须使对角线上的一对三极管导通。
例如,如图4所示,当Q1管和Q4管导通时,电流就从电源正极经Q1从左至右穿过电机,然后再经Q4回到电源负极。
按图中电流箭头所示,该流向的电流将驱动电机顺时针转动。
当三极管Q1和Q4导通时,电流将从左至右流过电机,从而驱动电机按特定方向转动(电机周围的箭头指示为顺时针方向)
图5H桥电路
图5所示为另一对三极管Q2和Q3导通的情况,电流将从右至左流过电机。
当三极管Q2和Q3导通时,电流将从右至左流过电机,从而驱动电机沿另一方向转动(电机周围的箭头表示为逆时针方向)。
图6直流电机部分
图6为典型的H桥电路设计。
其中D1、D2、D3、D4二极管用于电流反向保护,如果要驱动大功率的电机把Q3、Q4、Q5、Q6换成大功率的三极管。
3.2按键输入电路
原理图如下:
图7按键部分
在本设计中,按键输入比较简单,就是在按键信号输入I/O口与地线间串接一按键。
在按键没有按下的情况下,I/O口悬空,所以为高(由于STC单片机的I/O口是有内部上拉电路的,所以当其悬空时,内部将其上拉为高);当按键按下后,地线的把I/O口的
图8霍尔传感器
3.3LCD显示模块
单片机控制系统中应用晶液显示器LCD1602作为输出器件有以下几个优点:
(1)显示质量高
由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。
因此,液晶显示器画质高且不会闪烁。
(2)数字式接口
液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。
(3)体积小、重量轻
液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比相同显示面积的传统显示器要轻得多。
(4)功耗低
相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。
由于液晶显示器具有显示质量高、数字式接口、体积小、功耗低等优点,所以选择了液晶显示器LCD1602作为跑步机转动状态的显示媒介。
其实物图如图7所示。
实物正面图:
实物背面图:
图9液晶显示器LCD1602实物图
显示部分原理:
采用LCD1602来显示,1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。
每位之间有一个点距的间隔每行之间也有也有间隔起到了字符间距和行间距的作用,正因为如此所以他不能显示图形
图101602显示原理图
4调试过程
在对系统硬件电路调试之前,有两项工作是必须做的,一是整板静电测试,二是上电测试。
为了方便调试,采用分模块调试的方法。
调试的四大模块分别为:
单片机控制模块、液晶显示模块、直流电机转动模块、霍尔传感器测速模块。
首先,检测上电后的单片机能否正常工作;其次,在单片机没有问题的情况下,通过对单片机编程,检测液晶显示模块和直流电机转动模块能否正常工作;最后,在直流电机转动模块正常工作之后,进一步检测霍尔传感器测速模块能否正常工作。
在完成了这四大模块的检测之后,方可根据跑步机控制系统要求实现的具体功能对单片机编写相应程序。
4.1静态测试整板测试
整板测试是在元件焊接完成但未加电前对电路板进行的检查。
该过程是系统上电前的检查工作,需要对每个器件逐个引脚进行检查,一方面是检查有没有引脚虚焊或与其他信号线短路,另一方面是对器件引脚功能的再检查,查看设计是否正确。
整板测试可以按照先电源和地,再逐个器件引脚的顺序测试。
4.2上电功能测试
上电测试是调试的关键部分,按照系统方案设计的模块化思想,应该分模块测试系统。
首先,应该测试电源部分,系统上电以后,测试各个电源端口和器件的电源部分是否工作正常,同时,还应该注意系统中有无器件过热情况,如果有的话,可能是相应的器件损坏或电路中有短路,需要处理之后再加电。
如果没有问题,则可以进行功能的调试。
4.3调试所需仪器
系统调试过程中使用了函数信号发生器、示波器、万用表、稳压源等实验仪器仪表工具。
根据电路功能逐级分模块进行调试,在电路板调试中出现过各种问题,遇到这些问题需要从电路知识进行分析,先分析问题出现的原因,再考虑解决的方法。
5结论
经过两个礼拜的努力,在对参考资料文献及所需相关知识有了一个充分了解的基础上,圆满完成了传感器的设计要求。
经测试系统现有各功能正常,能够实现对电机速度的测量。
在整个设计和制作过程中我不断的查阅和学习有关霍尔传感器的知识,对传感器这一块的知识有了更深的理解,对题目本身的理解也更加全面与透彻。
当然系统现在还不够成熟,有许多可扩展的功能和改进的地方值得总结。
在此我就系统的不足之处提出一些改进的思路和设想,以备我们下一步工作作为参考。
首先,该系统只是一个实验性的作品,由于个人水平以及硬件资源的限制,如果要最终成为大众的能够被推广的产品,还需要大量的工作。
其次,在软件设计方面,也有许多有待改进的地方。
但是,整个课程设计的过程中,让我建立了系统设计思路,了解如何进行产品完整性设计、调试、测试和论文的撰写。
自己很多方面有了很大的提高和收获。
谢辞
本次设计让我学到了很多东西,更加深了自己对电子设计,制作的认识与兴趣。
在此非常感谢给与我帮助的老师,同学,谢谢他们的精心辅导与真诚帮助。
在以后的日子里,我会继续努力,加强理论研究与分析,提示自己的全面能力。
参考文献
[1]胡辉,单片机原理及应用设计.中国水利水电出版社,2005,
[2]邱国平,永磁直流电机实用设计及应用技术.机械工业出版社,2009
[3]阎石,数字电子技术基础(第五版).高等教育出版社,2006.
[4]童诗白,华成英.模拟电子技术基础[M].北京:
高等教育出版社,2006.
[5]张齐,杜群贵,单片机应用系统设计技术[M]. 北京:
电子工业出版社,2007.
[6]张洪润,电子线路与电子技术[M].清华大学出版社[M],2005.
[7]郭永贞,主编数字电子技术[M]西安电子科技大学出版社,2000.
附录1电路设计总图
附录2电路PCB
附录3程序
#include
#include//包含随机函数rand()的定义文件
#include//包含_nop_()函数定义的头文件
#defineucharunsignedchar
#defineV_TH00XFF
#defineV_TL00XF6
unsignedcharZKB1,ZKB2,k;
sbitRS=P2^3;//寄存器选择位,将RS位定义为P2.0引脚
sbitRW=P2^4;//读写选择位,将RW位定义为P2.1引脚
sbitE=P2^5;//使能信号位,将E位定义为P2.2引脚
sbitBF=P0^7;//忙碌标志位,,将BF位定义为P0.7引脚
unsignedcharcodedigit[]={"0123456789"};//定义字符数组显示数字
unsignedcharcodestring[]={"zhiliudianji"};//定义字符数组显示提示信息
unsignedcharcodestring1[]={"MM/S"};//定义字符数组显示提示信息
unsignedcharcount,temp=0,m;//定义变量统计中断累计次数
voidDelay5Ms(void)
{
unsignedintTempCyc=1000;
while(TempCyc--);
}
/*****************************************************
函数功能:
延时1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
***************************************************/
voiddelay1ms()
{
unsignedchari,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
/*****************************************************
函数功能:
延时若干毫秒
入口参数:
n
***************************************************/
voiddelay(unsignedcharn)
{
unsignedchari;
for(i=0;idelay1ms();
}
/*****************************************************
函数功能:
判断液晶模块的忙碌状态
返回值:
result。
result=1,忙碌;result=0,不忙
***************************************************/
unsignedcharBusyTest(void)
{
bitresult;
RS=0;//根据规定,RS为低电平,RW为高电平时,可以读状态
RW=1;
E=1;//E=1,才允许读写
_nop_();//空操作
_nop_();
_nop_();
_nop_();//空操作四个机器周期,给硬件反应时间
result=BF;//将忙碌标志电平赋给result
E=0;//将E恢复低电平
returnresult;
}
/*****************************************************
函数功能:
将模式设置指令或显示地址写入液晶模块
入口参数:
dictate
***************************************************/
voidWriteInstruction(unsignedchardictate)
{
while(BusyTest()==1);//如果忙就等待
RS=0;//根据规定,RS和R/W同时为低电平时,可以写入指令
RW=0;
E=0;//E置低电平(根据表8-6,写指令时,E为高脉冲,
//就是让E从0到1发生正跳变,所以应先置"0"
_nop_();
_nop_();//空操作两个机器周期,给硬件反应时间
P0=dictate;//将数据送入P0口,即写入指令或地址
_nop_();
_nop_();
_nop_();
_nop_();//空操作四个机器周期,给硬件反应时间
E=1;//E置高电平
_nop_();
_nop_();
_nop_();
_nop_();//空操作四个机器周期,给硬件反应时间
E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:
指定字符显示的实际地址
入口参数:
x
***************************************************/
voidWriteAddress(unsignedcharx)
{
WriteInstruction(x|0x80);//显示位置的确定方法规定为"80H+地址码x"
}
/*****************************************************
函数功能:
将数据(字符的标准ASCII码)写入液晶模块
入口参数:
y(为字符常量)
***************************************************/
voidWriteData(unsignedchary)
{
while(BusyTest()==1);
RS=1;//RS为高电平,RW为低电平时,可以写入数据
RW=0;
E=0;//E置低电平(根据表8-6,写指令时,E为高脉冲,
//就是让E从0到1发生正跳变,所以应先置"0"
P0=y;//将数据送入P0口,即将数据写入液晶模块
_nop_();
_nop_();
_nop_();
_nop_();//空操作四个机器周期,给硬件反应时间
E=1;//E置高电平
_nop_();
_nop_();
_nop_();
_nop_();//空操作四个机器周期,给硬件反应时间
E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:
对LCD的显示模式进行初始化设置
***************************************************/
voidLcdInitiate(void)
{
delay(15);//延时15ms,首次写指令时应给LCD一段较长的反应时间
WriteInstruction(0x38);//显示模式设置:
16×2显示,5×7点阵,8位数据接口
delay(5);//延时5ms ,给硬件一点反应时间
WriteInstruction(0x38);
delay(5);
WriteInstruction(0x38);//连续三次,确保初始化成功
delay(5);
WriteInstruction(0x0c);//显示模式设置:
显示开,无光标,光标不闪烁
delay(5);
WriteInstruction(0x06);//显示模式设置:
光标右移,字符不移
delay(5);
WriteInstruction(0x01);//清屏幕指令,将以前的显示内容清除
delay(5);
}
voidmain(void)
{
unsignedchari;
unsignedcharh,j,q;
LcdInitiate();//调用LCD初始化函数
TMOD=0x11;//使用定时器T0的模式1
TH0=(65536-46083)/256;//定时器T0的高8位设置初值
TL0=(65536-46083)%256;//定时器T0的低8位设置初值
EA=1;//开总中断
ET0=1;//定时器T0中断允许
TR0=1;
EX0=1;//允许使用外中断
IT0=1;//选择负跳变来触发外中断
ET1=1;//定时器T1中断允许
TR1=1;//启动定时器T1
TH1=V_TH0;
TL1=V_TL0;
count=0;//中断次数初始化为0
WriteAddress(0x03);//写地址,从第1行第4列开始显示
i=0;//从字符数组的第1个元素开始显示
while(string[i]!
='\0')//只要没有显示到字符串的结束标志'\0',就继续
{
WriteData(string[i]);//将第i个字符数组元素写入LCD
i++;//指向下一个数组元素
}
ZKB1=80;/*占空比初始值设定*/
while
(1)
{
P2_6=0;
if(!
P1_0)//如果按了+键,增加占空比
{
Delay5Ms();
if(!
P1_0)
{
ZKB1++;
}
}
if(!
P1_1)//如果按了-键,减少占空比
{
Delay5Ms();
if(!
P1_1)
{
ZKB1--;
}
}
/*对占空比值限定范围*/
if(ZKB1>99)ZKB1=100;
if(ZKB1<1)ZKB1=0;
if(!
P1_2)//反转
{
Delay5Ms();
if(!
P1_2)
{
k=1;
WriteAddress(0x43);
WriteData('-');
}
}
if(!
P1_3)//停止
{
Delay5Ms();
if(!
P1_3)
{
k=2;
}
}
h=temp/100;
j=(temp%100)/10;
q=temp%10;
WriteAddress(0x44);//写地址,将第二个分号显示在第2行第5列
WriteData(digit[h]);//将分号的字符常量写入LCD
WriteData(digit[j]);
WriteAddress(0x46);//写地址,将第二个分号显示在第2行第7列
WriteData('.');//小数点
WriteAddress(0x47);
WriteData(digit[q]);
WriteAddress(0x49);//写地址,将第二个分号显示在第2行第10列
i=0;//从字符数组的第1个元素开始显示
while(string1[i]!
='\0')//只要没有显示到字符串的结束标志'\0',就继续
{
WriteData(string1[i]);//将第i个字符数组元素写入LCD
i++;//指向下一个数组元素
}
}//无限循环
}
/******************