求真杯电控程序设计教程
(针对ESP32平台)
一、底盘控制
1. 电机初始化
核心任务:配置4个电机的12个控制引脚
关键要点:
每个电机需配置:
- 2个参考电平引脚(方向控制)
- 1个PWM引脚(速度控制)
- 定时器分配原则:每个PWM通道需独立定时器
代码模板:
void Chassis_Init() {
// PWM引脚配置(示例:左前轮)
pinMode(Left1_Pin, OUTPUT);
ledcAttachPin(Left1_Pin, Left1_Channel);
ledcSetup(Left1_Channel, 50, 10); // 50Hz频率,1024级精度
// 参考电平引脚配置(示例:左前轮)
pinMode(Left1_ref1, OUTPUT);
pinMode(Left1_ref2, OUTPUT);
// 其他3个电机重复上述配置...
}
注意事项:
⚠️ 定时器通道不可重复使用
⚠️ 推荐引脚分配表:
硬件名称 | PWM引脚 | 参考电平引脚1 | 参考电平引脚2 |
---|---|---|---|
左前轮电机 | GPIO 33 | GPIO 25 | GPIO 26 |
左后轮电机 | GPIO 14 | GPIO 12 | GPIO 13 |
右前轮电机 | GPIO 21 | GPIO 19 | GPIO 18 |
右后轮电机 | GPIO 16 | GPIO 2 | GPIO 4 |
舵机 | GPIO 5 | 无 | 无 |
2. 电机运动控制
控制原理:
- 方向控制:通过参考电平组合实现
- 速度控制:PWM占空比(0-1024)
方向控制逻辑表:
运动方向 | 参考电平引脚1 | 参考电平引脚1 |
---|---|---|
正转 | HIGH | LOW |
反转 | LOW | HIGH |
优化后的控制函数:
// 通用电机方向设置函数
void SetMotorDir(int refPin1, int refPin2, bool direction) {
digitalWrite(refPin1, direction ? HIGH : LOW);
digitalWrite(refPin2, direction ? LOW : HIGH);
}
// 示例:设置左前轮正转
SetMotorDir(Left1_ref1, Left1_ref2, FORWARD);
运动模式速查表:
针对O型麦轮装法(与地面接触面棍子的形状呈现O型)
方向指令 | 左前轮 | 左后轮 | 右前轮 | 右后轮 |
---|---|---|---|---|
前进(1) | 正转 | 正转 | 正转 | 正转 |
后退(2) | 反转 | 反转 | 反转 | 反转 |
左平移(3) | 反转 | 正转 | 反转 | 正转 |
右平移(4) | 正转 | 反转 | 正转 | 反转 |
左上平移(5) | 停止 | 正转 | 正转 | 停止 |
左下平移(6) | 反转 | 停止 | 停止 | 反转 |
3. 麦轮解算(进阶)
实现步骤:
- 建立运动学模型
- 将速度矢量分解为各轮分量
编写解算函数:
void MecanumMove(float vx, float vy, float omega) { // 各轮速度计算(示例公式) float LF = vx + vy + omega; // 其他三个轮计算同理... // 设置实际PWM输出 }
二、舵机控制
1. 舵机初始化
接线示意图:
[VCC]----[舵机红线]
[GND]----[舵机棕线]
[PWM]----[舵机黄线]
角度-PWM换算公式:
PWM值 = (0.025 + (角度/180)*0.1) * 1024;
代码优化:
void SetServoAngle(uint8_t angle) {
angle = constrain(angle, 0, 180); // 限制角度范围
uint16_t pwm = 25.6 + (angle * 5.12); // 简化计算公式
ledcWrite(Servo_Channel, pwm);
}
三、蓝牙控制
1. 通信协议解析
由于手机蓝牙app的数据格式开头和结尾数据为固定的,所以esp32接收数据时,需要设置一个数组用来接收手机发送的数据。下面是以我的程序为例,大家按照自己的想法设计。
数据包结构:
起始位 | X轴 | Y轴 | 角度 | L键 | R键 | 校验和 | 结束位 |
---|---|---|---|---|---|---|---|
0xA5 | 1 | 1 | 1 | 1 | 1 | 1 | 0x5A |
校验算法:
checksum = (X + Y + Angle + L + R) & 0xFF;