Arduino_UNO霍尔编码器测速(代码开源 照搬即用)

    博主最近在准备电赛,需要用到编码器测速、调速功能,但是发现网上开源资料质量参差不齐。我个人学习的过程中也尝试了许多方法。其实有很多开源代码并不能直接使用,有的库适用面很窄,亦或是有的代码实现功能极其不稳定,今天我就给大家分享一下我看了众多资料后写出的新的解决方法,希望能帮助到大家。我使用的Arduino_UNO主控,L298N驱动模块,搭配有霍尔编码器的GM25-370直流减速电机。

一、模块介绍

1、霍尔编码器

  • 原理  :霍尔编码器是一种由霍尔码盘(磁环)和霍尔元件组成,通过磁电转换将输出轴上的机械几何位移量转换成脉冲或数字量的传感器。霍尔码盘在一定直径的圆板上等分地布置有不同的磁极,与电动机同轴,电动机旋转时,霍尔元件检测输出若干脉冲信号,为判断转向,一般输出两组存在一定相位差的方波信号。                                                                    具体原理可参考编码器计数原理与电机测速原理——多图解析 - 知乎 (zhihu.com)
  • 编码器接线(博主用到是GM25-370直流减速电机)Arduino_UNO霍尔编码器测速(代码开源 照搬即用)_第1张图片

Arduino_UNO霍尔编码器测速(代码开源 照搬即用)_第2张图片

  • 说明:电机正负极接入电机驱动模块,编码器正负极直接供给5V电压和GND,A、B相输出引脚需要大家自行查找所使用单片机的中断引脚。

2、L298N电机驱动

  •   介绍:L298N是意法半导体集团旗下量产的一种电机驱动芯片,拥有工作电压高、输出电流大、驱动能力强、发热量低、抗干扰能力强等特点,通常用来驱动继电器、螺线管、电磁阀、直流电机以及步进电机。众所周知,电机是不能直接用单片机供电控制的,这时就需要一个驱动电机的模块,作为电机和单片机之间的桥梁,使得单片机发出的信号能驱动电机。
  • Arduino_UNO霍尔编码器测速(代码开源 照搬即用)_第3张图片
  •  接线

Arduino_UNO霍尔编码器测速(代码开源 照搬即用)_第4张图片

 Arduino_UNO霍尔编码器测速(代码开源 照搬即用)_第5张图片

二、系统连接

Arduino_UNO霍尔编码器测速(代码开源 照搬即用)_第6张图片

画的比较丑,但是博主真的尽力了。 看不懂的宝子 上图

Arduino_UNO  2 编码器A相
Arduino_UNO  3 L298N IN1
Arduino_UNO  4 L298N IN2
Arduino_UNO  5 L298N EN1
编码器电机线+ L298N OUT1
编码器电机线- L298N OUT2
编码器+ 5V
编码器- GND

(PS: Arduino_UNO可以使用充电宝供电)

三、完整源代码(带详细注释)

//电机接线
#define AIN1  3
#define AIN2  4
#define PWMA  5
#define AA  2      
                                                
int valA=0;
float  n;
int flag=0,pwm;
int speed_a=70,speed_b=750;//speed_a:自定速度初始值 speed_b:目标速度

unsigned long starttime,stoptime;//定时器
void timer()
{
  valA++;
  stoptime=millis(); 
   if((stoptime-starttime)>100) //每100秒记一次数
   { 
    detachInterrupt(0); //关中断
    flag=1;
   }
}
void setup() {
  pinMode(AIN1,OUTPUT);
  pinMode(AIN2,OUTPUT);
  pinMode(PWMA,OUTPUT);
  pinMode(AA,INPUT);
  Serial.begin(9600);
  attachInterrupt(0,timer,RISING); //上升沿开中断
  starttime=millis();
   Serial.println(starttime); 

}
void loop() {
  digitalWrite(AIN1,HIGH); 
  digitalWrite(AIN2,LOW);
  analogWrite(PWMA,speed_a); 
  
    if(flag==1)         //if()前面加while(1)不行
  
    { 
      n=valA;//*100/156.000;     //放大一百倍串口绘图
      Serial.println(n,3);
      valA=0;
      flag=0;
      if(n>speed_b) //如果编码器测得的实际速度大于我们设定的目标速度就减速
      {
        speed_a--;//speed 为60/100 r/s
      }
      else //如果编码器测得的实际速度小于我们设定的目标速度就加速
      {
        speed_a++;
      }
      
     delay(0);
      starttime=millis();
      attachInterrupt(0,timer,RISING); 
    }

}

好啦,今天的分享就到这里啦,如果有小伙伴对本篇文章的哪块有困惑,欢迎打在评论区我们一起交流讨论啊。如有错误的地方,欢迎大家批评指教。

你可能感兴趣的:(单片机,嵌入式硬件,开源)