使用VSCode+CubeMx开发STM32,这里介绍使用定时器的编码器接口来使用增量型编码器EC11;

1.建立工程

1.1 创建项目文件

从已有的仓库中创建一个工程:

1
git clone https://github.com/makerinchina-iot/vscode_stm32cubemx_hello.git encoder

使用VSCode打开工程后,需要更改如下名字:

  • 文件夹根目录下CMakeLists.txt 文件中修改工程名字为encoder:
1
set(CMAKE_PROJECT_NAME encoder)
  • stm32cubemx配置文件更改为 encoder.ioc ,并更改以下文件名:
1
2
3
4
...
ProjectManager.ProjectFileName=encoder.ioc
ProjectManager.ProjectName=encoder
...
1.2 引脚配置

使用STM32CubeMx打开ioc配置文件,然后配置对应的编码器引脚:

  • 定时器配置:设置为Encoder Mode,引脚配置为上拉模式;
  • 外部中断引脚用于编码器的按键检测,也设置为上拉模式;

2. 编写代码

2.1 定时器编码器使用

先启动编码器,然后使用接口获取检测结果即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
__HAL_TIM_SetCounter(&htim3, 100);

/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */

/* USER CODE BEGIN 3 */

uint8_t dir = __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim3);
uint32_t encoder_cnt = __HAL_TIM_GET_COUNTER(&htim3);
log_info("encoder result: dir = %d, count = %d", dir, encoder_cnt);
}
  • __HAL_TIM_IS_TIM_COUNTING_DOWN 可以用于检测旋转方向;
  • __HAL_TIM_GET_COUNTER 用于获取编码器数值,因为编码器模式设置为 TI1, 因此计数值为编码器信号的2倍频,即旋转一个小格计数值+2;

3.编译并烧录代码

3.1 编译和烧录
3.1 编译和烧录
  • 点击生成按键即可编译工程;

  • 在VSCode中执行task:openocd-flash烧录;

3.2 硬件连接与结果
  • 按照如下方式连接硬件:
STM32 EC11编码器
PA7 A
PA6 B
GND C
PB0 D
GND E
  • 结果如下: