霍尔元件测量转速地实现Word格式文档下载.docx

上传人:b****1 文档编号:5275904 上传时间:2023-05-04 格式:DOCX 页数:11 大小:75.83KB
下载 相关 举报
霍尔元件测量转速地实现Word格式文档下载.docx_第1页
第1页 / 共11页
霍尔元件测量转速地实现Word格式文档下载.docx_第2页
第2页 / 共11页
霍尔元件测量转速地实现Word格式文档下载.docx_第3页
第3页 / 共11页
霍尔元件测量转速地实现Word格式文档下载.docx_第4页
第4页 / 共11页
霍尔元件测量转速地实现Word格式文档下载.docx_第5页
第5页 / 共11页
霍尔元件测量转速地实现Word格式文档下载.docx_第6页
第6页 / 共11页
霍尔元件测量转速地实现Word格式文档下载.docx_第7页
第7页 / 共11页
霍尔元件测量转速地实现Word格式文档下载.docx_第8页
第8页 / 共11页
霍尔元件测量转速地实现Word格式文档下载.docx_第9页
第9页 / 共11页
霍尔元件测量转速地实现Word格式文档下载.docx_第10页
第10页 / 共11页
霍尔元件测量转速地实现Word格式文档下载.docx_第11页
第11页 / 共11页
亲,该文档总共11页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

霍尔元件测量转速地实现Word格式文档下载.docx

《霍尔元件测量转速地实现Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《霍尔元件测量转速地实现Word格式文档下载.docx(11页珍藏版)》请在冰点文库上搜索。

霍尔元件测量转速地实现Word格式文档下载.docx

五、软件设计

由于实验箱已给出霍尔传感器测量转速的硬件电路,实验中只需要设计软件实现通过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开发和自身软件这一方面的学习。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > PPT模板 > 其它模板

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2