STM32F4 HAL 旋转编码器使用

旋转编码器产生A B两个脉冲信号,通过STM32配置定时器检测编码器的速度及正反转。通过软件的方法实现四倍频,A B脉冲相差90度,A脉冲占据4个单位时间,B脉冲占据4个单位时间,当定时器同时检测A B脉冲,会提高分辨率,周期变为2个单位时间。

配置HAL的TIM模式及编码器模式。

 

 

敲代码

编写int getTimEncoder(void)接收定时器的数字。在一个时间段内,检测编码器脉冲数后,需定时器要重新置零。

重点:正反转需要强制类型转换(short)(__HAL_TIM_GET_COUNTER(&htim1)),变成一个有符号类型。如反转是会输出65500多的数字,强制类型转换后变成一个负数。

int getTimEncoder(void)
{
  int iTimerEncoder = 0
### STM32F4 HAL库中编码器模式的使用方法 #### 编码器模式概述 在STM32微控制器系列中,通用定时器(TIM)支持多种特殊工作模式,其中包括编码器接口模式。该模式允许通过两个输入通道读取增量型旋转编码器的位置信息[^1]。 #### 初始化设置 为了使能并配置定时器进入编码器模式,需先创建一个`TIM_Encoder_InitTypeDef`类型的结构体实例来指定参数,比如计数方向以及用于检测脉冲变化的GPIO引脚极性等属性。随后调用`HAL_TIM_Encoder_Init()`完成初始化操作。 ```c // 定义定时器句柄和编码器初始化结构体变量 TIM_HandleTypeDef htimX; TIM_Encoder_InitTypeDef sConfig; void MX_TIMX_Init(void){ // ...其他必要的硬件资源初始化... // 设置编码器模式相关参数 sConfig.EncoderMode = TIM_ENCODERMODE_TI1; // 仅使用TI1作为编码信号源 sConfig.IC1Polarity = TIM_ICPOLARITY_RISING; // TI1上升沿有效 sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI; // 直接连接到TI1 sConfig.IC1Prescaler = TIM_ICPSC_DIV1; // 不分频 sConfig.IC1Filter = 0x0A; // 数字滤波器系数 if (HAL_TIM_Encoder_Init(&htimX, &sConfig) != HAL_OK){ Error_Handler(); } } ``` #### 中断处理程序编写 当需要响应位置改变事件时,可以通过注册回调函数的方式实现中断服务例程(ISR),从而及时获取最新的计数值更新情况。通常情况下,在ISR内部会执行诸如保存当前时间戳或者触发状态机转换之类的动作。 ```c __weak void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ static uint32_t lastCount = 0; if(htim->Instance==TIMX){ int32_t currentPos=__HAL_TIM_GET_COUNTER(htim); /* 计算位移量 */ int32_t delta=currentPos-lastCount; lastCount=currentPos; // 进一步的数据处理逻辑... } } ``` #### 实际应用中的注意事项 - **外部电源供给**:确保给定的电机驱动电路能够提供足够的电流供应; - **机械安装精度**:保持轴系同轴度良好以减少误差累积影响测量准确性; - **电气噪声抑制措施**:采取适当屏蔽手段防止外界电磁干扰引入误判现象发生;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值