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

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐