福州布衣 发表于 2018-11-1 19:39:04

霍尔电机测速实验

硬件: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();
}

效果视频:https://pan.baidu.com/s/1NlB04nIkPwOJTuq0sv2Qvg


页: [1]
查看完整版本: 霍尔电机测速实验