STM32学习笔记:使用CUBE MX设置定时器工作在编码器模式

        编码器根据工作原理可以分为很多类,在工业控制领域,编码器也得到了广泛地应用。编码器的结构和工作原理,CSDN中有很多好的文章,我在这里就不在重复造轮子了。在此仅对STM32单片机定时器的编码器模式作一个简单的学习记录,作为以后正式使用时的参考资料。

前期准备:

MCU:野火 STM32F407IGT6 骄阳开发板

软件:STM32CUBEMX + KEIL

1,使用CUBEMX设置时钟频率,使用高速外部晶振25MHz,系统总线频率168MHz

2,编程接口设置:使用串口Serial Wire

3,选择定时器,并将定时器设置为编码器模式;

      在STM32F407IGT6的三种编码器中(TIM1--TIM14),除了基本定时器(TIM6,TIM7,TIM10,TIM11,TIM13,TIM4)外,其它高级定时器通用定时器均具备编码器接口功能,在此,我们选择通用定时器TIM3来作为编码器输出的接口

       将TIM3设置为Encoder Mode编码器模式后,TIM3的信号来源固定为从TIM3 Channel1和TIM3 Channel2输入,所以该页面中时钟源等选项都变成了灰色,禁止修改。

参考下图——STM32F407IGT6通用定时器框图,编码器模式的信号来源确实为TIMx_CH1和TIMx_CH2的边沿触发。

4,对编码器模式的相关参数进行设置;

计数分频值设置为0,即输入信号不分频;

工作模式:Encoder Mode TI1 and TI2,在TI1和TI2的上升沿,下降沿同时计数,即4倍频;

Input Filter = 1,开启输入滤波器;

5,开启TIM3全局中断 TIM3 global interrupt;

计数器为16位,每计数65535次后,会产生一个计数器溢出中断,在该中断里使用变量记录产生的中断次数,即计数器溢出次数,便于后续对总的脉冲数量进行统计;

工作模式为模式3,在TI1和TI2的上升沿,下降沿同时计数,即4倍频;

至此,CUBEMX对STM32F407IGT6的初始化工作已经完成,点击GENERATE CODE自动生成初始化代码。但此时的编码器并不能够正常工作,需要对生成的代码进行相关补充:

1,启动TIM3并开启所有通道(CH1,CH2)

HAL_TIM_Encoder_Start_IT(&htim3,TIM_CHANNEL_ALL);    

2,使能更新中断,用于溢出计数

__HAL_TIM_ENABLE_IT(&htim3,TIM_IT_UPDATE);                //使能更新中断用于溢出计数

3,在重写更新中断回调函数“HAL_TIM_PeriodElapsedCallback”增加更新计数

/* USER CODE BEGIN 4 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
    /* TIM3定时器编码器模式,更新中断 */
    if(htim->Instance == TIM3)                                              //来自TIM3的更新中断
    {
        Encoder1_Overflow_count++;                                    //Encoder1溢出次数+1
        
        __HAL_TIM_CLEAR_IT(&htim3,TIM_IT_UPDATE);        //清除Encoder1更新中断
    }
}

/* USER CODE END 4 */

本文仅介绍了编码器模式的初始化代码,具体使用时还需要继续丰富代码的功能

另外,如果需要读取当前计数器的值,可以使用__HAL_TIM_GET_COUNTER(&htim3);

  • 21
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
STM32F103系列微控制器中,定时器编码器模式是通过两个输入通道(通常称为A相和B相)来读取旋转编码器的输入信号。编码器通常是一种用于测量转动位置和速度的设备。 在编码器模式下,定时器通过检测A相和B相的脉冲信号的变化来计算转动方向和计数值。下面是STM32F103定时器编码器模式工作原理: 1. 定时器设置: - 定时器配置为边沿对齐模式(TIM_CounterMode_Up),计数值在每个周期内递增。 - 选择合适的预分频因子(TIM_Prescaler)来控制计数频率。 - 设置适当的计数周期(TIM_Period)来确定计数器溢出前的计数范围。 2. 编码器模式配置: - 使用TIM_EncoderInterfaceConfig函数将定时器配置编码器模式。 - 选择合适的编码器模式(TIM_EncoderMode_TI1或TIM_EncoderMode_TI2)。 - 设置A相和B相输入通道的极性(上升沿、下降沿或双边沿)。 3. 读取编码器计数值: - 使用TIM_GetCounter函数读取编码器的当前计数值。 - 编码器计数值的变化表示旋转方向和步长。 当旋转编码器的A相和B相输入信号发生变化时,定时器将根据输入信号的状态变化自动更新计数器的值。通过读取定时器的计数值,可以获得编码器的当前位置和速度信息。 需要注意的是,具体的编码器模式配置和计数值解释可能因不同的编码器类型和应用而有所不同。以上是一般的工作原理,具体实现时还需参考相关的编码器规格和STM32F103系列微控制器的参考手册。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值