3、高速采样策略:提高编码器采样频率、采用硬件中断替代轮询、多通道并行采样

偏航控制的响应速度,说白了就是看你能多快感知到机舱的微小转动。我见过不少项目,算法写得再漂亮,采样环节一卡壳,整个系统就跟着迟钝。嗯,这里要讲的核心,就是怎么把采样这条路跑通、跑快。

3.1 提高编码器采样频率——别让信号饿着

编码器是偏航系统的眼睛。眼睛眨得慢,大脑再灵光也没用。我个人习惯,采样频率至少要跑到控制周期的5倍以上。举个例子,如果偏航控制周期是10ms,那编码器采样最好做到2ms一次,甚至1ms一次。

为什么要这么高?

  • 捕捉微小位移:风速突变时,机舱可能只偏了0.1度。采样频率低了,这0.1度就丢了。
  • 减少量化误差:频率越高,相邻两次采样的角度差越小,计算角速度就越准。
  • 留出滤波余量:高频采样后可以做滑动平均滤波,既平滑又不滞后。

关键参数建议

控制周期编码器采样频率推荐实现方式
20ms≥200Hz定时器中断
10ms≥500Hz硬件定时器+中断
5ms≥1kHz专用编码器接口芯片

我在项目中遇到过一件事:某台机组偏航响应总是慢半拍,查来查去发现编码器采样频率只有50Hz。说白了,控制周期10ms,采样周期20ms,这中间差了整整一个控制周期。把采样频率提到500Hz后,问题立刻解决了。

3.2 采用硬件中断替代轮询——别让CPU傻等

轮询是什么?就是CPU不停地问编码器:「你变了没?你变了没?」。这效率太低了。你想想看,CPU大部分时间都在空转,真正干活的时间反而被挤占了。

硬件中断就不一样了。编码器每转一个脉冲,硬件自动触发中断,CPU放下手头的事,立刻读取数据。整个过程是事件驱动的,CPU只在有数据时才介入。

我的经验

我曾经在一个老旧平台上试过轮询方式,CPU占用率直接飙到40%。改成硬件中断后,占用率降到5%以下。而且中断响应时间基本固定,不像轮询那样受主循环影响。

实现时要注意几点:

  • 中断优先级要设对:编码器中断优先级要高于普通任务,但不能高于安全链中断。
  • 中断服务程序要短:只做数据读取和标志位设置,别在里面做滤波或计算。
  • 考虑中断嵌套:如果有多路编码器,要处理好中断优先级和嵌套关系。
// 硬件中断示例(伪代码)
void Encoder_IRQHandler(void) {
    // 只做两件事:读计数值、清中断标志
    raw_count = TIM->CNT;
    TIM->SR = 0;
    // 设置数据就绪标志
    encoder_ready = 1;
}

// 主循环中处理
if (encoder_ready) {
    encoder_ready = 0;
    // 在这里做角度计算和滤波
    angle = raw_count * pulse_to_degree;
    filtered_angle = moving_average(angle);
}

3.3 多通道并行采样——别让通道排队

大型风电机组往往不止一个编码器。偏航轴承上可能有主编码器、冗余编码器,甚至还有绝对值编码器。如果串行采样,一个通道采完再采下一个,时间就浪费了。

多通道并行采样的思路很简单:让每个编码器都有自己的采样通道,同时触发,同时读取。这样不管有几个编码器,采样总时间都等于单个通道的采样时间。

注意

并行采样对硬件有要求。MCU需要有足够的定时器/捕获通道,或者使用专用的编码器接口芯片。如果硬件资源不够,可以考虑分时复用,但一定要保证每个通道的采样间隔均匀。

我推荐的做法是:

  1. 硬件层面:每个编码器独立连接到MCU的捕获通道,使用同一个定时器作为时基。
  2. 软件层面:在中断服务程序中,一次性读取所有通道的计数值。
  3. 数据同步:所有通道的采样时刻必须严格对齐,误差不超过1微秒。

并行采样 vs 串行采样对比

指标串行采样并行采样
采样总时间(3通道)3 × TT
通道间时间差T ~ 2T< 1μs
CPU占用率低(但时间长)高(但时间短)
数据一致性

你想想看,如果三个通道串行采样,每个通道耗时2ms,那第三个通道的数据比第一个晚了4ms。这4ms里机舱可能已经转了好几圈了。并行采样就能完美避免这个问题。

3.4 整体策略与实现建议

这三招要组合使用,效果才最好。我个人习惯的配置是这样的:

  • 编码器采样频率:1kHz(对应1ms采样周期)
  • 触发方式:硬件定时器中断,优先级设为次高
  • 通道数:3路并行(主编码器、冗余编码器、绝对值编码器)
  • 数据读取:中断中只读计数值,主循环中做角度换算和滤波

避坑指南

我曾经在调试时发现,中断频率太高会导致主循环饿死。后来加了个保护机制:如果中断触发频率超过设定值(比如1.2kHz),就自动降低采样频率并报警。这样既保证了响应速度,又不会让系统崩溃。

另外,别忘了做数据有效性检查。编码器线缆可能松动,信号可能受干扰。我一般会在中断里加一个简单的校验:连续两次采样的角度差不能超过物理极限值。如果超了,就丢弃本次数据,并记录故障。

高速采样策略核心逻辑 编码器 1 编码器 2 编码器 3 多通道并行采样 同时触发 同时读取 时间对齐 硬件中断替代轮询 事件驱动 CPU占用低 响应快 提高编码器采样频率(≥1kHz) 捕捉微小位移 · 减少量化误差 · 留出滤波余量

这张图把三个策略串起来了。编码器信号先经过多通道并行采样,保证时间对齐;然后通过硬件中断快速通知CPU;最后在高速采样频率下完成数据采集。三个环节缺一不可。

总结一下

高速采样策略的核心就三句话:频率要够高,别用轮询,通道要并行。做到这三点,偏航控制的响应速度至少能提升一个数量级。我这些年调试过的机组,只要把这套策略落实到位,偏航响应延迟基本都能控制在5ms以内。


公众号:蓝海资料掘金营,微信deep3321