3. 硬件基础(二):倍率开关原理

好,咱们接着聊硬件基础。上一章讲了手轮,这一章重点说说倍率开关。倍率开关这东西,说白了就是让操作者能快速切换进给速度的倍数。比如在机床上,手轮摇一圈,正常是走1mm,但如果你把倍率打到10倍,那摇一圈就是10mm。嗯,这个功能在粗加工时特别有用。

3.1 波段开关 vs 旋转编码器

倍率开关的实现方式,主流有两种:波段开关和旋转编码器。我个人的习惯是,根据项目成本和要求来选。

波段开关,也叫旋转开关。它内部是一组固定的触点,旋转时通过机械结构切换不同的档位。每个档位对应一个固定的电阻值或电平组合。它的优点是:手感清晰,档位明确,不会出现误触发。我在做一款老式数控系统时,就用的这种开关。操作工反馈说,手感很扎实,咔嗒咔嗒的,不容易出错。

旋转编码器,则是通过光电或磁感应原理,输出脉冲信号。它没有固定的档位,可以无限旋转。但通过软件处理,可以模拟出档位效果。它的优点是:寿命长,体积小,可以做成无接触式。不过,它需要MCU持续检测脉冲,占用一定的CPU资源。

你想想看,如果项目要求高可靠性、低成本的,波段开关是首选。如果要求小型化、长寿命的,旋转编码器更合适。

特性 波段开关 旋转编码器
手感 清晰,有咔嗒感 平滑,无档位感
寿命 机械触点,有限 无接触,长寿命
成本 中等
占用IO 多(二进制编码需多IO) 少(2个IO即可)
抗干扰 需软件滤波

3.2 电阻分压网络

好,接下来是重点——电阻分压网络。为什么需要它?因为MCU的ADC引脚只能读取电压值,而我们需要把开关的档位转换成不同的电压。电阻分压网络就是干这个的。

最简单的做法:每个档位串联一个不同的电阻,然后接一个固定电阻到地,形成一个分压器。这样,每个档位对应的ADC读数就不同了。

举个例子,假设我们有8个档位,用8个电阻R1~R8,分别串联到ADC引脚,然后接一个10kΩ的下拉电阻到地。那么每个档位的电压就是:

V_adc = V_ref * R_down / (R_switch + R_down)

其中V_ref是参考电压,R_switch是当前档位的串联电阻。通过选择合适的电阻值,可以让每个档位的电压均匀分布。

我在项目中遇到过一个问题:电阻的精度不够,导致相邻档位的电压区间重叠了。嗯,这会导致MCU误判档位。后来我改用1%精度的电阻,并且把电压区间留出足够的余量,才解决了这个问题。

小技巧: 电阻分压网络的设计,建议让每个档位的电压区间至少相差50mV以上。这样即使有温度漂移或电阻误差,也不会误判。

3.3 多档位信号采集

信号采集这块,说白了就是MCU怎么读取并判断当前是哪个档位。流程一般是:ADC采样 -> 滤波 -> 查表 -> 输出档位值。

ADC采样:用MCU的ADC模块,读取分压网络的电压值。注意采样时间要足够长,避免电容充放电带来的误差。我一般设置采样时间为10μs以上。

滤波:因为机械开关在切换时会有抖动,ADC读数会跳变。所以需要做软件滤波。常用的方法有:

  • 均值滤波:连续采样5次,取平均值。
  • 中值滤波:连续采样5次,取中间值。
  • 限幅滤波:如果当前值与上次值相差太大,则丢弃。

我个人习惯用中值滤波,因为它能有效去除毛刺,而且计算量不大。

查表:滤波后的ADC值,需要映射到具体的档位。通常的做法是建立一个阈值表。比如:

// 假设ADC是12位,参考电压3.3V
// 档位1: 0.1V ~ 0.3V
// 档位2: 0.4V ~ 0.6V
// ...
uint16_t threshold_table[] = {100, 200, 300, 400, 500, 600, 700, 800};

uint8_t get_gear(uint16_t adc_value) {
    for (int i = 0; i < 8; i++) {
        if (adc_value < threshold_table[i]) {
            return i + 1;
        }
    }
    return 0; // 无效档位
}

注意,阈值表的边界值要留有余量。比如档位1的理论值是0.2V,但实际采样可能在0.18V~0.22V之间。所以阈值要设在0.3V左右,避免误判。

避坑指南: 我曾经遇到过一个问题:ADC的参考电压不稳定,导致所有档位的读数都偏移了。后来我改用内部参考电压,并且加了一个稳压二极管,才解决了这个问题。所以,ADC的参考电压一定要稳定,否则分压网络设计得再好也没用。

3.4 实战中的注意事项

最后,分享几个我在实战中总结的要点:

  • 去抖处理:机械开关切换时,会有几十毫秒的抖动。建议在软件中做去抖,比如连续读到同一个档位3次以上,才认为切换成功。
  • 防反接保护:如果开关是外接的,建议在ADC引脚前加一个二极管,防止反接烧坏MCU。
  • 静电防护:倍率开关经常被人手触摸,容易引入静电。建议在ADC引脚加一个TVS管,或者串联一个1kΩ的电阻限流。

嗯,这一章的内容就到这里。倍率开关的原理其实不复杂,但细节很多。你想想看,一个简单的分压网络,如果电阻选不好,或者滤波没做好,整个系统就会误判。所以,硬件设计一定要扎实,不能有侥幸心理。