硬件:Arduino UNO+LCD1602+DIY霍尔电机
目的:霍尔测速
结果:基本准确
代码如下:
//LCD+采用中断方式测量霍尔电机转速。
#define PinA 2 //霍尔传感器模块Do 脚
//中断0--接霍尔传感器模块 5V--有效信号低电平
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,6); //构造一个LiquidCrystal的类成员。使用数字IO ,12,11,5,4,3,6
volatile unsigned long time = 0; //中断函数中,会失效
volatile unsigned long time1 = 0; //速度的单位时间
volatile unsigned long count = 0; //计数值 如果变量要在中断中访问,要使用volatile进行申明
long num = 0;
long Speed=0;
int flag=0;
//初始化
void setup()
{
Serial.begin(9600); //窗口初始化
lcd.begin(16,2); //初始化LCD1602
lcd.print("Welcome to use!"); //液晶显示Welcome to use!
delay(1000); //延时1000ms
lcd.clear(); //液晶清屏
pinMode(PinA,INPUT); //D2脚为输入
attachInterrupt(0, blinkA, LOW); //注册中断0调用函数blinkA
time = millis(); //时间初值
time1 = millis(); //时间初值
}
//主体程序
void loop()
{
if(flag==0){
time1 = millis();
flag=1;
} else {
if ((millis() - time1)>=1000) {
Speed=count;
count=0;
flag=0;
}
}
while (num != Speed)
{
num = Speed;
lcd.setCursor(0,0); //设置液晶开始显示的指针位置
lcd.print("Speed Test!");
lcd.setCursor(0,1); //设置液晶开始显示的指针位置
lcd.print("Speed= ");
lcd.print(Speed/4); //霍尔电机有四块磁石.
lcd.print(" r/sec");
delay(100);
}
}
//中断0调用函数
void blinkA()
{
if ((millis() - time) > 15) //防抖动处理
count ++;
time = millis();
}
效果视频:
|