【好盈电调】使用 ESP32 的 PWM 驱动无刷电调,电调型号:XRotor Pro 80A BLDC V4.1
总览
1.硬件设备简要介绍
2.无刷电调相关(接线、不同响声代表的意义)
3.ESP32S3相关(MCU的Arduino程序、波形测量,驱动原理、重要参数(初始化油门0%基准参数)等)
4.具体驱动效果
一、简要介绍
1.电调
好盈无刷电调,XRotor Pro 80A BLDC V4.1
2.MCU
ESP32S3(源地工作室出品)
3.电机
农用无人机上面拆下来的电机,最大输入电压48V左右,功率4KW(峰值)
二、无刷电调相关(接线、不同响声代表的意义)
1.接线
其中,必要的接线如下:
· 电源线:
1.最左侧的主 DC 输入
2.最右侧的主 DC GND
· 信号线:
1.细的线排的最左侧的 GND
2.细的线排的左侧第二个(字母 S)(PWM 信号输入线)
其他端子(R、P)的意义:
2.不同响声代表的意义
听到的响声 | 手册术语 | 触发场景 / 故障 | 处理方法 |
---|---|---|---|
♪ 1-2-3 (升调三音)一次 | Power-on Ready Tone | 上电自检通过,系统就绪,可起飞 | 正常现象,无需操作 (Hobbywing) |
Beep Beep Beep …(很快、连贯) | rapid monotone | 油门杆/控制信号 未归零,ESC 拒绝启动 | 把 PWM 脉宽拉到最低(≈ 1100 µs)或把遥控油门杆推到底 |
Beep, Beep, Beep …(每隔≈1 s 一声) | 1 s interval | - 无油门信号 - 或 总线电压异常(< 18 V / > 63 V,对 HV 机型) | 1) 检查 PWM 线接法 & 飞控输出 2) 确认电池电压在 6-12 S 范围 |
持续长鸣 + LED 长闪 | Throttle-lost | 运行中丢失油门信号 | 检查信号线/飞控供电 |
长闪 + 1-4 短闪(伴随同节奏蜂鸣) | 过温 / 堵转 / 短路 等硬件保护 | MOS ≥ 110 ℃、电容 ≥ 110 ℃、堵转、三相采样放大器异常等 | 降温、排障后 断电重启 才能清除故障 |
三、ESP32S3相关(MCU的Arduino程序、波形测量)
1.MCU的Arduino程序
使用引脚共 2 个:
GPIO 18 -> PWM 输出引脚,连接电调
GND -> 连接电调
程序使用说明:
1.程序启动后,在串口监视器输入你想要调节的油门比例,电调带动电机开始按照此比例旋转。
2.急停按钮:输入“886”,油门归零,电机停止。
最关键的点:
程序中最重要的变量设置是 MIN_US(零油门脉宽(微秒),按实际的情况输入,如果电调滴滴滴响个不停,那么则调低此值)
最关键的点:
程序中最重要的变量设置是 MIN_US(零油门脉宽(微秒),按实际的情况输入,如果电调滴滴滴响个不停,那么则调低此值)
最关键的点:
程序中最重要的变量设置是 MIN_US(零油门脉宽(微秒),按实际的情况输入,如果电调滴滴滴响个不停,那么则调低此值)
/********************************************************************* ESP32-S3 → XRotor Pro 80 A-HV ESC 串口测试程序(讲解版)* * 功能概要* ──────────────────────────────────────────────────────────────* 1. 通过 LEDC 外设产生 PWM(100 Hz/13 bit,脉宽 1.05-1.94 ms)* 2. 串口输入 “0-100” → 实时设置油门百分比* 3. 串口输入 “886” → 急停(油门归 0 %,方便调试)* 4. 每帧都重新输出当前脉宽,防止 ESC 因“信号丢失”进入保护*******************************************************************/#include <Arduino.h> // Arduino 核心,提供串口 / LEDC / 延时等 API/* ────────────【 ❶ 可调参数区 】───────────────────────────────── */
constexpr uint8_t ESC_PIN = 18; // S 线连接的 GPIO;需支持 LEDC
constexpr uint32_t FREQ_HZ = 100; // PWM 帧率(官方允许 50-500 Hz)
constexpr uint8_t RES_BITS = 13; // LEDC 分辨率:2^13=8192 个计数
constexpr uint16_t MIN_US = 1050; // 零油门脉宽(µs);按实测门槛设
constexpr uint16_t MAX_US = 1940; // 满油门脉宽(µs)
constexpr uint16_t STOP_CMD = 886; // 特殊指令:输入此值→急停
/* ────────────────────────────────────────────────────────────── *//* ──────【 ❷ 辅助函数:µs→LEDC 占空比 】───────────────────────* ▸ us2Duty() : 把“微秒脉宽”换算成 ledcWrite() 期望的 0-(2^RES-1)* 公式:占空 = 脉宽 × 计数最大值 ÷ 周期* 周期 = 1 000 000 / FREQ_HZ(单位 µs)*/
static inline uint32_t us2Duty(uint16_t us) {return (uint32_t)us * ((1UL << RES_BITS) - 1) /(1'000'000UL / FREQ_HZ);
}/* ▸ setPulse() : 给 ESC_PIN 输出指定脉宽 */
inline void setPulse(uint16_t us) { ledcWrite(ESC_PIN, us2Duty(us)); }/* ──────【 ❸ setup() — 单片机上电初始化 】──────────────────── */
void setup() {Serial.begin(115200); // 打开 USB-CDC 串口,波特率 115200Serial.setTimeout(10); // parseInt / readString 的超时改成 10 ms/* 初始化 LEDC。attach 成功返回 true,失败多半是分辨率过高 */if (!ledcAttach(ESC_PIN, FREQ_HZ, RES_BITS)) {Serial.println("⚠ LEDC attach 失败!请降低分辨率或换频率");while (true); // 停机并打印错误,让用户察觉}setPulse(MIN_US); // 上电即输出零油门,保证安全Serial.printf("READY | PWM=%lu Hz 分辨率=%u bit 范围=%u-%u µs\n"" | 输入 0-100 调油门,输入 %u 急停\n",FREQ_HZ, RES_BITS, MIN_US, MAX_US, STOP_CMD);
}/* ──────【 ❹ loop() — 主循环,每 1/FREQ_HZ 秒执行一次 】───── */
void loop() {static uint8_t throttle = 0; // 当前油门百分比(0-100)static uint32_t tPrev = 0; // 上一次喂脉冲的时间戳/* —— a) 处理串口输入 —— */if (Serial.available()) {String line = Serial.readStringUntil('\n'); // 读到换行符结束line.trim(); // 去掉前后空白if (line.length()) { // 非空才处理int val = line.toInt(); // ASCII → 整数if (val == STOP_CMD) { // 886 ⇒ 急停throttle = 0;setPulse(MIN_US);Serial.println("已执行急停(油门归零)");} else if (val >= 0 && val <= 100) { // 合法油门throttle = val;uint16_t us = MIN_US +(uint32_t)(MAX_US - MIN_US) * val / 100;setPulse(us);Serial.printf("油门设为 %d %% → %u µs\n", val, us);} else {Serial.println("⚠ 输入无效:需 0-100 或 886");}}}/* —— b) 定时“喂狗”:周期性重复当前脉宽,避免 ESC 超时保护 —— */if (millis() - tPrev >= 1'000 / FREQ_HZ) { // 到达 1 帧时间uint16_t us = MIN_US +(uint32_t)(MAX_US - MIN_US) * throttle / 100;setPulse(us);tPrev = millis();}
}
/* ─────────────────────────── 代码结束 ───────────────────────── */
2.波形测量(非必须,只是验证 PWM 是否奏效)
使用示波器查看。
四、实测视频
RagdollUser刚刚发布的视频
https://b23.tv/NjSVDXw