霍尔元件测量转速地实现Word格式文档下载.docx
《霍尔元件测量转速地实现Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《霍尔元件测量转速地实现Word格式文档下载.docx(11页珍藏版)》请在冰点文库上搜索。
五、软件设计
由于实验箱已给出霍尔传感器测量转速的硬件电路,实验中只需要设计软件实现通过AT89C51,单片机完成对电机转速脉冲计数的控制,读取寄存器完成转速频率的确定。
其测量过程是测量转速的霍尔传感器和电机机轴同轴连接,机轴每转一周,产生一定量的脉冲个数,由霍尔器件电路输出。
经过电耦合器后,成为转数计数器的计数脉冲。
同时霍尔传感器电路输出幅度为12V的脉冲经光电耦合后降为5V,保持同单片机AT89C51逻辑电平相一致,控制计数时间,即可实现计数器的计数值对应机轴的转速值。
主CPU将该值数据处理后,在12864LCD液晶显示器上显示出来。
本程序通过测频的方法计算电动机的转速。
电动机转一周,霍尔传感器会产生一个负脉冲信号。
程序中将T0当作计数器使用,记录电动机转动的圈数;
T1作定时器用,确定计数周期。
设定计数周期为1s,上一周期计数器记录下的电机转动圈数,作为当前的转速显示。
下面是程序主流程图:
六:
实现程序:
112864驱动:
#include<
stdio.h>
//***************************************************
//延时函数
voidDelayUs(unsignedchart)//当t=1时,延时1.1us0<
t<
255
{
while(--t);
}
voidDelayMs(unsignedchart)//当t=1时,延时1.0ms0<
unsignedintj;
while(t--)
{
for(j=0;
j<
100;
j++);
}
//LCD12864液晶部分
#defineLCD12864_DataPortP1
sbitLCD12864_RS=P2^5;
sbitLCD12864_RW=P2^6;
sbitLCD12864_EN=P2^7;
//sbitLCD12864_Busy=P0^7;
voidLCD12864_WriteData(unsignedcharcontent);
voidLCD12864_WriteCommand(unsignedcharcontent);
voidLCD12864_CleanRam(void);
voidLCD12864_Init(void);
voidLCD12864_Init(void)
{
LCD12864_WriteCommand(0x06);
//光标的移动方向
LCD12864_WriteCommand(0x0c);
//开显示,关游标
LCD12864_CleanRam();
//清屏
LCD12864_WriteCommand(0x01);
//?
?
voidLCD12864_CleanRam(void)
LCD12864_WriteCommand(0x30);
voidLCD12864_WriteData(unsignedcharcontent)
//LCD12864_CheckBusy();
LCD12864_RS=1;
LCD12864_RW=0;
LCD12864_DataPort=content;
LCD12864_EN=1;
LCD12864_EN=0;
voidLCD12864_WriteCommand(unsignedcharcontent)
LCD12864_RS=0;
voidLCD12864_Gotoxy(unsignedchary,unsignedcharx)
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);
voidLCD12864_Display(unsignedcharx,y,unsignedchar*str)
LCD12864_Gotoxy(x,y);
DelayMs(5);
while(*str!
='
\0'
)
LCD12864_WriteData(*str);
str++;
}
externvoidDisplaynum(charx,chary,floatnum)
chars[4];
sprintf(s,"
%2.1f"
num);
"
3.141593"
LCD12864_Display(x,y,s);
2主要程序:
/************************************************************
头文件调用
*************************************************************/
#include<
reg52.h>
intrins.h>
math.h>
#include"
12864.h"
宏定义
************************************************************/
#defineucharunsignedchar
#defineuintunsignedint
/***********************************************************
全局变量及数组定义
***********************************************************/
ucharcodeg_arInitDisplay1[17]="
Therotatespeed"
;
//液晶初始化会死要显示的字符串。
ucharcodeg_arInitDisplay2[8]="
round/s"
//注意:
数组的长度至少要比字符串长度大一。
//数组长度选择不合理,会出现意想不到的错误
ucharg_arRoundDisplay[5]={0};
//此数组将以字符形式存放将要显示在1602上的数值
ucharg_ucT1_OutTimes;
//Timer1的溢出次数,用以计时1s
uintg_uiRound;
//电动机的转动圈数,每秒更新一次,可作为电机转速
/*************************************************
Function:
Timers_init
Description:
初始化时钟,T0工作于16位计数模式,记录电机转速;
T1为16位定时模式,
用于管理时间阀门。
Calls:
不调用其他函数
CalledBy:
main()
Input:
无
Output:
Return:
Others:
仅在系统初始化时使用一次
*************************************************/
voidTimers_init()//定时器的初始化
TMOD=0x15;
//T0工作于16位计数模式;
T1为16位定时模式
TCON=0x50;
//TR1、TR0为1,其余为0
EA=1;
//开总中断
ET1=1;
//允许T1溢出中断
TH0=0;
TL0=0;
//电动机每秒钟转动的圈数在200圈之内
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
//T1用于计时1s,中断20次约为1s
LCD_InitDisplay
12864初始显示内容
Display
voidLCD_InitDisplay()//在12864上显示出初始字符串
LCD12864_Display(0,0,g_arInitDisplay1);
LCD12864_Display(6,1,g_arInitDisplay2);
main
主函数
Timers_init(),LcdInit(),LCD_InitDisplay(),sprintf(),Display()
主函数
voidmain()
Timers_init();
//定时器初始化
LCD12864_Init();
//液晶初始化
LCD_InitDisplay();
//在12864上显示出初始字符串
while
(1)
{
if(g_ucT1_OutTimes>
=20)//中断20次时,计时达到1s
{
TR0=0;
//关定时器0
g_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中断次数清零,开始下一周期的计时
}
}
Timer1_INT
Timer1的中断函数,中断20次为计时1s
无
中断函数,不被任何函数调用
voidTimer1_INT()interrupt3
TR1=0;
//关闭定时器1
//重装初值,每次计时50ms
TR1=1;
//定时器1开始计数
g_ucT1_OutTimes++;
//Timer0每溢出一次,T1_OutTimes数值加1
实验感想:
本次实验在小组成员的共同努力下,完成了通过单片机控制霍尔传感器测量电机转换的速度,掌握了霍尔测速的方法及霍尔测速的原理。
通过软件方式实现了电机转速的测量并能在12864液晶频上显示结果。
由于实验硬件电路在试验箱上已经给出,实验的操作主要考验软件的编写和开发上,因为自身软件方面基础比较薄弱,因此主要负责查询12864驱动资料辅助软件设计并调试程序,小组的另一位成员则负责程序的主要设计工作。
通过实验更加认识到自己的不足,在以后的学习生活中应该更加注重51开发和自身软件这一方面的学习。