STM32 HAL高级定时器正交编码模式案例
- 基于stm32F030RBT6单片机采用高级定时器1,编码器模式,测试EC11编码器。
-
EC11测试效果:
-
STM32定时器编码器有3种映射模式:
- ✨本次采用的是上面的模式3,EC11编码器每转动一小格,TIM1定时器可以捕获到4个脉冲信号,也就是定时器捕获4个脉冲信号就代表编码器旋转了一小格。
- EC11编码器原理图
STM32CubeMX配置
-
使能高级定时器TIM1,配置编码器模式。
-
参数配置
-
编码器引脚配置:
-
EC11编码器按键引脚配置
-
中断配置
功能代码实现部分
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef* htim)
{
if(htim == &htim1)
{
__HAL_TIM_CLEAR_IT(htim, TIM_FLAG_TRIGGER);
if(__HAL_TIM_GET_FLAG(htim, TIM_CHANNEL_1) != RESET)
{
Trg++;
}
if(__HAL_TIM_GET_FLAG(htim, TIM_CHANNEL_2) != RESET)
{
Trg++;
}
if((++Trg)==4)
{
Trg =0;
CaptureNum = __HAL_TIM_GET_COUNTER(&htim1) / 4;
}
}
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim)
{
__HAL_TIM_CLEAR_IT(htim, TIM_FLAG_UPDATE);
}
void EXTI4_15_IRQHandler(void)
{
HAL_GPIO_EXTI_IRQHandler(EC11M_Pin);
__HAL_GPIO_EXTI_CLEAR_IT(EC11M_Pin);
HAL_GPIO_EXTI_Callback(EC11M_Pin);
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
if(GPIO_Pin == EC11M_Pin)
{
__HAL_TIM_SET_COUNTER(&htim1, 0);
}
}
int main(void)
{
uint32_t TimerUART;
uint32_t Temp;
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_TIM1_Init();
MX_USART2_UART_Init();
__HAL_TIM_SET_COUNTER(&htim1, 0);
__HAL_TIM_ENABLE_IT(&htim1, TIM_IT_UPDATE);
__HAL_TIM_CLEAR_IT(&htim1, TIM_IT_UPDATE);
HAL_TIM_Encoder_Start_IT(&htim1, TIM_CHANNEL_ALL);
TimerUART = HAL_GetTick();
printf("STM32F030 SysClockFreq:%d \r\n", HAL_RCC_GetSysClockFreq());
while(1)
{
if((HAL_GetTick() - TimerUART) > 1000)
{
HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);
TimerUART = HAL_GetTick();
}
if(CaptureNum != Temp)
{
Temp = CaptureNum;
HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin);
__HAL_TIM_IS_TIM_COUNTING_DOWN(&htim1)==0?printf("正转\tCaptureNum:%d\r\n",CaptureNum):printf("反转\tCaptureNum:%d\r\n",CaptureNum);
}
}
}
测试工程(模式三)
链接:https:
提取码:a0eg
模式一和模式二使用介绍
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef* htim)
{
if(htim == &htim1)
{
__HAL_TIM_CLEAR_IT(htim, TIM_FLAG_TRIGGER);
if(__HAL_TIM_GET_FLAG(htim, TIM_CHANNEL_1) != RESET)
{
Trg++;
}
if((++Trg)==2)
{
Trg = 0;
CaptureNum = __HAL_TIM_GET_COUNTER(&htim1) / 2;
}
}
}
- 此文章仅作为个人学习探索知识的总结,不作为他人或引用者的理论依据,由于学识所限,难免会出现错误或纰漏,欢迎大家指正。