教程二 带编码器电机控制例程二

来自Waveshare Wiki
跳转至: 导航搜索

各模块使用教程

带编码器电机控制例程二

本教程是用于控制电机的正反转,快速和慢速转,以下提供控制电机转动的例程。

例程

上传程序

下载压缩包打开motorCtrl.ino,用USB线将多功能驱动板和计算机连接起来(此处插入的是多功能驱动板USB的Type-C接口),点击“工具”→“端口”,再点击新出现的COM(我这里新出现的COM为COM26)。
二1.png
在Arduino IDE中,点击“工具”→“开发板”→“ESP32”→“ESP32 Dev Module”。开发板以及端口都选择好后上传程序。上传程序后,将无编码器电机和驱动板上的电机接口PH2.0 2P连接上,将XH2.54供电接口接上电源后,可以看见电机开始快速正方向转动3s、慢速反方向转动3s再停转3s的循环。

程序解析

// 以下定义了用于控制TB6612的ESP32引脚
// A路电机
const uint16_t PWMA = 25;         // Motor A PWM control  Orange
const uint16_t AIN2 = 17;         // Motor A input 2      Brown
const uint16_t AIN1 = 21;         // Motor A input 1      Green

// B路电机
const uint16_t BIN1 = 22;        // Motor B input 1       Yellow
const uint16_t BIN2 = 23;        // Motor B input 2       Purple
const uint16_t PWMB = 26;        // Motor B PWM control   White

// 用于PWM输出的引脚的PWM频率
int freq = 100000;

// 定义PWM通道
int channel_A = 5;
int channel_B = 6;

// 定义PWM的精度,精度为8时,PWM数值在0-255(2^8-1)
const uint16_t ANALOG_WRITE_BITS = 8;
// 最大的PWM数值
const uint16_t MAX_PWM = pow(2, ANALOG_WRITE_BITS)-1;
// 最小的PWM数值,由于直流电机的低速特性一般比较差,过低的PWM达不到电机的转动阈值
const uint16_t MIN_PWM = MAX_PWM/5;


void setup(){
  // 设置用于控制TB6612FNG的ESP32引脚的工作模式
  pinMode(AIN1, OUTPUT);
  pinMode(AIN2, OUTPUT);
  pinMode(PWMA, OUTPUT);
  pinMode(BIN1, OUTPUT);
  pinMode(BIN2, OUTPUT);
  pinMode(PWMB, OUTPUT);

  // 设置用于PWM输出的ESP32引脚的通道、频率和精度
  ledcSetup(channel_A, freq, ANALOG_WRITE_BITS);
  ledcAttachPin(PWMA, channel_A);

  ledcSetup(channel_B, freq, ANALOG_WRITE_BITS);
  ledcAttachPin(PWMB, channel_B);

  // 用于控制转动的引脚置于低电平,电机停止转动,避免初始化后立即开始转动
  digitalWrite(AIN1, LOW);
  digitalWrite(AIN2, LOW);
  digitalWrite(BIN1, LOW);
  digitalWrite(BIN2, LOW);
}


// A路电机控制
void channel_A_Ctrl(float pwmInputA){
  // 将pwmInput值取整
  int pwmIntA = round(pwmInputA);
  if(pwmIntA == 0){
    digitalWrite(AIN1, LOW);
    digitalWrite(AIN2, LOW);
    return;
  }

  // 判断pwmInput值的正负来确定旋转方向
  if(pwmIntA > 0){
    digitalWrite(AIN1, LOW);
    digitalWrite(AIN2, HIGH);
    // constrain()函数用于将pwmIntA的值限制在MIN_PWM与MAX_PWM之间
    ledcWrite(channel_A, constrain(pwmIntA, MIN_PWM, MAX_PWM));
  }
  else{
    digitalWrite(AIN1, HIGH);
    digitalWrite(AIN2, LOW);
    ledcWrite(channel_A,-constrain(pwmIntA, -MAX_PWM, -MIN_PWM));
  }
}

// B路电机控制
void channel_B_Ctrl(float pwmInputB){
  int pwmIntB = round(pwmInputB);
  if(pwmIntB == 0){
    digitalWrite(BIN1, LOW);
    digitalWrite(BIN2, LOW);
    return;
  }

  if(pwmIntB > 0){
    digitalWrite(BIN1, LOW);
    digitalWrite(BIN2, HIGH);
    ledcWrite(channel_B, constrain(pwmIntB, MIN_PWM, MAX_PWM));
  }
  else{
    digitalWrite(BIN1, HIGH);
    digitalWrite(BIN2, LOW);
    ledcWrite(channel_B,-constrain(pwmIntB, -MAX_PWM, -MIN_PWM));
  }
}


void loop(){
  // 电机停转3秒钟
  channel_A_Ctrl(0);
  channel_B_Ctrl(0);
  delay(3000);

  // 电机反方向,以低速转3秒钟
  channel_A_Ctrl(-64);
  channel_B_Ctrl(-64);
  delay(3000);

  // 电机正方向,以最高转速转3秒钟
  channel_A_Ctrl(255);
  channel_B_Ctrl(255);
  delay(3000);
}

资料