龙空技术网

Arduino 实例(三十)PID调速带霍尔编码器的电机

Snail先生 187

前言:

目前姐妹们对“l298n的ena两个引脚怎么接”可能比较讲究,看官们都需要了解一些“l298n的ena两个引脚怎么接”的相关内容。那么小编同时在网上收集了一些关于“l298n的ena两个引脚怎么接””的相关资讯,希望兄弟们能喜欢,朋友们一起来学习一下吧!

本实例可以向串口输入目标转速,电机通过编码器进行调速,并达到目标转速。输入的目标转速为正或负时,电机转速不同。

1 带霍尔编码器的电机

2 接线

UNO引脚

外设引脚

2

编码器A相

5

编码器B相

3

L298N驱动IN1

4

L298N驱动IN2

7

L298N驱动ENA

5V

面包板+

GND

面包板-

编码电机引脚

所接引脚

电机线﹢

L298N驱动AOUT2

电机线 -

L298N驱动AOUT1

编码器5v

面包板+

编码器GND

面包板-

L298N

所接引脚

5V

面包板﹢

GND

面包板-

12V

驱动12V电源+

3 实物连接图

4 程序

const unsigned int Motor_PWM=7;const unsigned int L298N_IN1=3;const unsigned int L298N_IN2=4;int value;#include <FlexiTimer2.h>    //定时中断  #define ENCODER_A 2#define ENCODER_B 5String Target_Value;int Velocity,Count=0;float Velocity_KP =7.2, Velocity_KI =0.68,Target=0;int startPWM=0;              int PWM_Restrict=255;void setup() {  Serial.begin(9600);             Serial.println("/*****开始驱动*****/");  pinMode(ENCODER_A,INPUT);  pinMode(ENCODER_B,INPUT);  pinMode(L298N_IN1,OUTPUT);     pinMode(L298N_IN2,OUTPUT);   pinMode(Motor_PWM,OUTPUT);  FlexiTimer2::set(5, control);  //5毫秒定时中断函数,每5s执行一次control函数  FlexiTimer2::start ();      //中断使能   attachInterrupt(0, READ_ENCODER_A, CHANGE);           }void loop() { while(Serial.available()>0)          //检测串口是否接收到了数据  {    Target_Value=Serial.readString();  //读取串口字符串    Target=Target_Value.toFloat();     //将字符串转换为浮点型,并将其赋给目标值    Serial.print("目标转速频率:");      //串口打印出设定的目标转速    Serial.println(Target);  }}void control(){             Velocity=Count;    //单位时间内读取位置信息        Count=0;           //并清零        value=Incremental_PI_A(Velocity,Target);        Set_PWM(value);               }void READ_ENCODER_A() {    if (digitalRead(ENCODER_A) == HIGH)     {          if (digitalRead(ENCODER_B) == LOW)             Count++;  //根据另外一相电平判定方向     else             Count--;    }    else     {         if (digitalRead(ENCODER_B) == LOW)           Count--; //根据另外一相电平判定方向     else           Count++;    }}int Incremental_PI_A (int Encoder,int Target){  float Bias;   static float PWM=0,Last_bias=0;   Bias=Target-Encoder;                                  //计算偏差   PWM+=Velocity_KP*(Bias-Last_bias)+Velocity_KI*Bias;   //增量式PI控制器   if(PWM>PWM_Restrict)PWM=PWM_Restrict;                                   //限幅   if(PWM<-PWM_Restrict)PWM=-PWM_Restrict;                                 //限幅     Last_bias=Bias;                                       //保存上一次偏差    return PWM;                                           //增量输出}void Set_PWM(int motora) {   if (motora > 0)  {    digitalWrite(L298N_IN1,HIGH);    digitalWrite(L298N_IN2,LOW);    analogWrite(Motor_PWM, motora+startPWM);  }  else if(motora == 0)     {    digitalWrite(L298N_IN1,LOW);    digitalWrite(L298N_IN2,LOW);  }  else if (motora < 0)    {    digitalWrite(L298N_IN1,LOW);    digitalWrite(L298N_IN2,HIGH);        analogWrite(Motor_PWM, -motora+startPWM);  }}

5 实验效果

PID调速带霍尔编码器的电机 - 西瓜视频 (ixigua.com)

标签: #l298n的ena两个引脚怎么接