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

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


  • 🔖基于stm32F030RBT6单片机采用高级定时器1,编码器模式,测试EC11编码器。
  • 🎬EC11测试效果:

  • 🌿STM32定时器编码器有3种映射模式:

  • ✨本次采用的是上面的模式3,EC11编码器每转动一小格,TIM1定时器可以捕获到4个脉冲信号,也就是定时器捕获4个脉冲信号就代表编码器旋转了一小格。


  • 🌿EC11编码器原理图

🛠STM32CubeMX配置

  • 🌿使能高级定时器TIM1,配置编码器模式。

  • 🔧参数配置

  • 🌿编码器引脚配置:

  • 🌿EC11编码器按键引脚配置

  • 🌿中断配置

📓功能代码实现部分

  • 📝中断回调部分
c 复制代码
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函数代码
c 复制代码
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 */
}

📚测试工程(模式三)

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

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

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

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

c 复制代码
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;
				}
    }
}
  • 🔖此文章仅作为个人学习探索知识的总结,不作为他人或引用者的理论依据,由于学识所限,难免会出现错误或纰漏,欢迎大家指正。
相关推荐
恒锐丰科技韩生1 天前
SS8844T|8.2‑40V 四通道独立半桥驱动 ETSSOP28 带散热焊盘 工业自动化机器人专用
嵌入式硬件·硬件工程
Hello_Damon_Nikola1 天前
INMP441从入门到精通
单片机·嵌入式硬件·物联网
恒锐丰小瑞1 天前
率能SS6810H 32V/1A/双通道H桥驱动芯片,PWM电流控制与混合衰减模式,用于POS打印机/安防相机/机器人
嵌入式硬件·数码相机·机器人·硬件工程
恒锐丰科技林技术员1 天前
SS8812T 双通道 H 桥电机驱动芯片应用解析
经验分享·嵌入式硬件·硬件工程
ye150127774551 天前
12V转3V-5V2A电位器无极调光调速WT7027
stm32·单片机·嵌入式硬件
恒锐丰-罗生1 天前
国产电机驱动 SS6635E|宽压大电流单通道 H 桥芯片全面总结
驱动开发·嵌入式硬件·硬件工程
无损检测小白白1 天前
STM32F407 串口3 DMA收发-标准库
stm32·单片机·嵌入式硬件
恒锐丰小瑞1 天前
率能SS6812T 40V/1A/双通道H桥驱动芯片,PWM电流控制与混合衰减模式(eTSSOP28),用于POS打印机/安防相机/机器人
单片机·嵌入式硬件·数码相机·机器人
深念Y1 天前
JMS583 USB-NVMe 桥接芯片 LED 控制探索
嵌入式硬件·嵌入式·led·usb·电子·维修·硬盘盒
嵌入式阿蔡1 天前
传感器_02:MPU6050 六轴 IMU 姿态入门——从一串看不懂的数,到一个不漂的角度
网络·stm32·单片机·嵌入式硬件·嵌入式实时数据库