[STM32H5] 【STM32 Nucleo-64测评】6、定时器测试-TIM编码器接口驱动EC11旋转编码器

[复制链接]
 楼主| sujingliang 发表于 2024-8-7 14:19 | 显示全部楼层 |阅读模式
<
利用TIM编码器接口可以直接驱动EC11编码器,简化个人编码量。

1、设置TIM3为Encoder Mode
TIM3.png
2、设置TIM3输入GPIO PA6 PA7上拉
TIM3_1.png
3、生成代码:
static void MX_TIM3_Init(void)
  1. static void MX_TIM3_Init(void)
  2. {

  3.   /* USER CODE BEGIN TIM3_Init 0 */

  4.   /* USER CODE END TIM3_Init 0 */

  5.   TIM_Encoder_InitTypeDef sConfig = {0};
  6.   TIM_MasterConfigTypeDef sMasterConfig = {0};

  7.   /* USER CODE BEGIN TIM3_Init 1 */

  8.   /* USER CODE END TIM3_Init 1 */
  9.   htim3.Instance = TIM3;
  10.   htim3.Init.Prescaler = 0;
  11.   htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  12.   htim3.Init.Period = 65535;
  13.   htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  14.   htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  15.   sConfig.EncoderMode = TIM_ENCODERMODE_TI12;
  16.   sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
  17.   sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
  18.   sConfig.IC1Prescaler = TIM_ICPSC_DIV1;
  19.   sConfig.IC1Filter = 16;
  20.   sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
  21.   sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
  22.   sConfig.IC2Prescaler = TIM_ICPSC_DIV1;
  23.   sConfig.IC2Filter = 16;
  24.   if (HAL_TIM_Encoder_Init(&htim3, &sConfig) != HAL_OK)
  25.   {
  26.     Error_Handler();
  27.   }
  28.   sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  29.   sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  30.   if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  31.   {
  32.     Error_Handler();
  33.   }
  34.   /* USER CODE BEGIN TIM3_Init 2 */

  35.   /* USER CODE END TIM3_Init 2 */

  36. }
4、main函数中:

  1. int main(void)
  2. {

  3.   /* USER CODE BEGIN 1 */

  4.   /* USER CODE END 1 */

  5.   /* MCU Configuration--------------------------------------------------------*/

  6.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  7.   HAL_Init();

  8.   /* USER CODE BEGIN Init */
  9.         int CaptureNumber = 0;
  10.         char temp[8];
  11.   /* USER CODE END Init */

  12.   /* Configure the system clock */
  13.   SystemClock_Config();

  14.   /* USER CODE BEGIN SysInit */

  15.   /* USER CODE END SysInit */

  16.   /* Initialize all configured peripherals */
  17.   MX_GPIO_Init();
  18.   MX_TIM3_Init();
  19.   /* USER CODE BEGIN 2 */
  20.        
  21.         LCD_DB0_CLR;
  22.         LCD_DB1_CLR;
  23.         LCD_DB2_CLR;
  24.         LCD_DB3_CLR;
  25.         LCD_DB4_CLR;
  26.         LCD_DB5_CLR;
  27.         LCD_DB6_CLR;
  28.         LCD_DB7_CLR;

  29.         InitLCD();
  30.         LCD_LED_SET;

  31.         clrScr(VGA_RED);
  32.        
  33.         __HAL_TIM_GET_COUNTER(&htim3) = 0; //计数器值置位
  34.     HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
  35.   /* USER CODE END 2 */

  36.   /* Infinite loop */
  37.   /* USER CODE BEGIN WHILE */

  38.         GUI_WriteASCII(30,30,"Encoder",VGA_WHITE,VGA_RED);
  39.   while (1)
  40.   {

  41.     /* USER CODE END WHILE */

  42.     /* USER CODE BEGIN 3 */
  43.        
  44.                
  45.                 if(__HAL_TIM_GET_COUNTER(&htim3) != 0) {
  46.                                 char        Dir = __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim3); //读取转动方向:0为正、1为负
  47.                                 if(Dir)CaptureNumber--;
  48.                                 else CaptureNumber++;
  49.                                 __HAL_TIM_GET_COUNTER(&htim3) = 0; //计数器值重新置位

  50.                                 sprintf(temp,"%03d",CaptureNumber);
  51. GUI_WriteASCII64x32(35,60,temp,VGA_WHITE,VGA_RED);
  52.                        
  53.    }


  54.          
  55.   }
  56.        
  57.   /* USER CODE END 3 */
  58. }
设置编码器初值,并启动TIM3
__HAL_TIM_GET_COUNTER(&htim3) = 0; //计数器值置位
HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);


轮询方式读取编码值,显示在LCD上
if(__HAL_TIM_GET_COUNTER(&htim3) != 0) {
char Dir = __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim3); //读取转动方向:0为正、1为负
if(Dir)CaptureNumber--;
else CaptureNumber++;
__HAL_TIM_GET_COUNTER(&htim3) = 0; //计数器值重新置位
sprintf(temp,"%03d",CaptureNumber);
GUI_WriteASCII64x32(35,60,temp,VGA_WHITE,VGA_RED);
}



5、效果

微信图片_20240807141344.jpg

22cdc566-badf-4551-bf48-8460fe295eba.gif
Henryko 发表于 2024-8-14 09:49 来自手机 | 显示全部楼层
这怎么驱动的啊
Undshing 发表于 2024-8-14 09:56 来自手机 | 显示全部楼层
Henryko 发表于 2024-8-14 09:49
这怎么驱动的啊

定时器配置成编码器模式
9dome猫 发表于 2024-12-31 19:26 | 显示全部楼层
在 Configuration 中,你还可以设置时钟源、预分频器等。
OKAKAKO 发表于 2024-12-31 22:06 | 显示全部楼层
TIM编码器说明书能发一下嘛?
LOVEEVER 发表于 2024-12-31 23:04 | 显示全部楼层
学习一下不错的案例
您需要登录后才可以回帖 登录 | 注册

本版积分规则

84

主题

146

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部

84

主题

146

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部