xld0932

  • 20 主题
  • 35 帖子
  • 1472 积分
  • 身份:LV4 高级技术员
  • 论坛新秀
  • E币:1263

NUCLEO-L412KB使用定时器正交编码功能解析编码器

2019-5-24 19:51:27 显示全部楼层
本帖最后由 xld0932 于 2019-5-24 19:53 编辑

1.概述

使用NUCLEO-L412开发板板载STM32L412KB定时器的正交编码功能实现对编码器的解析。通过这个项目掌握定时器的编码模式功能,同时对正交编码和编码器有所了解。

正交编码器又可称为增量式编码器或光电式编码器,有AB两相脉冲输出信号,这两个脉冲信号之间的相伴差为90度,故名正交脉冲。

本实验使用的是可360度旋转的旋转编码器模块,一圈脉冲数为20个。旋转编码器通过旋转可以计数顺时针方向和逆时针方向转动过程中输出脉冲的次数,在实际应用中,还可以配合旋转编码器上的按键,来复位旋转编码器脉冲计数值,从0开始计数。编码器具有高精度、抗磁干扰性能好、响应速度快、方便确认转动位置、容易识别转动方向等特点。

4.png

2.硬件连接

1.jpg

说明:
编码器的CLK和D引脚,即AB两相脉冲输出信号引脚,分别连接NUCLEO-L412开发板的PA8和PA9引脚。SW为编码器的按键,我们采用外部中断触发的形式来对其进行检测识别,所以我们连接NUCLEO-L412开发板的PB1引脚,使用EXTI1这个资源。+和GND分别连接NUCLEO-L412开发板的5V电源和地,给编码器模块供电。

3.STM32CubeMX设置

2.png

说明:
将定时器1的Combined Channels设置为Encoder Mode,然后对Counter Settings和Encoder的参数进行设置,如上图所示。外部中断的设置在上一个帖子中我们讲到了,这里就不再描述了。

Counter Period这个值设置成100的作用:100是编码器脉冲的计数周期,我们使用的编码器一圈的脉冲数是20,这里设计成100,就说明我们编码器转个5圈,脉冲计数值就归0了,重新开始累计计数。Input Filter是设置消除抖动的参数。

4.主要程序
  1. void MX_TIM1_Init(void)
  2. {
  3.     TIM_Encoder_InitTypeDef sConfig       = {0};
  4.     TIM_MasterConfigTypeDef sMasterConfig = {0};

  5.     htim1.Instance               = TIM1;
  6.     htim1.Init.Prescaler         = 0;
  7.     htim1.Init.CounterMode       = TIM_COUNTERMODE_UP;
  8.     htim1.Init.Period            = 100;
  9.     htim1.Init.ClockDivision     = TIM_CLOCKDIVISION_DIV1;
  10.     htim1.Init.RepetitionCounter = 0;
  11.     htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  12.     sConfig.EncoderMode          = TIM_ENCODERMODE_TI12;
  13.     sConfig.IC1Polarity          = TIM_ICPOLARITY_RISING;
  14.     sConfig.IC1Selection         = TIM_ICSELECTION_DIRECTTI;
  15.     sConfig.IC1Prescaler         = TIM_ICPSC_DIV1;
  16.     sConfig.IC1Filter            = 5;
  17.     sConfig.IC2Polarity          = TIM_ICPOLARITY_RISING;
  18.     sConfig.IC2Selection         = TIM_ICSELECTION_DIRECTTI;
  19.     sConfig.IC2Prescaler         = TIM_ICPSC_DIV1;
  20.     sConfig.IC2Filter            = 5;
  21.     if (HAL_TIM_Encoder_Init(&htim1, &sConfig) != HAL_OK)
  22.     {
  23.     }
  24.     sMasterConfig.MasterOutputTrigger  = TIM_TRGO_RESET;
  25.     sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET;
  26.     sMasterConfig.MasterSlaveMode      = TIM_MASTERSLAVEMODE_DISABLE;
  27.     if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK)
  28.     {
  29.     }

  30.     HAL_TIM_Encoder_Start(&htim1, TIM_CHANNEL_ALL);
  31. }
  1. void ENCODER_Handler(void)
  2. {
  3.     static uint32_t counter = 0;

  4.     uint32_t value = __HAL_TIM_GET_COUNTER(&htim1);

  5.     if(counter != value)
  6.     {
  7.         counter = value; printf("TIM COUNTER:%d\r\n", counter);
  8.     }
  9. }

5.运行结果

3.png

6.工程代码

Encoder.part03.rar (6.71 MB, 下载次数: 16)