搜索
热搜: ROHM 模拟 车载
查看: 1950|回复: 3

[分享] 罗姆传感器评估套件-霍尔传感器制作简易速度计3

  [复制链接]

该用户从未签到

2248

主题

1万

帖子

1

精华

论坛元老

最后登录
2024-5-2
发表于 2018-11-1 08:45:20 | 显示全部楼层 |阅读模式

3.基于霍尔传感器的简易速度计的程序
在了解移位寄存器的使用方法和复习7段LED之后,我们开始实际设计速度计的程序。具体的程序流程是以按一定间隔(此次为1秒钟)获取的转速为基础,计算时速的程序。假设为每转1圈前进0.5m时,1秒钟检测到2次时为0.5m×2次 = 前进1m。将其换算为1小时即可求出时速。
程序的关键在于,对7段LED就像之前也操作过的那样,通过在短时间内切换显示第1~3位来实现3位显示,和获取millis()函数处理时机的时间,按一定时间计算速度并在7段LED上显示的原理。

程序 – 简易速度计的程序

#include <BD7411.h>



long _beforetime = 0;



//传感器用

int _hallout_pin = 0; // use D0 pin

int _cnt = 0;

bool _flg = false;

unsigned long _starttime = 0;

BD7411 bd7411;



//移位寄存器用

#define SCK_PIN 13

#define RCK_PIN 10

#define SI_PIN  11



//位数控制用

#define DP1 2

#define DP2 3

#define DP3 4



//

float _meter  = 1;  //每转1圈的距离数

float _speedVal  = 0;





//7段LED的数字排列

const int digits[10] = {

0b00111111, // 0

0b00000110, // 1

0b01011011, // 2

0b01001111, // 3

0b01100110, // 4

0b01101101, // 5

0b01111101, // 6

0b00100111, // 7

0b01111111, // 8

0b01101111, // 9

};



void setup(){

Serial.begin(9600);

while (!Serial);

bd7411.init(_hallout_pin);



pinMode(SCK_PIN, OUTPUT);

pinMode(RCK_PIN, OUTPUT);

pinMode(SI_PIN,  OUTPUT);

pinMode(DP1,  OUTPUT);

pinMode(DP2,  OUTPUT);

pinMode(DP3,  OUTPUT);



_beforetime = millis();

}



void loop() {

int hallout;



hallout = bd7411.readoutpin();

if (hallout == 0 && _flg == false) {

if(_starttime == 0){

_starttime = millis();

}

Serial.print("BD7411G Magnet field Detect! - ");

_flg  = true;

_cnt++;

Serial.print(hallout);

Serial.print("-");

Serial.println(_cnt);

}

else{

_flg  = false;

}





//超过从上一次闪烁开始的经过时间(1秒)后刷新速度

if (millis() - _beforetime > 1000) {

_beforetime = millis();

//计算速度并在7段LED上显示

float sp  = _meter * _cnt * 60*60 / 1000;  //速度=距离(_meter*_cnt)÷时间(60秒×60分)/1000(为了做成仪表单位)

_speedVal  = sp * 10;

Serial.print("SPEED:");

Serial.println(_speedVal);

_cnt  = 0;

}

SEGMENT_OUT((int)_speedVal);

delay(1);

}



void SEGMENT_OUT(int num){

for(int i = 0; i < 3; i++){

int disp_num  = 0;

int dots      = 0;

//第1位的处理

if(i==0){

disp_num = NumParse(num,1);

digitalWrite(DP1, LOW);

digitalWrite(DP2, HIGH);

digitalWrite(DP3, HIGH);

}

//第2位的处理

else if(i==1){

dots  =  0b10000000;

disp_num  = NumParse(num,2);

digitalWrite(DP2, LOW);

digitalWrite(DP1, HIGH);

digitalWrite(DP3, HIGH);

}

//第3位的处理

else if(i==2){

disp_num  = NumParse(num,3);

digitalWrite(DP3, LOW);

digitalWrite(DP1, HIGH);

digitalWrite(DP2, HIGH);

}



digitalWrite(RCK_PIN, LOW);

shiftOut(SI_PIN, SCK_PIN, MSBFIRST, digits[disp_num]+dots);

digitalWrite(RCK_PIN, HIGH);

delay(3);

}

}



//将3位逐一分解的函数

int NumParse(int Number,int s){

int val[3];

val[0] = (Number % 10); Number /= 10; // 取出第1位

val[1] = (Number % 10); Number /= 10; // 取出第2位

val[2] = (Number % 10); Number /= 10; // 取出第3位

return val[s-1];

}

可以看出接近或远离磁铁后,速度会随之刷新。

装到自行车上试试
准备完成后,将其实际装上自行车。此次,将以100日元均价购买的强力磁铁安装在自行车的后轮上(轮胎的框架是金属的,因此直接吸住磁铁)并固定,以使磁铁与传感器接近。磁铁与传感器的距离需要稍稍调整,因此用遮蔽胶带固定传感器。
1.jpg
传感器固定完成后,实际转动轮胎以测试传感器有无反应。快速旋转时,确认到显示的数值发生变化!

基于霍尔传感器的简易速度计的总结
此次,我们使用霍尔传感器制作了简易速度计。使用传感器评估套件时,或不使用时,随着制作设备的经验增加,发现Arduino的引脚数太少的情况会越来越多。这时,通过使用移位寄存器等方法,可以制作扩展性更强的设备。下次,将继续介绍传感器评估套件中的其他传感器!



回复

使用道具 举报

该用户从未签到

0

主题

187

帖子

0

精华

高级会员

最后登录
2019-3-26
发表于 2018-11-1 08:50:11 | 显示全部楼层
哦哦哦
回复

使用道具 举报

该用户从未签到

205

主题

1万

帖子

0

精华

论坛元老

最后登录
2023-6-10
发表于 2018-11-1 10:58:24 | 显示全部楼层
看看
回复

使用道具 举报

该用户从未签到

49

主题

2250

帖子

0

精华

论坛元老

最后登录
2020-12-15
发表于 2018-11-1 13:53:35 | 显示全部楼层
感谢分享                           
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

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

Archiver|手机版|小黑屋|罗姆半导体技术社区

GMT+8, 2024-5-5 06:40 , Processed in 0.098451 second(s), 16 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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