STM32系列(HAL库) ——定时器编码器/正交解码模式

         STM32定时器的正交解码模式多用于检测电机的编码器脉冲数做闭环控制,如PID。本文简单介绍一下定时器在Cubemx如何配置以及程序引用到的API函数。

一、前期准备

1、硬件:

  • STM32C8T6最小系统板
  • USB-TTL串口模块
  • ST-Link下载器

2、软件:

  • keil5-IDE
  • cubeMX 

二、cubeMX配置

1、配置RCC——选着外部时钟源

2、配置SYS—— Serial Wire模式

3、时钟树拉满72M

4、配置串口1          

 5.编码器模式配置

  • 这里配置哪一个定时器都可以,只要在第2步存在 Encoder Mode 选项即可。
  • 第3步Encoder Mode T1 是只计上升沿,Encoder Mode T2是只计下降沿,Encoder Mode T1 and T2 就是2种都计。注意:此处可分别配置2个通道的触发模式,但截图只截到其中一个通道

 

 6.生成工程

        略

三、keil5代码

1、串口配置

        可以参考:STM32系列(HAL库) ——使用串口打印的3种方式,推荐第二种方法。

2、main函数

        ①在while(1)循环前添加初始化

uint16_t Count=0;
uint16_t Diretion=0;
HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);

      ②在whlie(1)循环中打印方向和计数值

 Diretion =  __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim2);     
 Count = __HAL_TIM_GET_COUNTER(&htim2);
 printf("转动方向:%d  脉冲数:%d \r\n",Diretion,Count );
 HAL_delay(500);
  • __HAL_TIM_IS_TIM_COUNTING_DOWN(&htim2):返回 0 或 1 ,代表转动方向
  • __HAL_TIM_GET_COUNTER(&htim2):返回计数脉冲值
  • 如果想看相同时间间隔的脉冲值,可在获得计数后使用 TIM2->CNT=0; 语句将定时器计数值清零。默认情况下定时器会计满65535后变成0

 

  • 16
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
对于使用STM32定时器编码器,你可以使用HAL库来进行编程。下面是一个示例代码,演示了如何设置定时器编码器。 首先,你需要初始化定时器编码器。假设你要使用的是TIM3定时器编码器模式。以下是初始化代码: ```c // 定义定时器编码器句柄 TIM_HandleTypeDef htim3; // 初始化定时器编码器 void TIM_Encoder_Init(void) { // 使能定时器时钟 __HAL_RCC_TIM3_CLK_ENABLE(); // 配置定时器参数 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; // 初始化定时器 HAL_TIM_Encoder_Init(&htim3, TIM_ENCODERMODE_TI1); // 启动定时器 HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL); } ``` 上述代码中,我们首先使能了定时器的时钟,并配置了定时器的参数。然后,我们使用`HAL_TIM_Encoder_Init()`函数来初始化定时器编码器,并使用`TIM_ENCODERMODE_TI1`模式来设置编码器模式。最后,使用`HAL_TIM_Encoder_Start()`函数启动定时器编码器。 接下来,你可以使用以下代码来读取编码器的值: ```c int32_t Get_Encoder_Value(void) { return (int32_t)htim3.Instance->CNT; } ``` 以上代码通过读取定时器的计数器值来获取编码器的值。你可以在需要的地方调用`Get_Encoder_Value()`函数来获取编码器的当前值。 这是一个简单的示例代码,演示了如何在STM32上使用HAL库进行定时器编码器编程。你可以根据自己的需求进行相应的修改和扩展。希望对你有帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌入式创客工坊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值