基于霍尔传感器的转速测量系统设计
基于霍尔传感器的
转速测量
姓名:**
班级:**
学号:**
指导老师:**
基于霍尔传感器的转速测量
摘要
本文介绍一种用STC89C51单片机测量小型电动机转速的方法,霍尔传感器的工作原理,阐述了霍尔传感器测速系统的工作过程,利用脉冲计数法实现了对转速的测量,通过LCD
直观地显示电机的转速值。结合硬件电路设计,采用模块化方法进行了软件设计。编制了电机转速的测量设计了测量模块、转速模块、显示模块等的C51程序。系统以单片机STC89C51为控制核心,用霍尔集成传感器作为测量小型直流电机转速的检测元件,经过单片机数据处理,用8位LED数码管动态显示小型直流电机的转速。
关键词:单片机;转速测量;霍尔传感器
背景:
在直流电机的多年实际运行的过程中,机械测速电机不足之处日益明显,其主要表现为直流测速电机DG中的炭刷磨损及交流测速发电机TG中的轴承磨损,增加了设备的维护工作量,也随着增加了发生故障的可能性;同时机械测速电机在更换炭刷及轴承的检修作业过程中,需要将直流电动机停运,安装过程中需要调整机械测速电机轴与主电机轴的同轴度,延长了检修时间,影响了设备的长期平稳运行。
随着电力电子技术的不断发展,一些新颖器件的不断涌现,原有器件的性能也随着逐渐改进,采用电力电子器件构成的各种电力电子电路的应用范围与日俱增。因此采用电子脉冲测速取代原直流电动机械测速电机已具备理论基础,如可采用磁阻式、霍尔效应式、光电式等方式检测电机转速。
经过比较分析后,决定采用测速齿轮和霍尔元件代替原来的机械测速电机。霍尔传感器作为测速器件得到广泛应用。霍尔传感器是利用霍尔效应实现磁电转换的一种传感器。霍尔效应这种物理现象的发现,虽然已有一百多年的历史,但是直到20世纪40年代后期,由于半导体工艺的不断改进,才被人们所重视和应用。我国从70年代开始研究霍尔器件,经过20余年的研究和开发,目前已经能生产各种性能的霍尔元件,霍尔传感器具有灵敏度高、线性度好、稳定性高、体积小和耐高温等特点。
(一)转速的测量原理
转速是工程中应用非常广泛的一个参数,而随着大规模及超大规模集成电路技术的发展,数字测量系统得到普遍应用,利用单片机对脉冲数字信号的强大处理能力,应用全数字化的结构,使数字测量系统的越来越普及。在测量范围和测量精度方面都有极大的提高。转速的测量方法有很多,由于转速是以单位时间内的转速来衡量的,所以本文采用霍尔元器件测量转速。
霍尔器件是有半导体材料制成的一种薄片,其长为l,宽为b,厚度为d。若在垂直于薄片方向(即沿厚度d的方向)施加外磁场,在沿长为l的方向的两端面加外电场,则其内部会有一定的电流通过。由于电子在磁场中运动,所以将受到一个洛仑兹力,其大小为:
F=qVB,
式中:F为洛伦兹力;q为载流子电荷,V为载流子运动速度,B为磁感应强度。
由于受洛伦兹力,电子的运动方向轨迹将发生偏移,在霍尔元器件薄片的两个侧面分别产生电兹积聚或电荷过剩,形成霍尔电场。在霍尔器件两个侧面间形成的电位差为霍尔电压,其大小为:
U=RBI/d
式中:R为霍尔常数,I为控制电流。设K=R/d,它称为霍尔器件的灵敏系统,表示该霍尔元件在单位磁感应强度和单位控制电流下输出霍尔电动势的大小。若控制电流保持不变,则霍尔感应电压将随外界磁场强度而变化。
(二)转速测量系统组成框图
系统由霍尔元件传感器、信号预处理电路、处理器、显示器等部分组成。传感器部分采用霍尔传感器,负责将电机的转速转化为脉冲信号。信号预处理电路包含待测信号放大、波形变换、波形整形电路等部分,其中放大器实现对待测信号的放大,降低对待测信号的幅度要求,实现对小信号的测量;通过比较器使霍尔元件传感器产生的模拟信号转换成电压信号。处理器采用STC89C51单片机,显示器采用晶体管显示。系统组成框图如图所示。
转速测量系统组成框图
(三)单片机的介绍
本设计采用STC89C51芯片,芯片采用40脚双列直插式封装,32个I/O口,芯片工作电压3.8~5.5V,工作温度0~70°C(商业级),工作频率可高达30MHz,芯片的外形和引脚见下图
STC89C51引脚图
STC89C51 是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。使用高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在线系统可编程Flash,使得STC89C51为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。 STC89C51具有以下标准功能: 8k字节Flash,256字节RAM, 32 位I/O 口线,看门狗定时器,2 个数据指针,三个16 位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。另外,STC89C51可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。8 位微控制器 8K字节在系统可编程 Flash。P0~P3口结构,第一功能、第二功能请参考数据手册(STC89C51数据手册下载地址)。
其基本结构框图如图3-1,包括:
·一个8位CPU;
·4KB ROM;
·128字节RAM数据存储器;
·26个特殊功能寄存器SFR;
· 4个8位并行I/O口,其中P0、P2为地址/数据线,可寻址64KB ROM或64KB RAM;
·一个可编程全双工串行口;
·具有5个中断源,两个优先级,嵌套中断结构;
·两个16位定时器/计数器;
·一个片内震荡器及时钟电路;
STC89C51系列单片机中HMOS工艺制造的芯片采用双列直插(DIP)方式封装,有40个引脚。STC89C51单片机40条引脚说明如下:
(1)电源引脚。V CC正常运行和编程校验(8051/8751)时为5V电源,V SS为接地
(2)I/O总线。P0.0- P7.0(P0口),P0.1- P7.1(P1口),P0.2- P7.2(P2口),
P0.3- P7.3(P3口)为输入/输出引线。
(3)时钟。
XTAL1:片内震荡器反相放大器的输入端。
P3口线的第二功能定义
地址总线由P0口经地址锁存器提供8位地址(A0至A7);P2口直接提供8位地址(A8至A15)。
②数据总线(DB):数据总线宽度为8位,由P0提供。
③控制总线(CB):由P3口的第二功能状态和4根独立控制线RESET、EA、ALE、PSEN组成。
(四)系统原理设计
转速测量系统原理框图
系统软件框图
(五)硬件电路设计总图
在原理图基础上对各部分进行了详细的设计,硬件电路图如图所示。
硬件电路图
(六)单片机主控电路设计
系统选用 STC89C51 作为转速信号的处理核心。STC89C51 包含 2 个16位定时/计数器、4K×8 位片内 FLASH 程序存储器、4个8位并行I/O口。16 位定时/计数器用于实现待测信号的频率测量。8位并行口P0、P2用于把测量结果送到显示电路。4K×8 位片内FLASH 程序存储器用于放置系统软件。STC89C51与具有更大程序存储器的芯片管脚兼容,如:89C52(8K×8 位)或 89C55(32K×8 位),为系统软件升级打下坚实的物质基础。STC89C51最大的优点是:可直接通过计算机串口线下载程序,而无需专用下载线和编程器。
STC89C51单片机是在一块芯片中集成了CPU、RAM、ROM、定时器/计数器和多功能I/O 口等一台计算机所需要的基本功能部件。其基本结构框图如图3.1,包括:·一个8位CPU;
·4KB ROM;
·128字节RAM数据存储器;
(七)电路的整机原理图的设计
霍尔器件是由半导体材料制成的一种薄片,器件的长、宽、高分别为 l 、b、d。若在垂直于薄片平面(沿厚度 d)方向施加外磁场B,在沿l方向的两个端面加一外电场,则有一定的电流流过。由于电子在磁场中运动,所以将受到一个洛仑磁力,其大小为:qVB f =
式中:f —洛仑磁力, q—载流子电荷, V—载流子运动速度, B—磁感应强度。 这样使电子的运动轨迹发生偏移,在霍尔元器件薄片的两个侧面分别产生电子积聚或电荷过剩,形成霍尔电场,霍尔元器件两个侧面间的电位差H U 称为霍尔电压。
霍尔电压大小为: H U H R =d B I /??(mV)
式中:H R —霍尔常数, d—元件厚度, B—磁感应强度, I—控制电流
设 H K H R =d /, 则H U =H K d B I /??(mV)
H K 为霍尔器件的灵敏系数(mV/mA/T),它表示该霍尔元件在单位磁感应强度和单位控
制电流下输出霍尔电动势的大小。应注意,当电磁感应强度B反向时,霍尔电动势也反向。
若控制电流保持不变,则霍尔感应电压将随外界磁场强度而变化,根据这一原理,可以将两块永久磁钢固定在电动机转轴上转盘的边沿,转盘随被测轴旋转,磁钢也将跟着同步旋转,在转盘附近安装一个霍尔元件,转盘随轴旋转时,霍尔元件受到磁钢所产生的磁场影响,输出脉冲信号。传感器内置电路对该信号进行放大、整形,输出良好的矩形脉冲信号,测量频率范围更宽,输出信号更精确稳定,已在工业,汽车,航空等测速领域中得到广泛的应用。其频率和转速成正比,测出脉冲的周期或频率即可计算出转速
转速测量系统安装图
(八)软件设计
第一步分析问题,明确任务要求,对于复杂的问题,还要讲要解决的问题抽象成数学模型,即用数学表达式来描述。
第二步确定算法,即根据实际问题和指令系统的特点确定完成这一任务须经历的步骤。
第三步根据所选择的算法,确定内存单元的分配:使用那些寄存器:程序运行中的中间数据及结果存放在那些单元,以利于提高程序的效率和运行速度:然后制定出解决问题的步骤和顺序,画出程序的流程图。
第四步根据流程图,编写源程序。
第五步上机对原程序进行编译、调试。
程序代码:
霍尔测速
#include
#define uchar unsigned char
#define uint unsigned int
sbit lcden=P3^4;
sbit lcdrs=P3^5;
uint mm,n;
int i;
uchar qian,bei,shi,ge;
uint jj;
char speed[]="the speed is: ";
char table[]="0123456789";
/*------------------------延时程序-------------------------*/
void delay(uchar i)
{
uchar j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
/*------------------------显示函数-------------------------*/ /*----------------------确定每秒转速-----------------------*/ /*------------------------确定位置-------------------------*/
void write_com(uchar com)
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
lcden=0;
write_com(0x38);//设置16X2显示,5X7点阵,8位数据接口write_com(0x0c);//设置开显示,不显示光标
write_com(0x06);//写一个字符后地址指针加1
write_com(0x01);//显示清零,数据指针清零
}
void xian_shi()
{
if(n>=20) //每秒刷新一次速度
{
jj=mm;
n=0;
mm=0;
}
qian=jj/1000;
bei=jj%1000/100;
shi=jj%100/10;
ge=jj%10;
write_com(0xc0+5);
write_data(table[qian]);
write_data(table[bei]);
write_data(table[shi]);
write_data(table[ge]);
write_data('M');
write_data('/');
write_data('S');
}
/*------------------------主函数-------------------------*/ void main()
{
EA=1;
IT0=1;//外部中断开启标志
EX0=1;
TR0=1;
ET0=1;//定时器中断开启标志
TMOD=0X01;//定时器控制方式
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
init();
for(i=0;i<16;i++)
{
write_data(speed[i]);
}
while(1)
{
xian_shi();
}
}
/*-------------------外部中断0计数程序-------------------*/ void counter(void) interrupt 0
{
EX0=0; //关外部中断0
mm++;//计数加1
EX0=1;
}
/*------------------定时中断0计数程序-------------------*/ void time1(void) interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
n++;
}
步进电机程序:
#include
#define uchar unsigned char
sbit dula=P2^6;
sbit wela=P2^7;
sbit jia_key=P3^6;
sbit jian_key=P3^7;
sbit zf_key=P3^5;
bit flag=0;
uchar num=0,show_num=2,maichong=4,table_begin=0;
uchar code table1[]={0x01,0x02,0x04,0x08,0x08,0x04,0x02,0x01};
//uchar code table1[]={0x09,0x03,0x06,0x0c,0x08,0x04,0x02,0x01}; //uchar code table1[]={0x01,0x04,0x02,0x08,0x08,0x02,0x04,0x01};
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0 x7c,0x39,0x5e,0x79,0x71};
void delay(uchar i)
{
uchar j,k;
for(j=i;j>0;j--)
for(k=125;k>0;k--); }
void display()
{
dula=0;
P0=table[show_num];
dula=1;
dula=0;
wela=0;
P0=0xfe;
wela=1;
wela=0;
delay(5);
P0=table[0];
dula=1;
dula=0;
P0=0xfd;
wela=1;
wela=0;
delay(5);
}
void key ()
{
if(jia_key==0)
{
delay(5);
if(jia_key==0)
{
num++;
if(num==4)
num=3;
while(jia_key==0); }
}
if(jian_key==0)
{
delay(5);
if(jian_key==0)
{
if(num!=0)
num--; else
num=0;
while(jian_key==0);
}
}
if(zf_key==0)
{
delay(5);
if(zf_key==0) {
flag=~flag;
while(zf_key==0);
}
}
}
void dispose()
{
switch(num)
{
case 0:
show_num=2;
maichong=5; break;
case 1:
show_num=4;
maichong=4; break;
case 2:
show_num=6;
maichong=3; break;
case 3:
show_num=8;
maichong=2; break;
}
if(flag==0)
{