在遥控车无线控制中,接收机通常是调制的标准RC PWM(50HZ,1000~2000µs占空比),而控制直流电机通常需要的是100%占空比的PWM信号,且频率通常需要1k以上(具体各频率特性参考后续介绍)。
所以就有了本项目,使用stm32做一个PWM信号转换,将接收机调试的RC PWM转为普通的PWM,然后用于驱动直流电机驱动器。
注:有条件的可以直接购买直流电机电调,与航模电调一致,可直接接RC PWM信号。
PWMSwitch 是一个基于 STM32F103C8T6 (Blue Pill) 的通用 8 通道 RC 接收机 PWM 信号转换平台。它读取遥控接收机的多路 PWM 脉冲信号,经过用户自定义的映射逻辑处理后,输出 4 路 PWM + 4 路数字开关量信号,并通过 128×64 OLED 实时显示所有通道状态。
默认内置一组坦克差速转向混控演示,但 control.c 中的转换逻辑完全开放,适用于各类 RC 信号转模拟/数字输出的场景。
适用场景:遥控设备信号转换、工业 RC 控制接口、机器人遥控器信号解码、自定义遥控映射等。
- 8 通道 PWM 输入捕获 — 1µs 分辨率,支持标准 RC 信号 (1000~2000µs)
- 自由映射逻辑 — 编辑
control.c即可自定义输入→输出转换规则 - 4 路 PWM 输出 — 10kHz 驱动频率,0~100% 占空比可调(运行时可变)
- 4 路数字输出 — ON/OFF 开关量,可独立控制
- 128×64 OLED 显示 — 实时显示 8 路输入 + 8 路输出状态
- 心跳 LED — 根据输入信号动态变化闪烁频率
- 失效保护 — 信号丢失时输出自动回中位 (50%)
| 组件 | 说明 |
|---|---|
| STM32F103C8T6 (Blue Pill) | 主控 |
| RC 接收机 (PWM 输出) | 8 通道标准信号 |
| 4 路电机驱动器 (如 L298N) | 或其它接受 PWM / 数字信号的设备 |
| SSD1306 128×64 OLED | I2C 接口 (地址 0x3C) |
| 电源 | 根据负载和接收机需求配置 |
| 功能 | MCU 引脚 | 连接目标 |
|---|---|---|
| PWM 输入 CH1~CH4 | PA0, PA1, PA2, PA3 | 接收机通道 1~4 |
| PWM 输入 CH5~CH8 | PA6, PA7, PB0, PB1 | 接收机通道 5~8 |
| PWM 输出 CH1~CH4 | PB6, PB7, PB8, PB9 | 电机/舵机/其它 PWM 设备 |
| 数字输出 CH1~CH4 | PB12, PB13, PB14, PB15 | 开关设备 / 继电器 |
| 数字输出 CH5 | PA15 | 新增开关量 (原 JTDI) |
| 数字输出 CH6 | PB3 | 新增开关量 (原 JTDO) |
| 数字输出 CH7 | PB4 | 新增开关量 (原 NJTRST) |
| 数字输出 CH8 | PB5 | 新增开关量 |
| OLED SCL | PB10 | SSD1306 SCL |
| OLED SDA | PB11 | SSD1306 SDA |
| 板载 LED | PC13 | (内置) |
项目基于vscode的platformIO插件平台,使用 STM32Cube HAL 库进行嵌入式软件开发。
# 安装 PlatformIO(如未安装)
pip install platformio
# 构建
pio run
# 烧录 (需 J-Link 调试器)
pio run --target upload使用 J-Link 烧录,配置见
platformio.ini。
项目内置一组坦克差速转向混控作为示例,演示如何将 CH1/CH2 摇杆输入映射为双电机控制:
CH1 (转向) → steer = CH1 - 50 (-50 ~ +50)
CH2 (油门) → thr = CH2 - 50 (-50 ~ +50)
左电机速度 = thr + steer (限幅 ±100)
右电机速度 = thr - steer (限幅 ±100)
正向 → PWM 正极输出,负向 → PWM 负极输出
CH5~CH8 直通为数字输出:输入 > 50% 时输出 ON,否则 OFF。
编辑 src/control.c 中 Control_Update() 函数内标记的转换逻辑区间即可,无需改动框架代码。
/* ============================================================
* 从此处开始:输入 → 输出 转换逻辑
*
* 可用变量:
* in_ch_1 ~ in_ch_8 (uint8_t, 0~100)
* 要赋值的变量:
* out_ch_1 ~ out_ch_4 (uint8_t, 0~100, PWM 占空比)
* out_ch_5 ~ out_ch_8 (uint8_t, 0 或 1, 数字输出)
* ============================================================ */
// 在这里写你自己的映射逻辑
/* ============================================================
* 转换逻辑结束
* ============================================================ */PWMSwitch/
├── platformio.ini # PlatformIO 构建配置
├── src/
│ ├── main.c # 入口 + 主循环 + LED 心跳
│ ├── control.c/.h # 控制逻辑 (输入→输出转换) ← 编辑此文件
│ ├── pwm_input.c/.h # PWM 输入捕获驱动 (TIM2+TIM3)
│ ├── pwm_output.c/.h # PWM 输出驱动 (TIM4)
│ ├── digital_output.c/.h # 数字输出驱动 (GPIO)
│ ├── display.c/.h # OLED 显示应用层
│ └── ssd1306.c/.h # SSD1306 OLED 驱动 (I2C)
├── design.md # 架构设计与流程图
└── README.md # 本文件
| 参数 | 值 |
|---|---|
| MCU | STM32F103C8T6 (72MHz max, 配置 8MHz HSI) |
| 输入分辨率 | 1µs |
| 输入通道数 | 8 |
| 输出 PWM | 4 路,10kHz (运行时可通过 pwm_output_freq_hz 调整) |
| 输出数字 | 8 路 (0/1) |
| 显示 | 128×64 OLED,I2C 400kHz |
| 更新周期 | 10ms |
| 开发环境 | PlatformIO + STM32Cube HAL |
| 调试器 | J-Link SWD |
| PWM频率 | 典型范围 | 特点 | 适用场景 |
|---|---|---|---|
| 20Hz~200Hz | 低频 | 电机抖动明显,噪音大 | 实验、简单控制 |
| 200Hz~1kHz | 较低频 | 效率较高,但可听噪声明显 | 低成本设备 |
| 1kHz~4kHz | 中频 | 调速效果较好 | 玩具、小型设备 |
| 4kHz~16kHz | 常用范围 | 噪音逐渐减小 | 工业控制 |
| 16kHz~25kHz | 高频 | 超出多数人耳听觉范围 | 智能设备、机器人 |
| 25kHz~50kHz | 很高频 | 电流更平滑,但开关损耗增加 | 高端控制器 |
| >50kHz | 超高频 | 驱动器发热增加 | 特殊应用 |
| 电机类型 | 推荐PWM频率 |
|---|---|
| 小型有刷直流电机 | 10kHz~20kHz |
| 大功率有刷直流电机 | 2kHz~20kHz |
| 无刷直流电机(BLDC) | 8kHz~30kHz |
| 风扇电机 | 20kHz~25kHz |
| 电动工具电机 | 15kHz~25kHz |
| 智能机器人电机 | 16kHz~30kHz |
MIT