霍尔元件测量转速的实现.docx_第1页
霍尔元件测量转速的实现.docx_第2页
霍尔元件测量转速的实现.docx_第3页
霍尔元件测量转速的实现.docx_第4页
霍尔元件测量转速的实现.docx_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

霍尔元件测量转速的实现一、实验目的1、掌握霍尔测速的方法,掌握霍尔测速的原理。2、重视保护电路在电路中的重要性。二、实验设备 教学实验开发板等三、预习要求 1、了解霍尔测速的原理2、熟悉运算放大器的各种放大电路的接法和增益计算方法。四、转速测量原理转速的测量方法很多,根据脉冲计数来实现转速测量的方法主要有M法(测频法)、T法(测周期法)和MPT法(频率周期法),该系统采用了M法(测频法)。由于转速是以单位时间内转数来衡量,在变换过程中多数是有规律的重复运动。根据霍尔效应原理,将一块永久磁钢固定在电机转轴上的转盘边沿,转盘随测轴旋转,磁钢也将跟着同步旋转,在转盘下方安装一个霍尔器件,转盘随轴旋转时,受磁钢所产生的磁场的影响,霍尔器件输出脉冲信号,其频率和转速成正比。脉冲信号的周期与电机的转速有以下关系:n=60PT,式中:n为电机转速;P为电机转一圈的脉冲数;T为输出方波信号周期根据公式即可计算出直流电机的转速。测量电机转速的第一步就是要将电机的转速表示为单片机可以识别的脉冲信号,从而进行脉冲计数。霍尔器件作为一种转速测量系统的传感器,它有结构牢固、体积小、重量轻、寿命长、安装方便等优点,因此选用霍尔传感器检测脉冲信号,其基本的测量原理如图所示,当电机转动时,带动传感器运动,产生对应频率的脉冲信号,经过信号处理后输出到计数器或其他的脉冲计数装置,进行转速的测量。五、软件设计由于实验箱已给出霍尔传感器测量转速的硬件电路,实验中只需要设计软件实现通过AT89C51,单片机完成对电机转速脉冲计数的控制,读取寄存器完成转速频率的确定。其测量过程是测量转速的霍尔传感器和电机机轴同轴连接,机轴每转一周,产生一定量的脉冲个数,由霍尔器件电路输出。经过电耦合器后,成为转数计数器的计数脉冲。同时霍尔传感器电路输出幅度为12V的脉冲经光电耦合后降为5V,保持同单片机AT89C51逻辑电平相一致,控制计数时间,即可实现计数器的计数值对应机轴的转速值。主CPU将该值数据处理后,在12864LCD液晶显示器上显示出来。本程序通过测频的方法计算电动机的转速。电动机转一周,霍尔传感器会产生一个负脉冲信号。程序中将T0当作计数器使用,记录电动机转动的圈数;T1作定时器用,确定计数周期。设定计数周期为1s,上一周期计数器记录下的电机转动圈数,作为当前的转速显示。下面是程序主流程图:全局初始化开始显示中断计数INT0、T1中断程序流程图六:实现程序: 12864驱动:#include/*/延时函数/*void DelayUs(unsigned char t) /当t=1时,延时1.1us0t255 while(-t);void DelayMs(unsigned char t) /当t=1时,延时1.0ms0t255 unsigned int j;while(t-)for(j=0;j100;j+);/*/LCD12864液晶部分/*#define LCD12864_DataPort P1sbit LCD12864_RS = P25;sbit LCD12864_RW = P26;sbit LCD12864_EN = P27;/sbit LCD12864_Busy = P07; void LCD12864_WriteData(unsigned char content);void LCD12864_WriteCommand(unsigned char content);void LCD12864_CleanRam(void);void LCD12864_Init(void);void LCD12864_Init(void)LCD12864_WriteCommand(0x06); /光标的移动方向LCD12864_WriteCommand(0x0c);/开显示,关游标LCD12864_CleanRam(); /清屏LCD12864_WriteCommand(0x01); /?void LCD12864_CleanRam(void)LCD12864_WriteCommand(0x30);LCD12864_WriteCommand(0x01);void LCD12864_WriteData(unsigned char content)/LCD12864_CheckBusy();LCD12864_RS=1; LCD12864_RW=0;LCD12864_DataPort=content;LCD12864_EN=1;LCD12864_EN=0;void LCD12864_WriteCommand(unsigned char content)/LCD12864_CheckBusy();LCD12864_RS=0; LCD12864_RW=0;LCD12864_DataPort=content;LCD12864_EN=1;LCD12864_EN=0;void LCD12864_Gotoxy(unsigned char y,unsigned char x)if(y=1)LCD12864_WriteCommand(0x80|x);if(y=2) LCD12864_WriteCommand(0x90|x);if(y=3)LCD12864_WriteCommand(0x80|x)+8);if(y=4) LCD12864_WriteCommand(0x90|x)+8);void LCD12864_Display(unsigned char x,y,unsigned char *str)LCD12864_Gotoxy(x,y);DelayMs(5);while(*str!=0)LCD12864_WriteData(*str);str+;extern void Displaynum(char x,char y,float num) char s4; sprintf(s,%2.1f, num); /?3.141593 LCD12864_Display(x,y,s); 主要程序:/*头文件调用*/#include #include #include #include #include 12864.h/*宏定义*/#define uchar unsigned char#define uint unsigned int/*全局变量及数组定义*/uchar code g_arInitDisplay117=The rotate speed; /液晶初始化会死要显示的字符串。uchar code g_arInitDisplay28=round/s; /注意:数组的长度至少要比字符串长度大一。/数组长度选择不合理,会出现意想不到的错误uchar g_arRoundDisplay5=0; /此数组将以字符形式存放将要显示在1602上的数值uchar g_ucT1_OutTimes;/Timer1的溢出次数,用以计时1suint g_uiRound; /电动机的转动圈数,每秒更新一次,可作为电机转速/* Function:Timers_init Description:初始化时钟,T0工作于16位计数模式,记录电机转速;T1为16位定时模式 ,用于管理时间阀门。 Calls:不调用其他函数 Called By:main() Input:无 Output:无 Return:无 Others:仅在系统初始化时使用一次*/void Timers_init()/定时器的初始化TMOD=0x15;/T0工作于16位计数模式;T1为16位定时模式TCON=0x50;/TR1、TR0为1,其余为0EA=1;/开总中断ET1=1;/允许T1溢出中断TH0=0;TL0=0;/电动机每秒钟转动的圈数在200圈之内TH1=(65536-50000)/256;TL1=(65536-50000)%256;/T1用于计时1s,中断20次约为1s/* Function:LCD_InitDisplay Description:12864初始显示内容 Calls:Display Called By:main() Input:无 Output:无 Return:无 Others:仅在系统初始化时使用一次*/void LCD_InitDisplay()/在12864上显示出初始字符串LCD12864_Display(0,0,g_arInitDisplay1);LCD12864_Display(6,1,g_arInitDisplay2);/* Function:main Description:主函数 Calls:Timers_init(),LcdInit(), LCD_InitDisplay(), sprintf(),Display()Called By:main() Input:无 Output:无 Return:无 Others:主函数*/void main()Timers_init(); /定时器初始化LCD12864_Init(); /液晶初始化LCD_InitDisplay(); /在12864上显示出初始字符串while(1)if(g_ucT1_OutTimes=20) /中断20次时,计时达到1sTR0=0; /关定时器0g_uiRound=256*TH0+TL0; /读取定时器0的计数值,即上一周期电机转动的圈数TH0=0;TL0=0; /定时器0计数值清零,准备下次计数TR0=1; /打开定时器0,开始新一轮计数sprintf(g_arRoundDisplay,%4d,g_uiRound);/将数值Round以字符形式打印到Round_display数组里面LCD12864_Display(1,1,g_arRoundDisplay);/在12864上显示Round_display里面的字符,即显示Round的值g_ucT1_OutTimes=0; /T1中断次数清零,开始下一周期的计时 /* Function:Timer1_INT Description:Timer1的中断函数,中断20次为计时1s Calls:无Called By:无 Input:无 Output:无 Return:无 Others:中断函数,不被任何函数调用*/void Timer1_INT() interrupt3TR1=0; /关闭定时器1TH1=(65536-50000)/256;TL1=(65536-50000)%256; /重装初值,每次计时50msTR1=1; /定时器1开始计数g_ucT1_OutTimes+; /Timer0每溢出一次,T1_OutTimes数值加1实验感想:本次实验在小组成员的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论