• 正文
  • 相关推荐
申请入驻 产业图谱

STM32的定时器做 FOC 的HALL 位置检测

10/28 17:04
1143
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

PMSM 的 FOC 控制中,我们需要精准的获得转子的电角度,有了这个电角度,我们才能在通过定子线圈产生一个定向的磁场,并且使得这个磁场方向超前电角度 90°,产生一个最大的力矩。这里规定电角度是指的 D 轴和 A 向线圈的夹角。

为了能够保证每一个时刻,我们生成的磁场都能够准确的和 D 轴垂直,从而时刻的产生的最大力矩,那么,获取到精准的定子角度就成了最重要的任务。

大部分高端应用中,我们可以把光编码器磁编码器电感应式的编码器设计进去,他们可以直接测量到转子机械角度,然后通过极对数就可以换算到电角度,这个电角度的精度很高。

但是在一些低端应用中,更多的选择是基于三相 hall 传感器来检测定子的位置。其中,三相 hall 在电气上呈 120° 排列。

电机旋转时,三个 hall 的输出信号如下图,相位也正好是 120 度。

从上图中的最后一个信号可以看出,如果我们将三个 hall 信号进行异或处理,那么我们就得到了一个 hall 信号三倍频的信号,这意味着,在一个电周期内,我们可以到的 6 个精确的边沿信号,于是我们将一个电周期的 360 度分成了 6 个扇区,到这里,至少让我们的位置传感器具备了 60° 的分辨率。

定时器实现 hall 位置检测的基本逻辑

如果只有 60° 的分辨率,那么做 FOC 的意义就不是特别大了,因为这将导致转矩波动特别大,而且由于角度对不齐,驱动起来的电机只能用来做振动按摩,所以还得想办法增加位置方面的分辨率和精度。

恰好,电机有一个特性,那就是电机的速度是一个相对比较慢的物理量,惯量越大的电机速度的变化越慢,如果电机的极对数很多,那么一个电周期上来说,这个速度几乎可以认为是不变的。再进一步,如果我们从两个扇区上来看,前后两个扇区的速度变化应该是更小的。

基于以上原理,我们可以采样 hall 的两个跳变边沿进行计时,然后就可以计算出旋转这 60 度所用的时间,这也就是转速,最后我们把计算出来的速度作为一个积分量,叠加到原来的,精确的 60 度分辨率的电角度上。此时我们就获得了一个精度足够高的电角度。

接下来的问题就变成了,我们该如何把速度检测出来,也就是如何利用定时器来计时,计算出两个边沿之间的时间差。

定时器的基本设置

先看定时器的基本功能,也就是计数功能。

定时器的基本设置主要是上面的四个部分,有了上图中的四个步骤,我们就可以设计出一个定时器出来用于计时。

首先,定时器的时钟采用内部计数,这里的时钟取决于定时器挂在哪个时钟总线上,时钟总线频率确定了以后,我们只能通过预分频器 PSC 来改变定时器的时基,也就是 CNT 计数器累加或者累减的频率。

自动重装载寄存器 ARR 是一个 16位的寄存器,这里面装着计数器能计数的最大数值。当计数到这个值的时候,如果使能了中断的话,定时器就产生溢出中断。

初始化一个定时器的基准,一般配置如下几个基础参数

typedef?struct?{? ??uint16_t?TIM_Prescaler; ? ? ? ? ?// 预分频器? ??uint16_t?TIM_CounterMode; ? ? ? ?// 计数模式? ??uint32_t?TIM_Period; ? ? ? ? ? ??// 定时器周期? ??uint16_t?TIM_ClockDivision; ? ? ?// 时钟分频? ??uint8_t?TIM_RepetitionCounter; ??// 重复计算器} TIM_TimeBaseInitTypeDef;

这里有些是 STM32特有的,但目前大多数 MCU 都与 ST 的相差无几。

(1) TIMPrescaler: 定时器预分频器设置,时钟源经该预分频器才是定时器时钟,它设定TIMxPSC寄存器的值。可设置范围为0至65535,实现1至65536分频。

(2) TIM_CounterMode: 定时器计数方式,可是在为向上计数、向下计数以及三种中心对齐模式。

(3) TIM_Period: 定时器周期,实际就是设定自动重载寄存器的值,在事件生成时更新到影子寄存器。可设置范围为0至65535。

(4) TIMClockDivision: 时钟分频,设置定时器时钟CKINT频率与数字滤波器采样时钟频率分频比,这个时钟分频不影响计数器,只是和滤波器有关系,不要和 PCS 寄存器混淆。

(5) TIM_RepetitionCounter: 重复计数器,属于高级控制寄存器专用寄存器位,利用它可以非常容易控制输出PWM的个数。在 FOC 中,如果我们想降低频率,也可以利用这个寄存器实现多个 PWM 周期进行一次FOC 运算。

STM32 定时器的特殊处理

如果用 STM32 的定时器来处理 hall,配置起来就要稍微麻烦一点,因为 STM32 的定时器具备 HALL 模式,在这个模式下,硬件上为hall 的采样提供了一些便利。

首先,STM32 定时器前端提供了一个异或模块,可以将三相 hall 直接异或后输出给定时器。

有 XOR 模块,我们可以直接获得一个 HALL 信号的 3 倍频信号,并且通过 IC1 通道可以触发中断,捕获到 CNT 的计数值。

这样我们就可以用当前捕获的 CNT 值,以及记录上一次的计数值CNT 做差运算即可获得两个边沿的持续时间了。

NO,不需要这么麻烦,因为 STM32 的定时器还有个从模式。

当我们把定时器配置为从模式后,定时器可以响应几个触发模式,也就是说一旦被触发,定时器可以执行特殊的操作,比如上图标记的复位模式,也就是说,一旦有外部信号触发,定时器就会复位,把 CNT 值清 0,如此,我们就不需要记录上一次的 捕获值了。

触发源怎么选呢?当然是每个 XOR 输出的边沿了,所以我们的从模式的触发源要选择 TI1F_ED 。这在 Cube 中配置如下:

到此为止,我们就有了一个能根据边沿触发中断,并且获得本次区间的时间长度的功能。

那么,这个捕获的时间能检测多长时间呢?

假设定时器时钟为 160MHz,不分频,定时器为 16bit 的时候,最长

可以检测的时间长度为

速度多快会导致检测不到,多慢会导致溢出呢?

为了确定速度的检测范围和溢出条件,我们需要考虑电机的转速和定时器的分辨率。假设定时器的时钟频率为160MHz,且不分频,定时器的计数位数为16位,那么定时器的最小分辨时间为:

最大可检测的时间长度为0.4096毫秒。

首先,我们来看速度过快的情况。

如果电机的转速过快,导致两个Hall信号边沿之间的时间间隔小于定时器的最小分辨时间,那么定时器将无法准确检测到这个时间间隔。具体来说,假设电机的极对数为30,转速最高为 1000 转/分钟,那么一个电周期的时间为 60/(1000 *30) = 0.002秒,即 2 毫秒。

这意味着在每个电周期内,Hall 信号边沿之间的时间间隔为 2/6 ≈ 0.333毫秒(因为一个电周期被分成 6 个扇区)。这个时间间隔远大于定时器的最小分辨时间 6.25 纳秒,因此在这种情况下,定时器能够准确检测到边沿之间的时间间隔。

然而,如果电机的转速进一步增加,例如达到 10,000 转/分钟,那么一个电周期的时间将缩短到 0.2 毫秒,Hall 信号边沿之间的时间间隔将变为 0.033毫秒,即 33 微秒。这个时间间隔仍然大于定时器的最小分辨时间,因此定时器仍然能够检测到边沿之间的时间间隔。

但是,如果电机的转速继续增加,例如达到 100,000 转/分钟,那么一个电周期的时间将缩短到 0.02 毫秒,Hall 信号边沿之间的时间间隔将变为 ?3.33 微秒。这个时间间隔仍然大于定时器的最小分辨时间,但已经接近定时器的检测极限。在这种情况下,定时器的检测精度可能会受到影响,导致无法准确测量转速。

接下来,我们来看速度过慢的情况

如果电机的转速过慢,导致两个Hall信号边沿之间的时间间隔超过定时器的最大可检测时间长度(0.4096 毫秒),那么定时器将无法完整记录这个时间间隔,从而导致溢出。

例如,如果电机的转速为 100 转/分钟,那么一个电周期的时间为?60/(100 *30) = 0.02秒,即 20 毫秒。

这意味着在每个电周期内,Hall 信号边沿之间的时间间隔为 3.33 毫秒。这个时间间隔远大于定时器的最大可检测时间长度 0.4096 毫秒,因此在这种情况下,定时器将无法完整记录边沿之间的时间间隔,导致溢出。

为了解决这个问题,我们可以通过增加定时器的分频系数来扩展定时器的检测范围。例如,如果我们将定时器的分频系数设置为 16,那么定时器的时钟频率将降低到 160/16 = 10 MHz,最大可检测的时间长度将增加到

这样,即使电机的转速降低到 100 转/分钟,定时器仍然能够完整记录边沿之间的时间间隔。

定时器的溢出处理

当定时器发生溢出时,我们可以通过中断或标志位来检测到这一事件。在中断处理函数中,我们可以记录溢出的次数,并结合当前的计数器值来计算两个Hall信号边沿之间的时间间隔。例如,假设定时器溢出了一次,那么实际的时间间隔可以表示为:

通过这种方式,我们可以扩展定时器的检测范围,使其能够适应更低的转速。

这里有个重点需要关注,那就是溢出中断,因为定时器工作在从模式下,从模式为复位模式,也就是当有 hall 边沿触发时,定时器也会产生额外中断,因此,如果我们计算溢出次数,还需要将hall 边沿触发的中断关掉,只保留定时器 update 的中断。

??/* USER CODE BEGIN TIM2_Init 2 */? __HAL_TIM_URS_ENABLE(&htim2);? __HAL_TIM_DISABLE_IT(&htim2, TIM_IT_TRIGGER); //关闭触发中断??/* USER CODE END TIM2_Init 2 */

 

如何优化定时器的配置以提高检测精度?

为了提高定时器的检测精度,尤其是在低转速或高转速的情况下,我们可以采取以下几种优化措施:

调整定时器的时钟频率:通过调整定时器的预分频器(PSC),可以改变定时器的时钟频率。降低时钟频率可以增加定时器的最大可检测时间长度,从而避免在低转速时溢出;而提高时钟频率则可以增加定时器的最小分辨时间,从而在高速时提供更精确的检测。

使用更高分辨率的定时器:如果MCU支持更高分辨率的定时器(例如32位定时器),则可以使用这些定时器来增加最大可检测时间长度和最小分辨时间,从而在更宽的转速范围内提供更精确的检测。

结合软件算法进行补偿:在低转速时,可以通过软件算法对定时器的溢出进行补偿,例如记录溢出次数并结合当前计数值来计算总的时间间隔。而在高转速时,可以通过插值或滤波算法来提高检测精度。

动态调整定时器配置:根据电机的实际转速动态调整定时器的配置。例如,在低速时降低时钟频率,而在高速时提高时钟频率,以确保在不同转速下都能获得最佳的检测精度。

通过这些优化措施,可以显著提高定时器在PMSM FOC控制中的检测精度,从而确保电机在不同转速下都能获得良好的控制效果。

相关推荐

登录即可解锁
  • 海量技术文章
  • 设计资源下载
  • 产业链客户资源
  • 写文章/发需求
立即登录