打印
[STM32H5]

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

[复制链接]
998|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
利用TIM编码器接口可以直接驱动EC11编码器,简化个人编码量。

1、设置TIM3为Encoder Mode

2、设置TIM3输入GPIO PA6 PA7上拉

3、生成代码:
static void MX_TIM3_Init(void)
static void MX_TIM3_Init(void)
{

  /* USER CODE BEGIN TIM3_Init 0 */

  /* USER CODE END TIM3_Init 0 */

  TIM_Encoder_InitTypeDef sConfig = {0};
  TIM_MasterConfigTypeDef sMasterConfig = {0};

  /* USER CODE BEGIN TIM3_Init 1 */

  /* USER CODE END TIM3_Init 1 */
  htim3.Instance = TIM3;
  htim3.Init.Prescaler = 0;
  htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim3.Init.Period = 65535;
  htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
  sConfig.EncoderMode = TIM_ENCODERMODE_TI12;
  sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;
  sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;
  sConfig.IC1Prescaler = TIM_ICPSC_DIV1;
  sConfig.IC1Filter = 16;
  sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
  sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
  sConfig.IC2Prescaler = TIM_ICPSC_DIV1;
  sConfig.IC2Filter = 16;
  if (HAL_TIM_Encoder_Init(&htim3, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
  sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;
  sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;
  if (HAL_TIMEx_MasterConfigSynchronization(&htim3, &sMasterConfig) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN TIM3_Init 2 */

  /* USER CODE END TIM3_Init 2 */

}
4、main函数中:

int main(void)
{

  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

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

  /* USER CODE BEGIN Init */
        int CaptureNumber = 0;
        char temp[8];
  /* 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_TIM3_Init();
  /* USER CODE BEGIN 2 */
       
        LCD_DB0_CLR;
        LCD_DB1_CLR;
        LCD_DB2_CLR;
        LCD_DB3_CLR;
        LCD_DB4_CLR;
        LCD_DB5_CLR;
        LCD_DB6_CLR;
        LCD_DB7_CLR;

        InitLCD();
        LCD_LED_SET;

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

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */

        GUI_WriteASCII(30,30,"Encoder",VGA_WHITE,VGA_RED);
  while (1)
  {

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
       
               
                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);
                       
   }


         
  }
       
  /* USER CODE END 3 */
}
设置编码器初值,并启动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、效果




使用特权

评论回复
沙发
Henryko| | 2024-8-14 09:49 | 只看该作者
这怎么驱动的啊

使用特权

评论回复
板凳
Undshing| | 2024-8-14 09:56 | 只看该作者
Henryko 发表于 2024-8-14 09:49
这怎么驱动的啊

定时器配置成编码器模式

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

37

主题

75

帖子

0

粉丝