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%精度的电阻,并且把电压区间留出足够的余量,才解决了这个问题。
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左右,避免误判。
3.4 实战中的注意事项
最后,分享几个我在实战中总结的要点:
- 去抖处理:机械开关切换时,会有几十毫秒的抖动。建议在软件中做去抖,比如连续读到同一个档位3次以上,才认为切换成功。
- 防反接保护:如果开关是外接的,建议在ADC引脚前加一个二极管,防止反接烧坏MCU。
- 静电防护:倍率开关经常被人手触摸,容易引入静电。建议在ADC引脚加一个TVS管,或者串联一个1kΩ的电阻限流。
嗯,这一章的内容就到这里。倍率开关的原理其实不复杂,但细节很多。你想想看,一个简单的分压网络,如果电阻选不好,或者滤波没做好,整个系统就会误判。所以,硬件设计一定要扎实,不能有侥幸心理。