docs 02 带编码器电机控制例程二
本教程是用于控制电机的正反转,快速和慢速转,以下提供控制电机转动的例程。
上传程序
点击 例程下载,解压并打开 motorCtrl.ino用 USB 线将多功能驱动板和计算机连接起来(此处插入的是多功能驱动板 USB 的 Type-C 接口),点击“工具”→“端口”,再点击新出现的 COM(这里新出现的 COM 为 COM28)。

在 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){
int pwmIntA = round(pwmInputA);
if(pwmIntA == 0){
digitalWrite(AIN1, LOW);
digitalWrite(AIN2, LOW);
return;
}
if(pwmIntA > 0){
digitalWrite(AIN1, LOW);
digitalWrite(AIN2, HIGH);
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(){
channel_A_Ctrl(0);
channel_B_Ctrl(0);
delay(3000);
channel_A_Ctrl(-64);
channel_B_Ctrl(-64);
delay(3000);
channel_A_Ctrl(255);
channel_B_Ctrl(255);
delay(3000);
}