高效 Arduino PWM 读取 & RC 接收机解码库:内置失控保护
适用硬件
- Arduino Uno / Nano / Pro Mini (ATmega328P)
- 任意 PWM 信号源:RC 接收机、舵机测试器、超声波模块 Echo 脚等
- 不支持 Arduino Mega (寄存器映射不同)
核心特性
- 引脚任意:数字 0–13、模拟 A0–A5 任意组合 (除 A6/A7)
- 零阻塞:基于 Pin Change Interrupt (PCINT) + 直接端口操作,ISR 耗时 < 24 µs (6 通道)
- 内置失控保护:频率 10–330 Hz、脉宽 500–2500 µs 超限自动输出预设失控值
- 通用 PWM 测量:可读取脉宽、周期、频率、占空比,替代
pulseIn() - 模块化设计:单
.ino文件放入草图文件夹即成第二标签页,改数组即可移植
快速上手 (6 步)
- 接线:RC 接收机信号线接 D2–D7 (对应 CH1–CH6),供电共地
- 导入库:将
PWMread_RCfailsafe.ino复制到草图目录,IDE 自动生成新标签 - 配置引脚:在 “USER DEFINED VARIABLES” 区修改
pwmPIN[]数组 - 校准行程:上传
RC_Read_Example,开启遥控器,串口监视器记录各通道min/mid/max脉宽 (µs),回填RC_min[]RC_mid[]RC_max[] - 设定失控值:在
RC_failsafe[]填入 -1.0~+1.0 (如油门 -1.0 即全关) - 业务代码调用:
if(RC_avail()) { ch1 = RC_decode(1); ... }即得 -1.0~+1.0 标准化值
进阶功能
舵机混控示例 (RC_ServoMixer_Example)
- 双通道混控:
mix1 = CH2 - CH3(升降-副翼),mix2 = CH2 + CH3 - 每路可配:方向 (正/反)、行程率 (0–200%)、中立点微调
- 输出经
calc_uS()转 500–2500 µs 脉宽,Servo.writeMicroseconds()驱动舵机
帧率/频率监测 (RC_FrameRate)
调用 PWM_read(1) → PWM_period() / PWM_freq() 可得接收机帧周期 (通常 20 ms / 50 Hz),用于主循环定时或失控判定超时阈值。
性能与局限
| 通道数 | ISR 耗时 | CPU 占用 (50 Hz) |
|---|---|---|
| 1 | < 8 µs | 0.04% |
| 2 | < 12 µs | 0.06% |
| 6 | < 24 µs | 1.44% |
micros()分辨率 4 µs,实测足够;如需 0.5 µs 可改用定时器中断- 最高实用频率 ~2.5 kHz (单通道 3% CPU)
- 与
SoftwareSerial等占用 PCINT 的库冲突
资源下载
PWMread_RCfailsafe.ino— 核心库 (含 ISR、校准、失控、通用 PWM 函数)RC_Read_Example.ino— 校准/失控测试例程RC_FrameRate.ino— 帧率监测例程RC_ServoMixer_Example.ino— 舵机混控完整例程- Fritzing 原理图:
schematics_UhOTpO8N1Z.fzz
制造工艺
- Arduino UNO 驱动 16x2 LCD 实现动画与小游戏
- Arduino 与智能手机打造智能电压表——简单易做的 DIY 项目
- Arduino + DHT11 + 以太网盾板温湿度数据记录仪
- Blynk + Arduino 读取 DHT11 温湿度数据教程
- Python 3 控制 Arduino UNO - 串口通信点亮内置 LED 入门教程
- Arduino Nano 驱动 128x64 OLED 实时运行康威生命游戏 (元胞自动机)
- 使用 Arduino Nano 和 RDA8057M 制作紧凑型 FM 收音机
- Arduino + TEA5767 打造 FM 收音机:Nokia 5110 显频谱/信号强度/立体声
- 基于 Arduino 与 Google Sheets 的实时 RFID 考勤系统
- DIY全波段Arduino收音机:Si4730模块实现LW/MW/SW/FM接收
- 为Arduino构建隔离模拟输入电路
- C 语言输入输出完全掌握:标准 I/O 与格式化控制