STM32
直播中

douyin8

12年用户 1115经验值
私信 关注
[问答]

怎么实现基于STM32的反电动势无传感BLDC控制?

怎么实现基于STM32的反电动势无传感BLDC控制?

回帖(1)

李桂芝

2021-11-22 09:42:06
Microchip 的应用笔记 AN1083 详细地讲述了一种无传感器无刷直流电机的控制算法,其配套的开源算法采用 dsPIC® 数字信号控制器实现,此前在淘宝购入了一块基于 STM32 的无刷直流电机开发板,于是试着将该开源代码移植至手上这块开发板上。开发板如下图所示:





因硬件平台不同,故需要对硬件相关部分的代码做修改,主要涉及定时器和 AD 转换器,又由于其 IIR 滤波算法采用汇编代码编写,在此用 CMSIS DSP Software Library 中相应的算法替换。对移植过程中的主要改动做了如下笔记。


  • 定时器
    定时器计数频率选定为 4MHz,则最大计时时间为 65535 / 4000000 = 0.0164s。在低速实现方案中,定时器测量 60° 电角度的时间应小于 0.0164s,则电机转过 360° 电角度的时间应小于 0.0984s,即每分钟电气旋转次数应大于 610RPMElec。
    此款开发板配套的电机为 4 对极,则每分钟机械旋转次数应大于 610RPMElec / 4 = 152RPMMech,才能保证在测得 60° 电角度前计数器不溢出。
  • AD 采样
    与原程序相同,低速时对电机的所有三个相进行采样,高速时仅采样和滤波一相的信号。在移植的程序中,低速时的采样频率为 43.9kHz,高速时的采样频率为 73.2kHz。值得一提的是,STM32参考手册中指出ADC的输入时钟不得超过14MHz。
  • 数字滤波
    滤波器参数参考应用笔记 AN1083 表1,考虑到 STM3210x 系列性能有限,滤波器阶数选定为 2 阶。以低速实现方案为例,滤波器各参数如下表所示:
      [tr]参数值[/tr]
    滤波器类型低通 Butterworth IIR
    采样频率43900Hz
    截止频率6000Hz
    滤波器阶数2阶


指定这些参数后,使用 MATLAB 计算 IIR 滤波器的系数如下:


在此有一点要非常留意,即 a1 和 a2 的符号,在 CMSIS DSP Software Library 的文档中对此进行了说明:
Pay careful attention to the sign of the feedback coefficients. Some design tools use the difference equation
y[n] = b0 * x[n] + b1 * x[n-1] + b2 * x[n-2] - a1 * y[n-1] - a2 * y[n-2]
In this case the feedback coefficients a1 and a2 must be negated when used with the CMSIS DSP Library.

查阅 CMSIS DSP Software Library 的文档可知,需要将滤波器的系数做缩放处理,原文如下:
Scaling of coefficients: Filter coefficients are represented as fractional values and coefficients are restricted to lie in the range [-1 +1). The fixed-point functions have an additional scaling parameter postShift which allow the filter coefficients to exceed the range [+1 -1). At the output of the filter’s accumulator is a shift register which shifts the result by postShift bits.
postShift 的值选定为1,此时各系数需除以2,可满足各参数在[-1 +1)区间内。而后,需要将系数转换为Q15格式,计算如下:

滤波器各个系数存储在数组中,数组索引和系数序列的关系在 CMSIS DSP Software Library 的文档中已有说明:
The coefficients are stored in the array pCoeffs in the following order:
{b10, 0, b11, b12, a11, a12, b20, 0, b21, b22, a21, a22, …}
where b1x and a1x are the coefficients for the first stage, b2x and a2x are the coefficients for the second stage, and so on. The pCoeffs array contains a total of 6*numStages values.

此外,也可通过阅读其源代码判定数组索引和系数序列的关系:

可以看出数组索引0、2、3对应b0、b1、b2;索引4、5对应a1、a2。
综上所述,系数数组代码如下:


最后,依照选定的滤波器参数在 MATLAB 的 Filter Design & analysis 工具中绘制群延迟曲线。观察群延迟曲线,在 1666Hz 至 0Hz 时,相位延迟差别较小约为 37µs,在计算相位延迟时间时需将滤波器的延迟时间包含在内。







      • /* fs = 43900, fc = 6000 */
      • q15_t IIR_coefficients[FILTER_NUM_STAGES * 6] =
      • { 1849, 0, 3699, 1849, 13945, -4959 };
      • /* Read the b0 and 0 coefficients using SIMD  */
      • b0 = *__SIMD32(pCoeffs)++;


      • /* Read the b1 and b2 coefficients using SIMD */
      • b1 = *__SIMD32(pCoeffs)++;


      • /* Read the a1 and a2 coefficients using SIMD */
      • a1 = *__SIMD32(pCoeffs)++;
      • round(b*32768/2)
      • ans =
      • 1849        3699        1849
      • round(a*32768/2)
      • ans =
      • 16384      -13945        4959
      • [b,a] = butter(2,6000/21950)
      • b =


      • 0.112882132982239   0.225764265964478   0.112882132982239
      • a =


      • 1.000000000000000  -0.851149844168585   0.302678376097542

    • 其他
      该开发板所选用的 STM32F103RB 不具备 DAC 外设,故将其替换为 STM32F105RC 以便通过 DAC 输出相关波形用示波器观察。此外,所用的开发环境为 Keil uVision5。
      为方便操作增加了必要的按键功能,FUN 键对应无传感运行,UP 键对应霍尔传感器运行,运行时按下 FUN 键或 UP 键都能停止运行。
      已知的 bug,当无传感启动由开环运行切换到闭环运行时,有可能因为误进入高速实现方案,而导致启动失败。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分