当前位置: 首页 > news >正文

【好盈电调】使用 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

在这里插入图片描述


文章转载自:
http://albanian.riewr.cn
http://alleyoop.riewr.cn
http://actium.riewr.cn
http://adnoun.riewr.cn
http://anaculture.riewr.cn
http://annually.riewr.cn
http://befoul.riewr.cn
http://adsorbent.riewr.cn
http://caducity.riewr.cn
http://canard.riewr.cn
http://arabist.riewr.cn
http://babe.riewr.cn
http://allecret.riewr.cn
http://agal.riewr.cn
http://aura.riewr.cn
http://aggregately.riewr.cn
http://alienism.riewr.cn
http://benignly.riewr.cn
http://attap.riewr.cn
http://akene.riewr.cn
http://centered.riewr.cn
http://chromatophore.riewr.cn
http://anorthic.riewr.cn
http://arrowy.riewr.cn
http://cartload.riewr.cn
http://binocle.riewr.cn
http://bitmap.riewr.cn
http://arms.riewr.cn
http://bourse.riewr.cn
http://blacken.riewr.cn
http://www.dtcms.com/a/281400.html

相关文章:

  • PBI(产品基本信息)系统如何构建
  • 【stm32】新建工程
  • 知识付费小程序资质全解析
  • 【CMake】使用 CMake 将多模块 C 项目构建为库并链接主程序
  • Spring MVC2
  • React 手动实现页面锚点导航
  • AI Agent 框架LangChain概述
  • 【MCU控制 初级手札】1.1 电阻
  • CUDA 环境下 `libcuda.so` 缺失问题解决方案
  • 自注意力机制:让 AI 像人类一样「读懂」上下文
  • 明远智睿SSD2351:开启嵌入式系统开发新时代
  • WebApplicationType.REACTIVE 的webSocket
  • dotnet命令详解
  • linux的数据库与web服务器
  • LSTM入门案例(时间序列预测)
  • 平升智慧水务整体解决方案,大数据驱动的智慧水务,让城市供水更智能
  • 康谋分享 | 破解数据瓶颈:智能汽车合成数据架构与应用实践
  • 改进_开源证券_VCF_多尺度量价背离检测因子!
  • 【从0-1的JavaScript】第1篇:JavaScript的引入方式和基础语法
  • 第五章 管道工程 5.2 燃气管道
  • 数据库第三次作业
  • 脚手架新建Vue2/Vue3项目时,项目文件内容的区别
  • yolo-world环境配置
  • 【PCIe 总线及设备入门学习专栏 5.1.1 -- PCIe PERST# 信号的作用】
  • 关于实习的经验贴
  • eSearch识屏 · 搜索 v14.3.0
  • Redis集群搭建(主从、哨兵、读写分离)
  • netstat -tlnp | grep 5000
  • 3.创建表-demo
  • 进程的内存映像,只读区,可读写区,堆,共享库,栈详解