CubeMX配置STM32使用360°旋转编码器(KY-040)
一、使用CubeMX进行基本的配置 |
在编码电机上面的编码器与这个的使用方法类似。
选择编码器模式
另外还需要选择
在这里需要选择TI1还是TI2,也就是AB相,因为单独选择一个的话旋转编码器的精度会小很多(关于编码器具体的判断方向的方法可以去具体了解一下,这里我不过多赘述),所以我选择的是TI1 and TI2
到此使用编码器最主要的配置就结束了;此外,因为我使用到了串口打印数据,以及定时器中断,所以我还配置了TIM2和USART1.每0.5s输出一次数据。
二、使用keil5进一步开发 |
CubeMX只是生成了底层代码,定时器的开启还需要自己开启:
/* USER CODE BEGIN TIM1_Init 2 */
HAL_TIM_Encoder_Start(&htim1,TIM_CHANNEL_ALL);
/* USER CODE END TIM1_Init 2 */
/* USER CODE BEGIN TIM2_Init 2 */
//开启中断
HAL_TIM_Base_Start_IT(&htim2);
/* USER CODE END TIM2_Init 2 */
这两个我都是在定时器的初始化中就直接开启了,在main中再开启的作用是一样的。
关于读取编码器的脉冲数有如下函数:
int TimerEncoder;
int getTimerEncoder(void)
{
TimerEncoder=(short)(__HAL_TIM_GET_COUNTER(&htim1));
__HAL_TIM_SET_COUNTER(&htim1,0);
return TimerEncoder;
}
__HAL_TIM_GET_COUNTER(&htim1)
函数返回的数据是0 ~ 65535,使用short强制转换就可以将其转换为-32768 ~ 32767,就可以实现编码器反转输出负数,不需要再用65535来减了。关于编码器hal库的一些函数可以自己在软件中去看看。
剩下的就是每0.5s输出一次编码器的数据了。
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM2)
{
getTimerEncoder();
printf("捕获到的脉冲数:%d\r\n",TimerEncoder);
}
}
关于printf函数的使用方法在我前面的文中有写。
具体使用效果如图: