datetime:2023/11/01 10:06
author:nzb
该项目来源于大佬的动手学ROS2
5.电机控制之使用开源库驱动多路电机
前面了解了电机控制的原理并通过实验测试了对电机正反转以及转速的控制。本节我们采用开源库调用ESP32的外设MCPWM进行精细化的电机PWM控制。
一、MCPWM简介
MCPWM中文名是电机控制脉宽调制器 (Motor Control Pulse Width Modulator ),是一款多功能 PWM 发生器,包含各种子模块,使其成为电机控制、数字电源等电力电子应用的关键元件。MCPWM 外设可用于以下场景:
- 数字电机控制,例如有刷/无刷直流电机、RC 伺服电机
- 基于开关模式的数字电源转换
- 功率DAC,其中占空比相当于DAC模拟值
- 计算外部脉冲宽度,并将其转换为其他模拟值,如速度、距离
- 为磁场定向控制 (FOC) 生成空间矢量 PWM (SVPWM) 信号
这里只需要了解MCPWM可以用来做什么就足够了
二、新建工程并添加依赖
新建example23_mcpwm_control
在platformio.ini
添加依赖
[env:featheresp32]
platform = espressif32
board = featheresp32
framework = arduino
lib_deps =
https://github.com/fishros/Esp32McpwmMotor.git
这里我们使用的驱动库是开源的Esp32McpwmMotor,支持12路PWM输出,可以同时控制6个直流电机,所以对于只有两个驱动轮的FishBot来说绰绰有余。
关于该库的详细介绍和使用可以查看Github 中的说明,另外欢迎顺手给个star~
三、编写代码
直接参考开源库中的代码
#include <Arduino.h>
#include <Esp32McpwmMotor.h>
Esp32McpwmMotor motor; // 创建一个名为motor的对象,用于控制电机
void setup()
{
Serial.begin(115200); // 初始化串口通信,波特率为115200
motor.attachMotor(0, 23, 22); // 将电机0连接到引脚23和引脚22
motor.attachMotor(1, 12, 13); // 将电机1连接到引脚12和引脚13
}
void loop()
{
motor.updateMotorSpeed(0, -70); // 设置电机0的速度(占空比)为负70%
motor.updateMotorSpeed(1, 70); // 设置电机1的速度(占空比)为正70%
delay(2000); // 延迟两秒
motor.updateMotorSpeed(0, 70); // 设置电机0的速度(占空比)为正70%
motor.updateMotorSpeed(1, -70); // 设置电机1的速度(占空比)为负70%
delay(2000); // 延迟两秒
}
上面这段代码是用于控制两个电机进行正反转的程序。其中使用了Esp32McpwmMotor库来控制电机,该库提供了一些常用的控制函数,比如attachMotor()用于连接电机,updateMotorSpeed()用于更新电机速度。
在setup()函数中,首先通过Serial.begin()函数初始化串口通信,然后通过motor.attachMotor()函数将两个电机连接到指定的引脚,引脚的确定可以从原理图得出。
在loop()函数中,通过motor.updateMotorSpeed()函数分别控制电机0和电机1的速度。每次调用该函数时,第一个参数是电机的编号,第二个参数是电机的速度,正数表示正转,负数表示反转。然后通过delay() 函数延迟两秒,实现电机正反转的循环控制。
四、测试
下载到开发板,测试下能不能动起来。
五、总结
本节我们通过开源库实现对两个电机正反转和速度的同时控制,下一节我们结合ROS 2的话题通信机制,尝试通过键盘来控制小车的前进后退与转弯。