数字测速软硬件框架设计.docx
- 文档编号:12804105
- 上传时间:2023-06-08
- 格式:DOCX
- 页数:17
- 大小:364.88KB
数字测速软硬件框架设计.docx
《数字测速软硬件框架设计.docx》由会员分享,可在线阅读,更多相关《数字测速软硬件框架设计.docx(17页珍藏版)》请在冰点文库上搜索。
数字测速软硬件框架设计
任务分析
本次设计选用增量式旋转编码器,光栅数为1024的,旋转编码器与电动机相连,当电动机转动时带动码盘旋转,通过光栅的作用,持续不断地开放或封闭通路,因此,在接收装置的输出端便得到频率与转速成正比的方波序列,从而可以计算转速。
本次设计用的是M/T算法测速,由于M/T算法的计数值M1和M2都随着转速的变化而变化,高速时,相当于M法测速,最低速时,M1=1,自动进入T法测速。
因此,M/T法测速能适用的转速范围明显高于前两种,是目前广泛应用的一种测速方法。
转速计算公式为N=60M1F/ZM2。
第一章总体设计
1.1M/T法测速
M/T法测速综合了“T”法和“M”法分别对高、低转速具有的不同精度,利用各自的优点而产生的方法,精度位于两者之间,如图1-1“M/T”法定时/计数测量所示。
“M/T”法采用三个定时/计数器,同时对输入脉冲、高频脉冲(由振荡器产生)、及预设的定时时间进行定时和计数,m1反映转角,m2反映测速的准确时间,通过计算可得转速值n。
该法在高速及低速时都具有相对较高的精度。
测速时间Td由脉冲发生器脉冲来同步,即Td等于m1个脉冲周期。
由图1-1可见,从a点开始,计数器对m1和m2计数,到达b点,预定的测速时间时,单片机发出停止计数的指令,因为Tc不一定正好等于整数个脉冲发生器脉冲周期,所以,计数器仍对高频脉冲继续计数,到达c点时,脉冲发生器脉冲的上升沿使计数器停止,这样,m2就代表了m1个脉冲周期的时间。
“M/T”法综合了“T”和“M”两种方法,转速计算如下:
设高频脉冲的频率为fc,脉冲发生器每转发出P个脉冲,M/T法转速计算公式为:
(1.1)
n-转速值:
单位:
(转/分);
fc-晶体震荡频率:
单位(Hz);
m1-输入脉冲数,反映转角;
m2-时基脉冲数。
图1-1“M/T”法定时/计数测量
1.2数字测速系统应用的方法
M/T这种转速测量方法的相对误差与转速n无关,只与晶体振荡产生的脉冲有关,故可适合各种转速下的测量。
保证其测量精度的途径是增大定时时间T,或提高时基脉冲的频率fc。
因此,在实际操作时往往采用一种称变M/T的测量方法,即所谓变M/T法,在M/T法的基础上,让测量时间Tc始终等于转速输入脉冲信号的周期之和。
并根据第一次的所测转速及时调整预测时间Tc,兼顾高低转速时的测量精度。
1.3数字测速软硬件总体框架图
如下图1-2所示:
图1-2数字测速软硬件总体框架图
第二章最小系统的设计
2.1复位电路
MCS-51单片机复位电路是指单片机的初始化操作。
单片机启运运行时,都需要先复位,其作用是使CPU和系统中其他部件处于一个确定的初始状态,并从这个状态开始工作。
因而,复位是一个很重要的操作方式。
但单片机本身是不能自动进行复位的,必须配合相应的外部电路才能实复位功能。
复位电路的基本功能是:
系统上电时提供复位信号,直至系统电源稳定后,撤销复位信号。
为可靠起见,电源稳定后还要经一定的延时才撤销复位信号,以防电源开关或电源插头分-合过程中引起的抖动而影响复位。
如图2-1所示。
2.1晶振电路
晶振是晶体振荡器的简称,在电气上它可以等效成一个电容和一个电阻并联再串联一个电容的二端网络,电工学上这个网络有两个谐振点,以频率的高低分其中较低的频率是串联谐振,较高的频率是并联谐振。
AT89C51单片机内部有一个用于构成振荡器的高增益反相放大器。
引脚XTAL1和XTAL2分别是此放大器的输入端和输出端。
这个放大器与作为反馈元件的片外晶体谐振器一起构成一个自激振荡器。
外接晶体谐振器以及电容C1和C2构成并联谐振电路,接在放大器的反馈回路中。
对外接电容的值虽然没有严格的要求,但电容的大小会影响震荡器频率的高低、震荡器的稳定性、起振的快速性和温度的稳定性。
因此,此系统电路的晶体振荡器的值为12MHz,电容应尽可能的选择陶瓷电容,电容值约为30μF。
在焊接刷电路板时,晶体振荡器和电容应尽可能安装得与单片机芯片靠近,以减少寄生电容,更好地保证震荡器稳定和可靠地工作。
晶振有一个重要的参数,那就是负载电容值,选择与负载电容值相等的并联电容,就可以得到晶振标称。
如图2-2所示。
图2-1图2-2
第三章液晶1062原理
3.1液晶1062原理介绍
1602是工业字符型液晶,能够同时显示16x02即32个字符。
(16列2行),1602字符型LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线。
VCC(15脚)和地线GND(16脚),
其控制原理与14脚的LCD完全一样,如下图所示。
3.2液晶1062基本读写时序图
读写操作时序如图所示:
图3-1写操作时序
图3-2读操作时序
第四章硬件连接电路
4.1液晶1062与单片机的硬件连接
连接电路如下图4-1所示:
图4-1
第五章软件设计
5.1主程序初始化
AT89C51有两个定时器/计数器T0和T1,每个定时器/计数器均可设置成为16位,也可以设置成为13位进行定时或计数。
计数器的功能是对T0或T1外来脉冲的进行计数,外部输入脉冲负跳变时,计数器进行加1。
定时功能是通过计数器的计数来实现的,每个机器周期产生1个计数脉冲,即每个机器周期计数器加1,因此定时时间等于计数个数乘以机器周期。
定时器工作时,每接收到1个计数脉冲(或机器周期)则在设定的初值基础上自动加1,当所有位都位1时,再加1就会产生溢出,将向CPU提出定时器溢出中断身请。
当定时器采用不同的工作方式和设置不同的初值时,产生溢出中断的定时值和计数值将不同,从而可以适应不同的定时或计数控制。
其流程图如图5-1所示:
图5-1
5.2中断程序流程图
如下图5-2所示:
图5-2
第六章心得体会
采用单片机技术来实现转速的测量,可以提高转速的测量,可以提高转速测量的精确度,并且加快了采样的速率,具有较好的实时性。
本文介绍的转速方法使用于高、低转速的测量,测量精确度与转速无关,因而具有较宽的应用范围和广阔的应用的前景。
基于单片机的转速测量系统,具有硬件电路简单,程序简单和运算速度快,测速范围广,抗干扰性能好的特点。
在设计的信号处理电路中经过滤波,能够进一步减少误差,是测速精度得到提高。
通过这次课程设计,我深深懂得了要不断把所学知识学以致用,也发现了自己的知识薄弱,还需通过自身不断努力,不断提高自己的分析问题、解决问题的能力,同时也提高了我的专业技能,拓展了我的专业知识面,使我更加体会到要想完成一件事必须认真、踏实、勤于思考、和谨慎稳重。
通过本次课设,也增强了我的实践操作和动手应用能力,提高了独立思考的能力。
使我对M/T测法以及单片机的相关内容与实际中有了一定的认识和了解,并对其所需要用的软硬件都有了掌握,为今后的工作打下了基础。
最后,我要感谢的是我的同学和舍友们在我课程设计期间,他们给了我不少的关心和帮助。
主要参考文献
1.孙育才MCS-51系列单片微型计算机及其应用[M].东南大学出版社2004.10
2.陈伯时.电力拖动自动控制系统-运动控制系统.机械工业出版社,2003
4.马全权,李庆辉,强盛.一种高精度实时电机转速测量新方法,齐齐哈尔大学学报,2002
5.孙桂荣,刘鸣.电机转速测量设计实验.实验室科学,2005
附录:
#include
#include
sbitRS=P2^6;
sbitRW=P2^5;
sbitE=P2^7;
sbitBF=P1^7;
sbitSW=P2^0;
unsignedcharcodedigit[]={"0123456789"};//定义字符数组显示数字
unsignedintv;
unsignedintn;//储存电机转速
unsignedintM1;
doubleM2;
unsignedinta;
doublef0=1000000;
unsignedintZ;
unsignedintcount;//储存定时器T0中断次数
bitflag;//计满1秒钟标志位
/************************************************************/
voiddelay1ms()//函数功能:
延时1ms
{
unsignedchari,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
/***********************************************************/
voiddelay(unsignedcharn)//延时若干毫秒
{
unsignedchari;
for(i=0;i delay1ms(); } /***********************************************************/ unsignedcharBusyTest(void)//判断液晶模块的忙碌状态 { bitresult; RS=0;//根据规定,RS为低电平,RW为高电平时,可以读状态 RW=1; E=1;//E=1,才允许读写 _nop_();//空操作 _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 result=BF;//将忙碌标志电平赋给result E=0;//将E恢复低电平 returnresult; } /************************************************************/ voidWriteInstruction(unsignedchardictate)//将模式设置指令或显示地址写入液晶模块 { while(BusyTest()==1);//如果忙就等待 RS=0;//根据规定,RS和R/W同时为低电平时,可以写入指令 RW=0; E=0;//E置低电平(根据表8-6,写指令时,E为高脉冲, //就是让E从0到1发生正跳变,所以应先置"0" _nop_(); _nop_();//空操作两个机器周期,给硬件反应时间 P1=dictate;//将数据送入P0口,即写入指令或地址 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=1;//E置高电平 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令 } /************************************************************/ voidWriteAddress(unsignedcharx)//指定字符显示的实际地址 { WriteInstruction(x|0x80);//显示位置的确定方法规定为"80H+地址码x" } /***********************************************************/ voidWriteData(unsignedchary)//将数据(字符的标准ASCII码)写入液晶模块 { while(BusyTest()==1); RS=1;//RS为高电平,RW为低电平时,可以写入数据 RW=0; E=0;//E置低电平(根据表8-6,写指令时,E为高脉冲, //就是让E从0到1发生正跳变,所以应先置"0" P1=y;//将数据送入P0口,即将数据写入液晶模块 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=1;//E置高电平 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令 } /*********************************************************/ voidLcdInitiate(void)//对LCD的显示模式进行初始化设置 { 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); } /***************************************************************/ voiddisplay_sym(void)//显示速度提示符 { WriteAddress(0x00);//写显示地址,将在第1行第1列开始显示 WriteData('v');//将字符常量v写入LCD WriteData('=');//将字符常量=写入LCD } /****************************************************************/ voiddisplay_val(unsignedintx)//显示速度数值 { unsignedchari,j,k,l;//j,k,l分别储存温度的百位、十位和个位 i=x/1000;//取千位 j=(x%1000)/100;//取百位 k=(x%100)/10;//取十位 l=x%10;//取个位 WriteAddress(0x02);//写显示地址,将在第1行第3列开始显示 WriteData(digit[i]);//将千位数字的字符常量写入LCD WriteData(digit[j]);//将百位数字的字符常量写入LCD WriteData(digit[k]);//将十位数字的字符常量写入LCD WriteData(digit[l]);//将个位数字的字符常量写入LCD } /**********************************************************/ voiddisplay_unit(void)//显示速度单位"r/min" { WriteAddress(0x07);//写显示地址,将在第2行第7列开始显示 WriteData('r');//将字符常量r写入LCD WriteData('/');//将字符常量/写入LCD WriteData('m');//将字符常量m写入LCD WriteData('i');//将字符常量i写入LCD WriteData('n');//将字符常量n写入LCD } /***********************************************************/ voidmain(void) { LcdInitiate();//调用LCD初始化函数 TMOD=0x51;//定时器T1工作于计数模式1,定时器T0工作于计时模式1; TH0=(65536-50000)/256;//定时器T0的高8位设置初值,每50ms产生一次中断 TL0=(65536-50000)%256;//定时器T0的低8位设置初值,每50ms产生一次中断 EA=1;//开总中断 ET0=1;//定时器T0中断允许 count=0;//将T0中断次数初始化为0 display_sym();//显示速度提示符 display_val(0000);//显示器工作正常标志 display_unit();//显示速度单位 while (1)//无限循环 { ET1=1; TH1=0x00;//定时器T1高8位赋初值0 TL1=0x00;//定时器T1低8位赋初值0 TR1=1;//定时器T1启动 while(TL1==0) ; TR0=1;//启动定时器T0 flag=0; while(flag==0)//时间还未满1秒钟 ;//时间未满等待 M1=TH1*256+TL1; a=TH1*256+TL1; while(TH1*256+TL1==a) ; TR0=0; M2=1000000+256*(TH0-(65536-50000)/256)+(TL0-(65536-50000)%256)+50000*count; TH0=(65536-50000)/256;//定时器T0的高8位设置初值,每50ms产生一次中断 TL0=(65536-50000)%256;//定时器T0的低8位设置初值,每50ms产生一次中断 count=0; Z=1; v=(f0*M1)*60/(Z*M2); display_val(v); } } /***********************************************************/ voidTime0(void)interrupt1using1//定时器T0的中断编号为1,使用第1组工作寄存器 { count++;//T0每中断1次,count加1 if(count==20)//若累计满20次,即计满1秒钟 { flag=1;//计满1秒钟标志位置1 count=0;//清0,重新统计中断次数 } TH0=(65536-50000)/256;//定时器T0高8位重新赋初值 TL0=(65536-50000)%256;//定时器T0低8位重新赋初值 } /***********************************************************/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数字 测速 软硬件 框架 设计