‘壹’ 霍尔3144传感器怎么测速,求大神教,最好有c语言程序
测速有M法T法,高速就数单位时间脉冲的个数,低速就测脉冲的间隔
‘贰’ 关于霍尔传感器测速的问题(单片机),原理就是磁铁在转盘上,每转一圈,霍尔的out口就产生一个脉冲
每次霍尔靠近磁铁都会有一个脉冲信号,你用定时器记录一周花的时间,测一下你的车轮长。就出来了
‘叁’ s7-200smart如何接霍尔信号
1、确认所使用的霍尔传感器电压等级(通常为5V或12V)和输出信号类型(通常为开友毕关量或模拟行告罩量)。
2、根据霍尔传感器的电压等级,选择合适的数字输入模块或模拟输入模块,并将其插入S7-200Smart的接口模块位置。
3、将霍尔传感器的输出信号线连接到数字输入模块或模拟输入模块的相应端口上。
4、在S7-200Smart的编程软件中,配置相应的输入端口和信号类型,编写相档闹应的程序进行霍尔传感器信号的处理。
‘肆’ 3144霍尔传感器怎么用,引脚怎么接单片机,外部中断怎么写,求大神带
中断设置成负跳变触发,引脚的话,信号接外部中断,如果电源和单片机电源共地,
‘伍’ 单片机测车轮速度,我把程序的思路写下来了,好多都不知道怎么实现,而且也不知道有的错怎么解决
停止运行。在else后面加break //一分钟之后赋值并跳出循环
液晶显示。看是什么裂野液晶显示器埋源拍,找一个弯羡液晶函数,输入是speed。
程序:
speed=speedNum/60; 液晶函数(speed);break;
具体结果要调试一下
‘陆’ 用c语言编写控制电机运动的程序
1、有三个输入,分别是一个按钮、两个霍尔传感器(也就是接近开关),我用P0.0到P0.2来代替;输出2个或以上(这看接什么显示器,如果是PC的话,就不用数字量输出,直接串口就可以了)控制正反转的继电器管脚用P1.0、P1.1;需要与一个全局变量转动次数k连接起来,另外两个输入接近开关选用NPN传感器或用光电隔离,总之有效信号能把管脚电压拉低就可以。
2、例程:
#include<reg51.h>//选用晶振11.0592MHz
unsignedchark=0;//k表示正反转次数
sbitX0=P3^2;//调节按钮
sbitX1=P1^1;//上限位接近开关信号
sbitX2=P1^2;//下限位接近开关信号
sbitY1=P0^0;//电机上升(注意:我使用的是管脚输出为0时候,电机运动,这样可以避免启动时候,单片机自复位对电机点动的影响)
sbitY2=P0^1;//电机下降
voiddelay50ms(unsignedinti)
{
unsignedintj;
for(i;i>0;i--)
for(j=46078;j>0;j--);
}
main()
{
IT0=1;//下降沿触发
EX0=1;//开P3.2外部中断
EA=1;//总中断开
while(1)
while(k)
{
Y1=0;//正转
while(X1==1);//等待正转接近开关反应
Y1=1;//正转停
delay50ms(1);//停止时间50ms
Y2=0;//反转
while(X2==1);//等待反转接近开关反应
Y2=1;//反转停
k--;//圈数减一
}
}
voidcounter0(void)interrupt0
{
k++;//外部中断控制圈数加一
//这个位置可以加你显示程序
}
‘柒’ 我想问一下这个霍尔模块怎么和单片机连,怎么用单片机检测和计数
VCC接梁态5V 电压 ,GND接GND ,DO接单片机IO口 常态为高。橡型源
磁性物体每经过模块左边的那个类是三极管的 A3144 霍尔传感器一次,接DO的单片机IO口被拉低一次。单片机租键内部程序监视IO口电平变化进行相关逻辑运算即可
‘捌’ 求利用3144霍尔元件做测速器的编程和线路图~
产品说明:
产品名称:ZH3144
产品类别:单输出霍尔开关集成电路
产品规格:4-20V
产品型号:ZH3144
产品说明:*电源电压范围宽,输出电流大。*开关速度快,无瞬间抖动。*工作频率宽(0~100KHz)。*寿命长、体积小、安装方便。*能直接和逻辑电路接口。
应用场合*直流无刷电机无触点开关*位置控制电流传感器*汽车点火器安全报警装置*隔离检测转速检测
霍尔传感器是对磁敏感的传感元件,常用于开关信号采集的有CS3020、CS3040等,这种传感器是一个3端器件,外形与三极管相似,只要接上电源、地,即可工作,输出通常是集电极开路(OC)门输出,工作电压范围宽,使用非常方便。如图1所示是CS3020的外形图,将有字面对准自己,三根引脚从左向右分别是Vcc,地,输出。
图1 CS3020外形图
使用霍尔传感器获得脉冲信号,其机械结构也可以做得较为简单,只要在转轴的圆周上粘上一粒磁钢,让霍尔开关靠近磁钢,就有信号输出,转轴旋转时,就会不断地产生脉冲信号输出。如果在圆周上粘上多粒磁钢,可以实现旋转一周,获得多个脉冲输出。在粘磁钢时要注意,霍尔传感器对磁场方向敏感,粘之前可以先手动接近一下传感器,如果没有信号输出,可以换一个方向再试。这种传感器不怕灰尘、油污,在工业现场应用广泛。
2 硬件电路设计
测速的方法决定了测速信号的硬件连接,测速实际上就是测频,因此,频率测量的一些原则同样适用于测速。
通常可以用计数法、测脉宽法和等精度法来进行测试。所谓计数法,就是给定一个闸门时间,在闸门时间内计数输入的脉冲个数;测脉宽法是利用待测信号的脉宽来控册大仿制计数门,对一个高精度的高频计数信号进行计数。由于闸门与被测信号不能同步,因此,这两种方法都存在±1误差的问题,第一种方法适用于信号频率高时使用,第二种方法则在信号频率低时使用。等精度法则对高、低频信号都有很好的适应性。
图2是测速电路的信号获取部分,在电源输入端并联电容C2用来滤去电源尖啸,使霍尔元件稳定工作。HG表示霍尔元件,采用CS3020,在霍尔元件输出端(引脚3)与地并联电容C3滤去波形尖峰,再接一个上拉电阻R2,然后将其接入LM324的引脚3。用LM324构成一个电压比较器,将霍尔元件输出电压与电位器RP1比较得出高低电平信号给单片机读取。C4用于波形整形,以保证获得良好数字信号。LED便于观察,当比较器输出高电平时不亮,低电平时亮。微型电机M可采用 型,通过电位器RP1分压,实现提高或降低电机转速的目的。C1电容使电机的速度不会产生突变,因为电容能存储电荷。
电压比较器的功能:比较两个电压的大小(用输出电压的高或低电平,表示两个输入电压的大小关系):
当州纤“+”输入端电压高于“-”输入端时,电压比较器输出为高电平;
当“+”输入端电压低于“-”输入端时,电压比较器输出为低电平;
比较器还有整形的作用,利用这一特点可使单片机获得良好稳定的输出信号,不至于丢失信号,能提高测速的精确性和稳定性。
图.2 测速电路原理图
3 测速程序
测量转速,使用霍尔传感器,被测轴安装有1只磁钢,即转轴每转一周,产生1个脉冲,要求将转速值(转/分)显示在数码管上。
用C语言编制的程序如下:
//硬件:老版STC实验版
//P3-5口接转速脉冲
#include <STC12C5410AD.H> // 单仿桐片机内部专用寄存器定义
#define uchar unsigned char
#define uint unsigned int //数据类型的宏定义
uchar code LK[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,} ;//数码管0~9的字型码
uchar LK1[4]={0xfe,0xfd,0xfb,0xf7}; //位选码
uint data z,counter; //定义无符号整型全局变量lk
//====================================================
void init(void) //定义名为init的初始化子函数
{ //init子函数开始,分别赋值
TMOD=0X51; //GATE C/T M1 M0 GATE C/T M1 M0 计数器T1 定时器T0
// 0 1 0 1 0 0 0 1
TH1=0; //计数器初始值
TL1=0;
TH0=-(50000/256); //定时器t0 定时50ms
TL0=-(50000%256);
EA=1; // IE=0X00; //EA - ET1 ES ET1 EX1 ET0 EX0
ET0=1; // 1 0 0 0 0 0 1 0
TR1=1;
TR0=1;
TF0=1;
}
//=============================================
void delay(uint k)//延时程序
{
uint data i,j;
for(i=0;i<k;i++)
{
for(;j<121;j++) {;}
}
}
//================================================
void display(void) //数码管显示
{
P1=LK[z/1000];P2=LK1[0];delay(10);
P1=LK[(z/100)%10];P2=LK1[1];delay(10);
P1=LK[(z%100)/10];P2=LK1[2];delay(10);
P1=LK[z%10];P2=LK1[3];delay(10);
}
//=========================================
void main(void) //主程序开始
{
uint temp1,temp2;
init(); //调用init初始化子函数
for(;;)
{
temp1=TL1;temp2=TH1;
counter=(temp2<<8)+temp1; //读出计数器值并转化为十进制
//z=counter;
display();
} //无限循环语句结束
} //主程序结束
//===================================================
// uint chushi=60;
void timer0(void) interrupt 1 using 1
{
TH0=-(50000/256); //定时器t0 定时50ms
TL0=-(50000%256);
// chushi--;
// if(chushi<=0){
z=counter /0.5 ; //读出速度
//}
TH0=0; //每50MS清一次定时器
TL1=0;
}
霍尔测速
测速是工农业生产中经常遇到的问题,学会使用单片机技术设计测速仪表具有很重要的意义。要测速,首先要解决是采样的问题。在使用模拟技术制作测速表时,常用测速发电机的方法,即将测速发电机的转轴与待测轴相连,测速发电机的电压高低反映了转速的高低。使用单片机进行测速,可以使用简单的脉冲计数法。只要转轴每旋转一周,产生一个或固定的多个脉冲,并将脉冲送入单片机中进行计数,即可获得转速的信息。
下面以常见的玩具电机作为测速对象,用CS3020设计信号获取电路,通过电压比较器实现计数脉冲的输出,既可在单片机实验箱进行转速测量,也可直接将输出接到频率计或脉冲计数器,得到单位时间内的脉冲数,进行换算即可得电机转速。这样可少用硬件,不需编程,但仅是对霍尔传感器测速应用的验证。
1 脉冲信号的获得
霍尔传感器是对磁敏感的传感元件,常用于开关信号采集的有CS3020、CS3040等,这种传感器是一个3端器件,外形与三极管相似,只要接上电源、地,即可工作,输出通常是集电极开路(OC)门输出,工作电压范围宽,使用非常方便。如图1所示是CS3020的外形图,将有字面对准自己,三根引脚从左向右分别是Vcc,地,输出。
‘玖’ 用单片机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);
}
‘拾’ 本人采用单片机STC89C54RD+做了一个设计,其中定时器0和1已经用了,现在还想加一个霍尔传感器做测速用,
本人采用单片机STC89C54RD+做了一个设计,其中定时器0和1已经用了,现在还想加一个霍尔传感器做测速用,
将传感器的信号线接外部中断0,这个决定非汪岁常正确!
问题是只用一个外部中断0可以实现测速吗?完全可以,一点不打折。
如果不行要怎么改?银帆肯定能行。
定时器可以叠加使用吗?加一个定时器2可以实现吗?要怎么设置呢?
不要这么麻烦。
现在说解锋陵雹决方法:
1、定义一个全局变量,unsigned int huoer; //霍尔计数器
2、定义一个全局变量,unsigned int hr_time; //霍尔计数的时间
3、外部中断0服务函数中, huoer++; //增量霍尔计数
4、在一个定时时间比较长的定时中断中,hr_time++; //霍尔计数的时间累计,用条件判断适时停止hr_time增量(时间到了)
5、 主程序中,转速=huoer/hr_time