当前位置:首页 > 编程笔记 > 正文
已解决

STM32 HAL高级定时器正交编码模式案例

来自网友在路上 178878提问 提问时间:2023-10-24 14:09:49阅读次数: 78

最佳答案 问答题库788位专家为你答疑解惑

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;}}
}
/*** @brief 更新溢出回调函数* @retval None*/
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef* htim)
{__HAL_TIM_CLEAR_IT(htim, TIM_FLAG_UPDATE);//清除更新中断标志位
}
void EXTI4_15_IRQHandler(void)
{/* USER CODE BEGIN EXTI4_15_IRQn 0 *//* USER CODE END EXTI4_15_IRQn 0 */HAL_GPIO_EXTI_IRQHandler(EC11M_Pin);/* USER CODE BEGIN EXTI4_15_IRQn 1 */// 清除中断标志位__HAL_GPIO_EXTI_CLEAR_IT(EC11M_Pin);// 调用外部中断回调函数HAL_GPIO_EXTI_Callback(EC11M_Pin);/* USER CODE END EXTI4_15_IRQn 1 */
}//重写外部中断回调函数EC11按键清零计数值
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{/*判断是中断引脚*/if(GPIO_Pin == EC11M_Pin){__HAL_TIM_SET_COUNTER(&htim1, 0);    }}
  • 📑main函数代码
int main(void)
{/* USER CODE BEGIN 1 */uint32_t TimerUART;uint32_t Temp;/* 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_TIM1_Init();MX_USART2_UART_Init();/* USER CODE BEGIN 2 */
//	HAL_TIM_Encoder_Start(&htim1, TIM_CHANNEL_ALL);//查询方式__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());/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while(1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */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);}}/* USER CODE END 3 */
}

📚测试工程(模式三)

链接:https://pan.baidu.com/s/1idS6b4bA5YZXg54joM1WsA 
提取码:a0eg

🏳‍🌈模式一和模式二使用介绍

  • 🔖编码模式1和编码模式2使用方法一样,只不过触发信号通道不一样而已,EC11编码器每转动一小格,触发定时器计数脉冲数都是2次。
    在这里插入图片描述

  • 📋定时器输入捕获中断回调函数执行做调整修改即可。

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)==2){Trg = 0;CaptureNum = __HAL_TIM_GET_COUNTER(&htim1) / 2;}}
}
  • 🔖此文章仅作为个人学习探索知识的总结,不作为他人或引用者的理论依据,由于学识所限,难免会出现错误或纰漏,欢迎大家指正。
查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"STM32 HAL高级定时器正交编码模式案例":http://eshow365.cn/6-23397-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!