STM32使用旋转编码开关

一、旋转编码开关如何工作

        编码器内部有一个开槽圆盘,连接到公共接地引脚 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

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: STM32读取三脚旋转编码开关的过程主要包括两个方面:硬件连接和编程实现。 硬件连接方面,需要将旋转编码开关的A、B信号输入STM32的两个GPIO引脚上,同时需要将旋转编码开关的COM信号接入STM32的地线上,这样就可以通过GPIO读取旋转编码开关的状态。 编程实现方面,需要使用STM32的定时器和中断功能来获取旋转编码开关的状态。具体实现步骤如下: 1. 配置STM32的GPIO引脚为输入模式,并开启中断功能。 2. 配置STM32的定时器为编码器模式,并开启中断功能。在该模式下,定时器可以读取旋转编码开关的A、B信号,根据信号变化的方向来累加计数器的值。 3. 在定时器中断处理函数中,通过读取GPIO引脚的状态,来判断旋转编码开关的状态。如果A、B信号都是高电平或者低电平,则表示开关处于保持状态;如果A、B信号发生变化,则根据变化的方向累加计数器的值。 通过以上步骤的实现,可以实现STM32对三脚旋转编码开关的读取。在上层应用中,可以根据计数器的值来实现旋转编码开关的不同功能。由于旋转编码开关具有较高的精度和耐用性,因此在工业控制和仪器仪表等领域中得到了广泛的应用。 ### 回答2: STM32是一款先进的32位微控制芯片,广泛应用于工控、智能家居、机器人等领域,常常需要读取旋转编码开关来实现位置反馈、控制等功能。 旋转编码开关通常由A、B、C三个引脚组成,其中A和B分别为通道A和通道B,而C为按钮信号(如图所示)。当旋转编码开关旋转时,A和B的信号会相应地交替输出两个高电平和两个低电平,在不同位置会产生不同的输出序列,因此可以通过读取这些信号来确定旋转方向和位置。 为了实现读取旋转编码开关的功能,可以通过外部中断或定时器中断来捕捉A和B的信号变化。其中,外部中断适用于速度较慢、变化较少的场景,例如机械臂、小车等实时性要求不高的应用;而定时器中断则适用于速度较快、变化频繁的场景,例如电机、风扇等实时性要求较高的应用。 以外部中断为例,具体步骤如下: 1. 配置GPIO口为中断输入模式,并使能中断。例如,A通道连接PC2,B通道连接PC3,C通道连接PC4,则可以配置如下: ``` GPIO_InitTypeDef GPIO_InitStructure; EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &GPIO_InitStructure); EXTI_InitStructure.EXTI_Line = EXTI_Line2|EXTI_Line3|EXTI_Line4; EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt; EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising_Falling; EXTI_InitStructure.EXTI_LineCmd = ENABLE; EXTI_Init(&EXTI_InitStructure); NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn|EXTI3_IRQn|EXTI4_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure); ``` 2. 实现中断服务函数,在中断函数中读取A和B通道的状态,根据状态变化来累计旋转次数。例如,计算两位相邻状态变化的数字为dir,根据dir的值来判断旋转方向和计数方向,如下所示: ``` static uint8_t lastState; static int16_t rotationCount; void EXTI2_IRQHandler(void) { uint8_t state = ((GPIOC->IDR & GPIO_Pin_2) != 0) << 1 | ((GPIOC->IDR & GPIO_Pin_3) != 0); uint8_t dir = (lastState << 2) | state; lastState = state; if (dir == 0b0001 || dir == 0b0111 || dir == 0b1110 || dir == 0b1000) { rotationCount++; } else if (dir == 0b0100 || dir == 0b0010 || dir == 0b1101 || dir == 0b1011) { rotationCount--; } EXTI_ClearITPendingBit(EXTI_Line2); } ``` 3. 在主函数中读取旋转计数器的值,可以实时获取旋转编码开关旋转位置。例如,可以通过串口发送旋转计数器的值来进行调试和验证。 ``` while (1) { int16_t count = rotationCount; printf("Rotation count: %d\n", count); // delay } ``` 综上所述,通过STM32读取旋转编码开关可以有效实现位置反馈、控制等功能,能够扩展应用的功能和性能。 ### 回答3: STM32是一类广泛使用的嵌入式微控制器,可以用于控制各种设备和系统。在进行一些控制任务时,需要使用旋转编码开关来获取外部输入。此时,需要特定的芯片引脚、中断服务程序等。 常见的3脚旋转编码开关是一种输出信号呈现两个相位位移的旋转编码器,这种编码器可以用于控制某些设备的旋转或位置控制。该编码器的三个引脚分别是:A相输出信号脚、B相输出信号脚和COM共地接口。当旋转编码旋转时,依次触发A、B两个脚输出。根据输出的相对顺序可以知道旋转方向。 为了使STM32能够读取旋转编码开关的输入信号,需要将A、B两个输出信号的脚连接到STM32芯片的输入端口,同时将COM脚连接到单片机的GND端。可以使用单片机内置的输入捕获和定时器模块来捕获编码器的输入信号,然后根据A、B两个脚的信号状态判断旋转方向,并更新相应的计数器或位置指针。由于编码器信号有时候会出现抖动或不稳定的情况,需要进行软件滤波处理,或者使用硬件滤波器来过滤掉噪声。 总的来说,通过读取3脚旋转编码开关,可以方便地控制STM32系统的旋转或位置变化。需要使用输入捕获和定时器模块来获取输入信号并进行处理,同时也需要了解编码器的电气特性和工作原理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_755682240

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值