㈠ 51单片机和霍尔元件测速问题!!!急急急!!!
我怎么没有看到你调用变量的显示函数、
㈡ 51单片机系统中怎么测直流电机的转速,方法有几种及各方法原理是什么
1电源引出脉冲信号,放大整形,根据极数算出转数,可能电源要加个小电感。
2用霍尔元件,在轴上置磁铁,测出转速
3轴上涂一半反光,一半不反光涂料,发光管-光敏管接收,放大整形,不可强光干扰
4轴上装扇叶,发光管-光敏管接收,放大整形,不可强光干扰
5轴上装旋转编码器,不但知道转速,还可知道角度,方向
㈢ 单片机仿真中,用什么代替霍尔传感器(protues)
Proteus里可以替代脉冲信号发生器的两个,一个工具条里的就是你说的DClock,还有一个是元件:CLOCK。这两者的用法是相似的。
㈣ 霍尔传感器在测量电机转速时,它如何与单片机连接啊 求个电路图 谢谢
2基于霍尔传感器的电机转速测量系统硬件设计
2.1电机转速测量系统的硬件电路设计
2.1.1总体硬件设计
使用单片机测量电机转速的基本结构如图2-1所示。该系统包括霍尔传感器、隔离整形电路、主CPU、显示电路、报警电路及电源等部分。
图2-1系统总体结构图
其测量过程是测量转速的霍尔传感器和电机机轴同轴连接,机轴每转一周,产生一定量的脉冲个数,由霍尔器件电路输出。经过电耦合器后,即经过隔离整形电路后,成为转数计数器的计数脉冲。同时霍尔传感器电路输出幅度为12V的脉冲经光电耦合后降为5V,保持同单片机AT89C51逻辑电平相一致,控制计数时间,即可实现计数器的计数值对应机轴的转速值。主CPU将该值数据处理后,在LCD液晶显示器上显示出来。一旦超速,CPU通过喇叭和转灯发出声、光报警信号。
1.传感器部分
主要分为两个部分。第一部分是利用霍尔器件将电机的转速转化为脉冲信号。霍尔测速模块由铁质的测速齿轮和带有霍尔元件的支架构成。测速齿轮如图2-2所示,齿轮厚度大约2mm,将其固定在待测电机的转轴上。将霍尔元件固定在距齿轮外圆1mm的探头上,霍尔元件的对面粘贴小磁钢,当测速齿轮的每个齿经过探头正前方时,改变了磁通密度,霍尔元件就输出一个脉冲信号。第二部分是使用六反相器和光耦,将传感器输出的信号进行整形隔离,减少计数的干扰。
测速齿轮霍尔元件
图2-2转速变换装置
2.处理器
采用AT89C51单片机作为系统的处理器。
3.显示部分
该部分有两个功能,在正常情况下,通过LCD液晶显示器显示当前的频率数值,当电机的转速超出一定的范围后,通过蜂鸣器进行报警。蜂鸣器是一种一体化结构的电子讯响器,采用直流电压供电,广泛应用于计算机、打印机、复印机、报警器、电子玩具、汽车电子设备、电话机、定时器等电子产品中作发声器件。
2.1.2系统电路设计
实际测量时,要把霍尔传感器固定在直流测速电机的底板上,与霍尔探头相对的电机的轴上固定着一片磁钢块,电机每转一周,霍尔传感器便发出一个脉冲信号,将此脉冲信号接到开发的多功能实验板上的P3.2[]上,设定T0定时,每分钟所计的进入P3.2的脉冲个数即为直流电机的转速。
由于在虚拟仿真电路图中,没有电机及传感器,所以就直接用一个脉冲信号代替,电路图如图2-3所示。
图2-3总体硬件电路图
2.2霍尔传感器测量电路设计
2.2.1霍尔元件
根据霍尔效应,人们用半导体材料制成的元件叫霍尔元件。它具有对磁场敏感、结构简单、体积小、频率响应宽、输出电压变化大和使用寿命长等优点,因此,在测量、自动化、计算机和信息技术等领域得到广泛的应用。
霍尔传感器A3144是AllegroMicroSystems公司生产的宽温、开关型霍尔效应传感器,其工作温度范围可达-40℃~150℃。它由电压调整电路、反相电源保护电路、霍尔元件、温度补偿电路、微信号放大器、施密特触发器和OC门输出极构成,通过使用上拉电阻可以将其输出接入CMOS逻辑电路。该芯片具有尺寸小、稳定性好、灵敏度高等特点,有两种封装形式,一种是3脚贴片微小型封装,后缀为“LH”;另一种是3脚直插式封装,后缀为“UA”[5]。
A3144E系列单极高温霍尔效应集成传感器是由稳压电源,霍尔电压发生器,差分放大器,施密特触发器和输出放大器组成的磁敏传感电路,其输入为磁感应强度,输出是一个数字电压讯号。它是一种单磁极工作的磁敏电路,适用于矩形或者柱形磁体下工作。可应用于汽车工业和军事工程中。
霍尔传感器的外形图和与磁场的作用关系如图2-4所示。磁场由磁钢提供,所以霍尔传感器和磁钢需要配对使用。
霍尔元件和磁钢管脚图
图2-4霍尔传感器的外形图
该霍尔传感器的接线图如图2-5所示。
图2-5霍尔传感器的接线图
2.2.2霍尔传感器测量原理
测量电机转速的第一步就是要将电机的转速表示为单片机可以识别的脉冲信号,从而进行脉冲计数。霍尔器件作为一种转速测量系统的传感器,它有结构牢固、体积小、重量轻、寿命长、安装方便等优点,因此选用霍尔传感器检测脉冲信号,其基本的测量原理如图2-6所示,当电机转动时,带动传感器运动,产生对应频率的脉冲信号,经过信号处理后输出到计数器或其他的脉冲计数装置,进行转速的测量[6]。
㈤ 如何用51单片机实现直流无刷电机的三路霍尔信号
你的意思是分别根据3路霍尔信号控制电机吗?如果是的话,是控制转速还是转向,你要说明白。
我的思路是:用3个IO口测霍尔信号,根据IO口的电平分别判断运行方式即可
㈥ 用单片机C51中的计数器来测霍尔传感器转一圈的时间程序
#include<reg52.h>
#include<Star1602.h>
#define CIRCLE 1.8 //宏定义 车轮的周长(这个要根据实际的车轮进行设置)
sbit Signal = P1^0; //这里的Signal表示的是霍尔传感器的信号引脚
int m_second=0; //定义变量m_second,用来记录时间(以毫秒为单位)
float speed=0.0 ; //定义速度变量
float length=0.0 ;//定义路程变量
void main()
{
lcd_init(); //初始化液晶函数
TMOD = 0x01; //打开定时器0,并设定其工作方式为16位定时模式。
TH0=(65536-10000)/ 256;
TL0=(65536-10000)% 256; //设定定时器的初值,使得没10ms中断一次
EA = 1; //允许总中断
ET0 = 1; //允许定时器0终端
TR0 = 1; //启动定时器0
while(1) //大循环
{
while(Signal); //等待霍尔传感器信号线拉低;
speed = CIRCLE *1000 / m_second ; //计算速度。
m_second = 0; //计时清零
length += CIRCLE ; //路程加一个车轮周期
//第一行,显示速度
lcd_pos(0x0); //设定液晶的写入位置为第一行第一格
lcd_wdat(‘S’);
lcd_wdat(‘p’);
lcd_wdat(‘e’);
lcd_wdat(‘e’);
lcd_wdat(‘d’);
lcd_wdat(‘:’);
lcd_wdat( (int)speed%10 ); //显示速度的整数部分
lcd_wdat( (int)(speed*10)%10 ); //显示速度的小数第一位
lcd_wdat( (int)(speed*100)%10 ); //显示速度的小数第二位
lcd_wdat(‘m’);
lcd_wdat(‘/’);
lcd_wdat(‘s’);
//第二行,显示里程
lcd_pos(0x80); //设定液晶的写入位置为第二行第一格
lcd_wdat(‘L’);
lcd_wdat(‘e’);
lcd_wdat(‘n’);
lcd_wdat(‘g’);
lcd_wdat(‘t’);
lcd_wdat(‘h’);
lcd_wdat(‘:’);
lcd_wdat(length /10000+0x30); //显示里程的万位;
lcd_wdat(length %10000/1000+0x30); //显示里程的千位;
lcd_wdat(length %1000/100+0x30); //显示里程的百位;
lcd_wdat(length %100/10+0x30); //显示里程的十位;
lcd_wdat(length %10+0x30); //显示里程的个位;
lcd_wdat(‘m’);
}
}
void timer0_intt() interrupt 1 //
{
TH0=(65536-10000)/ 256;
TL0=(65536-10000)% 256; //设定定时器的初值,使得没10ms中断一次
m_second += 10; //因为中断每10毫秒一次,所以这里每次加10;
}
附件1 Star1602.h
#ifndef __STAR1602_H__
#define __STAR1602_H__
sbit rs= P2^0; //
sbit rw = P2^1; //
sbit ep = P2^2; //
void lcd_init(); //液晶初始化函数
void lcd_pos(unsigned char pos); //设定液晶的显示位置函数
void lcd_wdat(unsigned char dat); //液晶写入字符
void lcd_write_int(unsigned int x); //液晶显示一个整形变量
#endif
附件2 Star1602.c
#include <reg52.h>
#include "1602.h"
/*****************************************************************************
函数功能:LCD延时子程序
入口参数:ms
出口参数:
*****************************************************************************/
static void delay(unsigned char ms)
{
unsigned char i;
while(ms--)
{
for(i = 0; i< 5; i++);
}
}
/*****************************************************************************
函数功能:测试LCD忙碌状态
入口参数:
出口参数:result
*****************************************************************************/
static bit lcd_bz()
{
bit result;
rs = 0;
rw = 1;
ep = 1;
delay(5);
result = (bit)(P0 & 0x80);
ep = 0;
return result;
}
/*****************************************************************************
函数功能:写指令数据到LCD子程序
入口参数:cmd
出口参数:
*****************************************************************************/
static void lcd_wcmd(unsigned char cmd)
{
while(lcd_bz()); //判断LCD是否忙碌
rs = 0;
rw = 0;
ep = 0;
delay(5);
P0 = cmd;
delay(5);
ep = 1;
delay(5);
ep = 0;
}
/*****************************************************************************
函数功能:设定显示位置子程序
入口参数:pos
出口参数:
*****************************************************************************/
void lcd_pos(unsigned char pos)
{
lcd_wcmd(pos | 0x80);
}
/*****************************************************************************
函数功能:写入显示数据到LCD子程序
入口参数:dat
出口参数:
*****************************************************************************/
void lcd_wdat(unsigned char dat)
{
while(lcd_bz()); //判断LCD是否忙碌
rs = 1;
rw = 0;
ep = 0;
P0 = dat;
delay(5);
ep = 1;
delay(5);
ep = 0;
}
/*****************************************************************************
函数功能:LCD初始化子程序
入口参数:
出口参数:
*****************************************************************************/
void lcd_init()
{
lcd_wcmd(0x38);
delay(100);
lcd_wcmd(0x0c);
delay(100);
lcd_wcmd(0x06);
delay(100);
lcd_wcmd(0x01);
delay(100);
}
/*****************************************************************************
函数功能:LCD写入一个整形数据
入口参数:int x
*****************************************************************************/
void lcd_write_int(unsigned int x);
{
unsigned char x1,x2,x3,x4,x5;
x1 = x/10000;
x2=x%10000/1000;
x3=x%1000/100;
x4=x%100/10;
x5=x%10;
lcd_wdat(x1+0x30);
lcd_wdat(x2+0x30);
lcd_wdat(x3+0x30);
lcd_wdat(x4+0x30);
lcd_wdat(x5+0x30);
}