基于STM32的反电动势无传感BLDC控制

Microchip 的应用笔记 AN1083 详细地讲述了一种无传感器无刷直流电机的控制算法,其配套的开源算法采用 dsPIC® 数字信号控制器实现,此前在淘宝购入了一块基于 STM32 的无刷直流电机开发板,于是试着将该开源代码移植至手上这块开发板上。开发板如下图所示:
基于STM32的反电动势无传感BLDC控制_第1张图片
因硬件平台不同,故需要对硬件相关部分的代码做修改,主要涉及定时器和 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 阶。以低速实现方案为例,滤波器各参数如下表所示:

    参数
    滤波器类型 低通 Butterworth IIR
    采样频率 43900Hz
    截止频率 6000Hz
    滤波器阶数 2阶

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

    [b,a] = butter(2,6000/21950)
    b =
    
       0.112882132982239   0.225764265964478   0.112882132982239
    a =
    
       1.000000000000000  -0.851149844168585   0.302678376097542

    在此有一点要非常留意,即 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格式,计算如下:

    round(b*32768/2)
    ans =
    1849        3699        1849
    round(a*32768/2)
    ans =
    16384      -13945        4959

    滤波器各个系数存储在数组中,数组索引和系数序列的关系在 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.

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

        /* 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)++;

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

    /* fs = 43900, fc = 6000 */
    q15_t IIR_coefficients[FILTER_NUM_STAGES * 6] =
    { 1849, 0, 3699, 1849, 13945, -4959 };

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

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

相关链接

移植代码下载
AN1083 中文版下载

你可能感兴趣的:(嵌入式开发)