【stm32简单外设篇】- EC11 旋转编码器(带按键)

一、适用场景
适用场景:菜单/参数旋转选择(电子设备 UI)、音量/亮度调节、机器人舵机微调、编码器计步/测速(低速)、人机交互(旋钮 + 按键)、嵌入式入门 GPIO/EXTI/TIM 实验。
二、器材清单
EC11 增量式旋转编码器(常见带按键)×1
stm32f103(或其它 STM32)开发板 ×1
若干杜邦线(公对母)×1组
三、工作原理(要点)
旋转输出信号:EC11 通常输出两路相位相差 90° 的方波(A、B),属于增量式正交编码器(quadrature encoder)。通过识别 A/B 的相位顺序即可判断旋转方向与步进。

按键信号:EC11 多带中间压下按键(SW),按键需要去抖与短/长按判定。
四、接线示意
VCC → +5V
GND → GND
标准库
PC3 →CLK
PA0 →DT
HAL库
PA6 →CLK
PA7 →DT
五、示例代码
标准库
#include "stm32f10x.h"
#include "stdio.h"
#include "bsp_SysTick.h"
#include "bsp_usart.h"int TEMP,NUM;
int cnt=0;
char show[20];void gpio_init()
{GPIO_InitTypeDef PA,PC;//使能时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);PA.GPIO_Pin = GPIO_Pin_0;PA.GPIO_Mode = GPIO_Mode_IPU;PA.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&PA);PC.GPIO_Pin = GPIO_Pin_3; PC.GPIO_Mode = GPIO_Mode_IPU; PC.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOC, &PC); }
int main()
{SysTick_Init(); //延时函数初始化USART_Config(); gpio_init();TEMP=GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_3);while(1){NUM = GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_3);///旋钮事件if(NUM != TEMP){if(GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0) != NUM){ // 顺时针旋转cnt++;if(cnt>20)cnt=20;sprintf(show,"正转,num:%d\n",cnt);Usart_SendString(USART1,show);}else{ // 逆时针旋转cnt--;if(cnt<0)cnt=0;sprintf(show,"反转,num:%d\n",cnt);Usart_SendString(USART1,show);}}TEMP = NUM;}
}
HAL库
int main(void)
{/* USER CODE BEGIN 1 */char show[20]={0};/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_TIM3_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */HAL_TIM_Encoder_Start(&htim3,TIM_CHANNEL_1);HAL_TIM_Encoder_Start(&htim3,TIM_CHANNEL_2);/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){uint16_t cnt = __HAL_TIM_GET_COUNTER(&htim3)/2;sprintf(show,"Encoder=%u\r\n",cnt);HAL_UART_Transmit(&huart1,show,strlen(show),HAL_MAX_DELAY);HAL_Delay(200);/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */
}
六、讲解视频
https://www.bilibili.com/video/BV1sPsPzYEnX/?spm_id_from=333.1387.upload.video_card.click&vd_source=f7dfe1b14f260b9cc3a146d2dbfd0719
https://www.bilibili.com/video/BV1sPsPzYERd/?spm_id_from=333.1387.upload.video_card.click&vd_source=f7dfe1b14f260b9cc3a146d2dbfd0719
https://www.bilibili.com/video/BV1bRsAzzEUa/?spm_id_from=333.1387.upload.video_card.click&vd_source=f7dfe1b14f260b9cc3a146d2dbfd0719
