一、旋转编码开关如何工作
编码器内部有一个开槽圆盘,连接到公共接地引脚 C。它还具有两个接触针 A 和 B,如下所示。
当您转动旋钮时,A 和 B 按照特定顺序与公共接地引脚 C 接触,具体顺序取决于转动旋钮的方向。
当它们与公共地接触时,会产生两个信号。这些信号存在 90° 异相,因为一个引脚先于另一个引脚接触公共地。它被称为正交编码。
当顺时针旋转旋钮时,A 引脚先于 B 引脚接地。当逆时针旋转旋钮时,B 引脚先于 A 引脚接地。
通过监控每个引脚何时连接或断开接地,我们可以确定旋钮旋转的方向。这可以通过简单地观察 A 的状态改变时 B 的状态来完成。
当改变状态时,如果 A:下降沿,B:为高电平,则顺时针转动旋钮。
当改变状态时,如果 A:下降沿,B:为低电平,则逆时针转动旋钮。
总的来说,旋转编码开关是一种功能强大、应用广泛的电子元器件,在工业自动化、机器人技术、伺服控制系统、电梯、电机控制、音视频设备、游戏控制器以及其他需要精确位置控制和速度反馈的各种机械设备中都有重要的应用。
二、 Cube MX 具体配置
首先需要在CubeMX中选择适当的引脚连接旋转编码开关的输出引脚,并将其设置为EXTI模式,然后对引脚启用中断功能。
在配置过程中,还有一个重要的步骤是将引脚进行上拉。上拉电阻用于确保引脚保持在高电平状态。这有助于防止由于噪声或干扰而导致的误触发。我这里使用的是B14、B15引脚,具体的配置如下所示。
三、具体代码实现
通过EXTI的回调函数来判断A、B引脚的IO口哪个先触发。当A或者B引脚触发后,然后通过检测另外一个引脚的状态来确定波动旋转编码开关的方向,具体操作如下所示。
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin){
if(GPIO_Pin == GPIO_PIN_14){
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_15)){
direction=1;
num++;
}
}else if(GPIO_Pin == GPIO_PIN_15){
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_14)){
direction=2;
num--;
}
}
}
- direction变量为:旋转的方向;
- num变量为:旋转计数值;
完整代码示例:https://download.csdn.net/download/qq_26043945/89322458