使用STM32实现PMSM电机的正弦驱动

Microchip 的应用笔记 AN1017 讲述了一种使用空间矢量调制(Space Vector Modulation,SVM)方法产生用于驱动 PMSM 电机各相的正弦电流,以此驱动具有霍尔位置传感器的永磁同步电机(Permanent Magnet Synchronous Motor,PMSM)的控制算法,其配套的开源算法采用 dsPIC® 数字信号控制器实现,此前在淘宝购入了一块基于 STM32 的无刷直流电机开发板,于是试着将该开源代码移植至手上这块开发板上。开发板如下图所示:

  • 中断服务程序一览表
    中断 何时调用 执行操作
    TIM1 20kHz 根据当前位置使用 SVM 产生正弦波
    TIM2 1kHz 电机堵转保护,执行 PID 控制
    TIM3 霍尔信号跳变 计算转子位置,确定转子机械方向,实现正弦波指针与转子位置的同步
    DMA1 54.9kHz 读取来自电位器的新转速给定值

其中定时器3被配置为“接口定时器”,捕获/比较通道1对每一次霍尔信号的跳变进行捕获,捕获值为电机转过60°电角度的时间,以此计算转速;捕获/比较通道2被配置为对其中一路霍尔反馈信号的下降沿进行捕获,即电机每转过180°电角度(经评论区lanmanck指正,应为360°)判定一次运转方向,避免在霍尔信号跳变的临界区域对运转方向判定带来干扰。

  • PID 算法
    速度环 PID 算法采用 CMSIS DSP Software Library 中提供的 Q15 格式 PID 算法,查阅其资料可知该算法同 AN1017 所述,从常规 PID 形式改进至类滤波器 PID 实现形式,算法如下:

Algorithm:
y[n] = y[n-1] + A0 * x[n] + A1 * x[n-1] + A2 * x[n-2]
A0 = Kp + Ki + Kd
A1 = (-Kp ) - (2 * Kd )
A2 = Kd

在此,对该算法进行推导,由 PID 算法的定义有:
y[n] = Kp * x[n] + Ki * (x[n] + x[n-1] + … ) + Kd * (x[n] - x[n-1])

y[n-1] = Kp * x[n-1] + Ki * (x[n-1] + x[n-2] + … ) + Kd * (x[n-1] - x[n-2])

两式相减:
y[n] - y[n-1] = Kp * (x[n] - x[n-1]) + Ki * x[n] + Kd * (x[n] - x[n-1] - x[n-1] + x[n-2]

则原式得证:
y[n] = y[n-1] + (Kp + Ki + Kd) * x[n] + (-Kp - 2 * Kd) * x[n-1] + Kd * x[n-2]

  • 按键操作说明
    FUN 键作为运行与停止的控制,UP 键作为转速给定方向的切换。

  • 实测波形
    正弦电流的产生依赖于对转子位置的估测,现将程序中变量 Phase 通过 DA 输出,用示波器测量电机运转在1000 RPM 时的波形如下:
    使用STM32实现PMSM电机的正弦驱动_第1张图片
    通过霍尔传感器对电机线电流进行观测,电机运转在1000 RPM 时的电流波形如下:
    使用STM32实现PMSM电机的正弦驱动_第2张图片
    电机运转在4000 RPM 时的电流波形如下:
    使用STM32实现PMSM电机的正弦驱动_第3张图片

相关链接

移植代码下载

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