3、PWM信号校准原理:油门行程校准的底层逻辑、微处理器如何捕获PWM脉宽、信号抖动与滤波
油门行程校准,说白了就是让电调知道你的遥控器“最小油门”和“最大油门”到底是多少。很多新手飞手觉得这步可有可无,插上电池直接飞。我早期做飞控测试时也这么干过,结果电机在地面突然全速旋转,差点把桌子掀了。嗯,从那以后我再也不敢跳过油门校准了。
3.1 油门行程校准的底层逻辑
电调本质上是个脉冲宽度调制(PWM)解码器。它通过测量接收机或飞控发来的PWM信号脉宽,来决定电机该转多快。但问题是——不同遥控器、不同接收机输出的PWM范围并不统一。
你想想看,有的遥控器最小油门输出1.0ms,有的输出1.1ms。最大油门有的2.0ms,有的2.1ms。如果电调不校准,它怎么知道1.05ms算不算怠速?
校准的底层逻辑其实就三步:
- 记录下限:电调上电时检测到的最小PWM脉宽,存入非易失存储器(EEPROM/Flash)。
- 记录上限:电调检测到的最大PWM脉宽,同样存起来。
- 线性映射:将实际输入的PWM脉宽,线性映射到0%~100%油门输出。
核心公式:油门百分比 = (当前脉宽 - 下限脉宽) / (上限脉宽 - 下限脉宽) × 100%
举个例子:下限1.0ms,上限2.0ms,当前1.5ms → 油门50%。
我在项目中遇到过一种情况:某品牌电调默认下限是1.1ms,但我的遥控器最小只能输出1.2ms。结果电机在地面就一直转,没法完全停止。这就是典型的“行程不匹配”。校准后问题立刻解决。
3.2 微处理器如何捕获PWM脉宽
电调里的微处理器(MCU)怎么知道PWM信号有多宽?这里涉及两种主流方法。
3.2.1 输入捕获模式(硬件方式)
大多数STM32、ATmega等MCU都内置了输入捕获模块。它的工作原理很简单:
- 检测到PWM信号的上升沿时,记录当前定时器计数值(T1)。
- 检测到下降沿时,再记录一次计数值(T2)。
- 脉宽 = T2 - T1(乘以定时器时钟周期)。
我个人习惯用输入捕获来做,因为不占用CPU,精度高。下面是STM32的配置片段:
// STM32 TIM2 输入捕获配置(CH1)
TIM_ICInitTypeDef TIM_ICInitStructure;
TIM_ICInitStructure.TIM_Channel = TIM_Channel_1;
TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising; // 上升沿捕获
TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;
TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;
TIM_ICInitStructure.TIM_ICFilter = 0x0F; // 硬件滤波,后面会讲
TIM_ICInit(TIM2, &TIM_ICInitStructure);
// 开启捕获中断
TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE);
3.2.2 外部中断+定时器查询(软件方式)
如果MCU没有输入捕获模块,或者引脚不够用,可以用外部中断配合定时器。原理是:
- 上升沿触发中断,启动定时器。
- 下降沿触发中断,停止定时器,读取计数值。
注意:软件方式容易受中断响应延迟影响。如果系统里还有其他高优先级中断,测出来的脉宽可能偏大。我建议在实时性要求高的场合,优先用硬件输入捕获。
3.3 信号抖动与滤波
你以为PWM信号是完美的方波?太天真了。实际信号里充满了抖动(jitter)。
抖动来源主要有三个:
| 抖动来源 | 典型幅度 | 影响 |
|---|---|---|
| 遥控器摇杆机械抖动 | ±10~50μs | 油门轻微跳动,悬停不稳 |
| 接收机/飞控PWM生成误差 | ±5~20μs | 电机转速波动 |
| 电磁干扰(电机、电调自身) | ±20~100μs | 严重时导致电机异常加速 |
为什么会这样?说白了,遥控器的电位器有机械噪声,接收机的晶振有温漂,电机换向时会产生强烈的电磁干扰。这些因素叠加在一起,你看到的PWM脉宽其实一直在跳。
3.3.1 硬件滤波
MCU的输入捕获模块通常自带数字滤波器。比如STM32的TIM_ICFilter参数,可以设置采样频率和采样点数。原理是:连续采样N个点,如果都是高电平,才认为信号真的变高了。
我一般设置ICFilter为0x0F(最大滤波深度),对8MHz定时器时钟来说,相当于连续采样8次,每次间隔约125ns。这样能滤掉大部分窄脉冲干扰。
3.3.2 软件滤波
硬件滤波不能完全消除抖动,软件还得再补一刀。常用的方法有:
- 中值滤波:连续采集5~7个脉宽值,排序后取中间值。抗脉冲干扰效果好。
- 滑动平均:维护一个长度为4~8的队列,每次取平均值。平滑度高,但响应有延迟。
- 限幅滤波:如果当前脉宽与上次脉宽差值超过阈值(比如50μs),就丢弃当前值。适合剔除异常跳变。
我的经验:实际项目中,我常用“中值+限幅”组合。先限幅剔除明显异常值,再中值滤波平滑。这样既保证了响应速度,又抑制了抖动。注意滤波窗口不要太大,否则油门响应会变迟钝,飞起来手感像“泡在水里”。
3.4 校准流程与状态机
油门校准不是随便插电就能做的。电调需要进入专门的“校准模式”。通常的流程是:
- 遥控器油门推到最高(100%)。
- 电调上电,检测到高油门信号,进入校准模式。
- 电调发出提示音(通常是“哔-哔-”两声)。
- 遥控器油门拉到最低(0%)。
- 电调检测到低油门信号,记录上下限,发出确认音。
- 校准完成,电调进入待机状态。
电调内部的校准状态机大致如下:
避坑指南:我曾经遇到过一批电调,校准后断电再上电,油门下限又变回默认值了。查了半天发现是EEPROM写入时序有问题——写入期间发生了掉电。后来我在写入前加了电压检测,低于4.5V就不写,问题解决。
3.5 校准后的验证
校准完别急着飞。我习惯做三步验证:
- 脉宽回读:通过串口或I2C读出电调存储的下限和上限值,确认与遥控器实际输出一致。
- 油门线性测试:用示波器或逻辑分析仪抓取电调输出到电机的PWM,看50%油门时占空比是否正好是中间值。
- 抖动观察:油门固定不动,连续采集100个脉宽值,计算标准差。如果标准差超过10μs,说明滤波参数需要调整。
嗯,到这里PWM信号校准的核心内容就讲完了。记住一点:校准不是一次性的,换了遥控器、接收机或者飞控固件版本,都得重新来一遍。别偷懒,安全第一。