STM32解析霍尔磁角度传感器PWM脉冲角度数据
摘要:本文介绍了使用STM32解析霍尔磁角度传感器(如MT6701、AS5600)输出的PWM脉冲角度数据的方法。通过STM32的TIM输入捕获功能,测量PWM信号的高电平和低电平时间,结合不同传感器的PWM定义,可计算出电机轴角度。以STM32G0B1CBT6为例,详细说明了硬件接口配置和软件实现,包括输入捕获中断处理函数,将计数值转换为时间后,根据传感器规格计算角度值。该方法适用于多种PWM模
STM32解析霍尔磁角度传感器PWM脉冲角度数据
电机运转时,可以通过编码器/霍尔磁角度传感器(如MT6701)输出的PWM脉冲,实现电机轴角度的检测。STM32的TIM支持输入捕获,可以利用输入捕获方式,实现PWM信号输入的识别。
PWM脉冲角度介绍
传感器输出的PWM信号,利用占空比的时间关系来体现角度信息。不同传感器的PWM信息定义不同。
MT6701的定义:
AS5600的定义:
可以看出,虽然PWM的周期不同,前导高电平后后导低电平时间不同,但表达模式是一样的,只要把PWM的高电平和低电平时间测试出来,再基于具体的PWM定义,就可以解析出角度信息。
STM32硬件接口
这里以STM32G0B1CBT6为例,介绍角度信息PWM脉宽时间的测量,采用STM32CUBEIDE开发环境。首先建立基本工程并初始化时钟,采用内部时钟和外部时钟皆可。这里设置时钟为50MHz。
选择TIM2的通道1管脚作为输入捕获的管脚,TIM2的时钟也是50MHz。进行输入捕获的配置:


保存并生成基本工程代码。
功能代码
实现PWM脉宽计数,首先定义两个变量:
uint32_t PWM_SEG1 = 0;
uint32_t PWM_SEG2 = 0;
其中PWM_SEG1是对应PWM的高电平时间的计数值,PWM_SEG2是对应PWM的低电平时间的计数值。
然后在代码中加入输入捕获启动的代码:
HAL_TIM_IC_Start_IT(&htim2, TIM_CHANNEL_1);
然后实现中断处理函数,注意一开始的设置是对上升沿进行捕获,即在上升沿触发中断,这里会在中断处理函数中,切换上升沿和下降沿触发方式,从而实现PWM高电平和低电平的计数。
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
static uint8_t sensor_pwm_status = 0;
if(htim == &htim2)
{
if(sensor_pwm_status==0)
{
sensor_pwm_status = 1;
PWM_SEG2 = __HAL_TIM_GET_COUNTER(&htim2);
__HAL_TIM_SET_COUNTER(&htim2, 0);
//Change capture edge
__HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING);
}
else
{
sensor_pwm_status = 0;
PWM_SEG1 = __HAL_TIM_GET_COUNTER(&htim2);
__HAL_TIM_SET_COUNTER(&htim2, 0);
//Change capture edge
__HAL_TIM_SET_CAPTUREPOLARITY(&htim2, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);
}
}
}
传感器输出的PWM角度信息脉冲,是连续性输出,所以读取PWM_SEG1可以得到PWM高电平的计数值,读取PWM_SEG2可以得到PWM低电平的计数值,将计数值乘以单位计数时间,就可以得到各自的时长。这里TIM2的时钟为50MHz,即单位计数的时长为2ns。
高电平的时长+低电平的时长=PWM周期。因此对于传感器输出有不同模式PWM角度信息的情况,可以先通过测得的PWM周期评估是哪一种模式,再通过高电平的时长,来计算角度值。
譬如MT6701输出PWM为994.4Hz模式,STM32测到的PWM高电平时间宽度为
| TH(ns) = PWM_SEG1 *2(ns) | |
|---|---|
则
| 电机轴所在角度(度) = ((TH - 16*244) / 244) * 0,088 | |
|---|---|
–End
更多推荐



所有评论(0)