集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 1698|回复: 3

霍尔测速

[复制链接]
lllllv4 发表于 2011-1-5 14:00:43 | 显示全部楼层 |阅读模式
霍尔测电机转速的原理是什么?就是用mt法吗?有没有用vhdl语言编写的例程呢
IPO 发表于 2011-1-5 16:28:13 | 显示全部楼层
同文 同问
同文 同问
IPO 发表于 2011-1-5 16:30:59 | 显示全部楼层
霍尔测速电路测速是工农业生产中经常遇到的问题,学会使用单片机技术设计测速仪表具有很重要的意 义。 要测速, 首先要解决是采样的问题。 在使用模拟技术制作测速表时, 常用测速发电机的方法, 即将测速发电机的转轴与待测轴相连, 测速发电机的电压高低反映了转速的高低。 使用单片机进 行测速,可以使用简单的脉冲计数法。只要转轴每旋转一周,产生一个或固定的多个脉冲,并将 脉冲送入单片机中进行计数,即可获得转速的信息。 下面以常见的玩具电机作为测速对象,用 CS3020 设计信号获取电路,通过电压比较器实现 计数脉冲的输出, 既可在单片机实验箱进行转速测量, 也可直接将输出接到频率计或脉冲计数器, 得到单位时间内的脉冲数,进行换算即可得电机转速。这样可少用硬件,不需编程,但仅是对霍 尔传感器测速应用的验证。 1 脉冲信号的获得霍尔传感器是对磁敏感的传感元件,常用于开关信号采集的有 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 0~9 的字型码 // 单片机内部专用寄存器定义 //数据类型的宏定义 uchar code LK[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,} ;//数码管 uchar LK1[4]={0xfe,0xfd,0xfb,0xf7}; uint data z,counter; //定义无符号整型全局变量 lk //==================================================== void init(void) { TMOD=0X51; TH1=0; TL1=0; TH0=-(50000/256); TL0=-(50000%256); EA=1; ET0=1; 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]2=LK1[0];delay(10); P1=LK[(z/100)%10]2=LK1[1];delay(10); P1=LK[(z%100)/10]2=LK1[2];delay(10); P1=LK[z%10]2=LK1[3];delay(10); } //========================================= void main(void) { uint temp1,temp2; init(); for(;;) { //调用 init 初始化子函数 //主程序开始 //数码管显示 //延时程序 // IE=0X00; //EA // 1 0 ET1 0 ES 0 ET1 0 EX1 0 //定时器 t0 定时 50ms //定义名为 init 的初始化子函数 //init 子函数开始,分别赋值 //GATE // 0 C/T 1 M1 0 M0 1 GATE 0 C/T 0 M1 0 M0 1 //位选码 计数器 T1 定时器 T0 //计数器初始值 ET0 1 EX0 0 temp1=TL1;temp2=TH1; counter=(temp2<<8)+temp1; //z=counter; display(); } } // uint chushi=60; void timer0(void) interrupt 1 using 1 { TH0=-(50000/256); TL0=-(50000%256); // chushi--; // if(chushi<=0){ z=counter /0.5 ; //} TH0=0; TL1=0; } //每 50MS 清一次定时器 //读出速度 //定时器 t0 定时 50ms //无限循环语句结束 //主程序结束 //读出计数器值并转化为十进制 //===================================================
 楼主| lllllv4 发表于 2011-1-6 15:47:41 | 显示全部楼层
那位大哥,我要的是用vhdl语言编写的例程!你的回答太繁琐了,能不能简练一点
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|集成电路技术分享 ( 京ICP备20003123号-1 )

GMT+8, 2024-5-17 19:07 , Processed in 0.069336 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表