FOC矢量控制

目录

  • 前言
  • 一、开发环境搭建
    • 1.1 X-CUBE-MCSDK软件的安装
    • 1.2 STM32CubeMX软件安装
  • 二、FOC原理介绍
    • 2.1 FOC框图介绍
    • 2.2 FOC坐标变换
      • 2.2.1 Clarke变换
      • 2.2.2 Park变换
      • 2.2.3 FOC的目的
    • 2.3 SVPWM算法
      • 2.3.1 SVPWM介绍
      • 2.3.2 SVPWM算法讲解
  • 三、FOC例程创建
    • 3.1 新建项目
    • 3.2 参数配置
      • 3.2.1 芯片相关参数选择
      • 3.2.2 电压参数设置
      • 3.2.3 电机配置
      • 3.2.4 驱动板参数设置
      • 3.2.5 固件驱动管理
    • 3.3 生成工程代码
    • 3.4 修改工程代码
      • 3.4.1 修改系统时钟配置
      • 3.4.2 初始化 SD 控制脚
      • 3.4.3 修改电压传感器
      • 3.4.4 修改温度传感器
    • 3.5 编译下载测试
  • 四、ST MCSDK库源码介绍
    • 4.1 总体软件架构
    • 4.2 电机控制库文件
    • 4.3 电机控制API
  • 补充


前言

  FOC(field-oriented control)为磁场定向控制,又称为矢量控制(vectorcontrol),是目前无刷直流电机(BLDC)和永磁同步电机(PMSM)高效控制的最佳选择。FOC 可以精确地控制磁场大小与方向,使得电机转矩平稳、噪声小、效率高,并且具有高速的动态响应。目前已在很多应用上逐步替代传统的控制方式,在运动控制行业中备受瞩目。
  我们都知道,电流可以产生磁场,并且磁场大小与电流大小成正比,因此为了使定子构造最合适的旋转磁场,需要精确控制线电流。想要磁场旋转就需要线电流做着正弦变化,而3 组线圈绕组的角度差,就使得三相电流需要时刻做相位差为 120 度的正弦变化,这时可使定子构造最合适的旋转磁场,显然简单的 6 步换向无法控制三相电流做正弦变化,转矩在一定程度上会有跳变,这样无法输出稳定转矩,因此需要 FOC 来保持转子的扭矩时刻连续稳定可调。下面总结六步换向和 FOC 控制方式的对比表,如表:
FOC矢量控制_第1张图片

  本文主要介绍无刷直流电机BLDC的FOC矢量控制的实现


一、开发环境搭建

  X-CUBE-MCSDK 是 ST(意法半导体)推出的 STM32 电机控制软件开发套件(MCSDK),使用该软件对电机进行配置后,可以直接生成 FOC 控制电机源码工程,简化了开发过程。

1.1 X-CUBE-MCSDK软件的安装

  可以直接去ST官网下载,软件共有两种版本:X-CUBE-MCSDK 和 X-CUBE-MCSDK-FUL,其中 X-CUBE-MCSDK 在一些核心的算法使用 lib 的形式提供给用户,X-CUBE-MCSDK-FUL 则是完整的源码,如下图所示,不过其中 X-CUBE-MCSDK-FUL 在注册并获得批准后方可下载,X-CUBE-MCSDK 则不需要批准可以直接下载。也可以在附件资源中下载。

官网:https://www.st.com/content/st_com/zh.html
FOC矢量控制_第2张图片
  下载后可以得到名为:X-CUBE-MCSDK-FUL_5.4.4.exe 的安装包,双击安装即可,安装过程很简单这里就不在截图说明,注意,安装路径中不能有中文。安装完成后会在桌面生成 MotorControlWorkbench 5.4.4 和 Motor Profiler 5.4.4 两个软件,Motor Profiler 5.4.4 是用于自动测量电机参数的软件,不过使用该软件需要使用 ST 相关的主板和电机驱动板才可以,这里就不介绍该软件的时候方法。MotorControl Workbench 5.4.4 才是我们需要的软件,可以使用该软件配置电机驱动板等参数后就可以生成源代码。
  打开MotorControlWorkbench 5.4.4可能会提示以下,直接点下载即可
FOC矢量控制_第3张图片

1.2 STM32CubeMX软件安装

  完成了 X-CUBE-MCSDK-FUL 的安装,接着我们还需要安装 STM32CubeMX,因为使用 X-CUBE-MCSDK-FUL 配置完之后,在生成代码时需要使用到 STM32CubeMX。

安装详见https://blog.csdn.net/weixin_44567668/article/details/133170724

二、FOC原理介绍

2.1 FOC框图介绍

FOC矢量控制_第4张图片
  上图是以电流闭环控制为例,也就是让电机始终保持一个恒定力矩(力矩与电流成正比)。从上图可以看到最左边的 Iq_Ref 和 Id_Ref 两个变量经过 PID 控制器进行反馈调节,其中涉及到几个变换模块,包括:Clarke 变换、Park 变换以及反 Park 变换,最后是 SVPWM 模块作用到三相逆变器进而控制电机旋转。相信大家对上面这些过程不是很理解,没关系,我们先来大致的概括下 FOC 的整个控制框图,后面会对整体框架进行拆分讲解。

① 对电机三相电流进行采样得到:ia、ib、ic;
② 将 ia、ib、ic 经过 clarke 变换得到 iα、iβ;
③ 将 iα、iβ经过 park 变换得到 iq、id;
④ 计算 iq、id 和其设定值 iq_Ref、id_Ref 的误差;
⑤ 将上述误差输入到两个PID(只用到 PI)控制器,得到输出的控制电压 Vq、Vd;
⑥ 将 Vq、Vd 进行反 park 变换得到 Vα、Vβ;
⑦ 将Vα、Vβ 输入 SVPWM 模块进行调制,合成电压空间矢量,输出该时刻三个半桥的开关状态进而控制电机旋转;
⑧ 循环上述步骤。

2.2 FOC坐标变换

  假设我们将一个 PMSM 电机手动让其匀速旋转,此时使用示波器观察它的三相输出电压(反电动势),我们会发现示波器上会得到三组正弦波,并且三组正弦波之间两两相位差为120°。
FOC矢量控制_第5张图片
  所以反过来我们在三相无刷电机的三相线圈上输入上述三相正弦电压,那么就可以驱动无刷电机平稳高效地旋转了。而这正是 FOC 驱动无刷电机的基本手段,但是从控制的角度来看,我们根本就不想跟三个正弦波打交道,因为对于非线性的信号进行准确控制就要使用复杂的高阶控制器,这对于建模成本、处理器算力、控制实时性等都是非常不利的,那么有没有什么方法可以将被控制量线性化呢?答案是当然有的,只需要应用一些数学技巧。

2.2.1 Clarke变换

  当 PMSM 电机匀速运转时,将采集到相位相差 120°的三相电流 Ia、Ib、Ic 使用三相坐标系表示,如下图绿色线所示:
FOC矢量控制_第6张图片
  我们可以利用一些数学小技巧,将三相坐标系变换成直角坐标系,我们把新的直角坐标系命名为 α-β 坐标系(如图 27.1.2.1.1 红色线所示),变换原则是电流产生的磁场相等。Clarck 变换用于将三相静止坐标系变换到两相静止坐标系,变换前后在坐标系中产生的磁场等效。
FOC矢量控制_第7张图片
假设变换前三相定子绕组匝数为3,变换后的两相定子绕组匝数为2,根据磁动量守恒可得:
在这里插入图片描述
提取和可以得到:
FOC矢量控制_第8张图片
遵循恒幅值不变原理可得:
FOC矢量控制_第9张图片
所以:
FOC矢量控制_第10张图片
根据基尔霍夫定律(KCL),所以归纳:
FOC矢量控制_第11张图片
最后化简得:
FOC矢量控制_第12张图片
经过 Clarke 变换后就变成了直角坐标系啦!变换前后的波形如图:
FOC矢量控制_第13张图片
  可以看到变换后还是正弦波,虽然少了一个需要控制的变量,但是新的变量还是非线性的(正弦),控制它依旧难度很大,那有没有办法把它们线性化呢,当然有的,接着就看下Park 变换

2.2.2 Park变换

  Park 变换可以将电机从两相静止坐标系变换到两相旋转坐标系(dq 坐标系),从而解耦出电机转矩分量和电机的励磁分量,这两个分量相互垂直、互不影响。反 Park 变换即为Park 的逆变换。首先我们来看下 Park 变换的原理,这里将 Clarke 变换后的 α—β 坐标系旋转θ度,其中θ为转子旋转的角度,如下图:
FOC矢量控制_第14张图片
  图中d 轴方向与转子内磁场方向重合,称为直轴;q 轴方向与转子内磁场方向垂直,称为交轴。如图 27.1.2.2.2 所示:
FOC矢量控制_第15张图片
此时我们将 α—β 坐标系变换到 d-q 坐标系,即 Park 变换;依据坐标变换,Park 变换矩阵为:
FOC矢量控制_第16张图片
变换公式如下:

FOC矢量控制_第17张图片
在将 Park 变换后的结果在经过 PID 控制器,PI 运算后的输出结果在进行反 Park 变换,反 Park 变换矩阵为:
FOC矢量控制_第18张图片
变换公式如下:
FOC矢量控制_第19张图片
  首先 α—β 坐标系经过 Park 变换后,即为 d-q 坐标系,该坐标系是始终跟着转子旋转的,旋转角度θ需通过编码器/霍尔传感器读取。经过这一步的变换,我们会发现,一个匀速旋转向量在这个坐标系下变成了一个定值!(因为参考系相对于该向量静止了),这个坐标系下两个控制变量都被线性化了!Park 变换前后波形如图所示:
FOC矢量控制_第20张图片
  Park 变换后的控制量为 Iq、Id,很显然线性化后的控制量我们就可以使用 PID 来进行控制了;但是为什么我们还要进行反 Park 变换,将其又变换为 α—β 坐标系呢?因为 SVPWM算法的实现需要用到静止的 α—β 坐标系,所以当我们完成了控制信号的 PID 运算后,还需进行反 Park 变换。关于 PID 控制部分这里就不赘述了,大家可以查看以下链接:
https://blog.csdn.net/weixin_44567668/article/details/130075152

2.2.3 FOC的目的

  经过前面的一通操作我们将转子磁链进行了解耦,分解为转子旋转的径向和切向这两个方向的变量:Iq 以及 Id,那这两个控制量到底代表什么含义呢?FOC 的目的如图所示:
FOC矢量控制_第21张图片
经过上述分析,我们得知:
①Iq 是我们需要的。代表了期望的力矩输出;
②Id 是我们不需要的。我们希望尽可能把它控制为 0;

2.3 SVPWM算法

2.3.1 SVPWM介绍

  从前面的学习,我们知道如果要平稳地驱动三相电机转动,我们就需要生成三个相位相差 120 度的正弦波为了使输出电流近乎于正弦波,可以使用 PWM 的方式,通过调整占空比使等效电流近似为正弦波,这种 PWM 也就是 SPWM。SPWM 是从电源的角度出发,构造出旋转所需的正弦电压,这种方式比较适合用作逆变器,但是对于无刷或者永磁同步电机,调节过的电源实际在定子线圈中产生的电流并不一定是所需的结果。这也就是所谓的开环,是没有反馈的。所以这种控制方式还是不能较为准确的控制定子电流。因此这种永磁无刷电机直接通三相交流电并不一定能很平稳的旋转起来。不然的话纯硬件就可以产生规则的电流,哪还需要微控制器做复杂运算。
  隆重介绍,SVPWM,是的,它还是 PWM,既然用 MOS 管调制就离不开 PWM,它和SPWM 的区别是 SVPWM 依靠的是 MOS 管的开关顺序和开关时间来调制有效电流。而SPWM 不依赖开关顺序,3 相独立调制。SVPWM 是依赖开关顺序的,需要把控整体的 3 相开关,让它们组合出不同顺序和时间的开关序列,以此模拟出正弦电流。SVPWM 癿优点主要有:优化谐波程度比较高,消除谐波效果要比 SPWM 好,实现容易,可以提高电压利用率。比较适合数字化控制系统。
  SVPWM 的主要思想是以三相对称正弦波电压供电时三相对称电机定子理想磁链圆为参考标准,以三相逆变器不同开关模式作适当的切换,从而形成 PWM 波,以所形成的实际磁链矢量来追踪其准确磁链圆。传统的 SPWM 仅电源的角度出发生成一个可调频调压的正弦波电源,而 SVPWM 将逆变系统和异步电机看作一个整体来考虑,模型比较简单,也便于微处理器的实时控制。
  普通的三相全桥是由六个开关器件构成的三个半桥。这六个开关器件组合起来(同一个桥臂的上下半桥的信号相反)共有 8 种安全的开关状态. 其中 000、111(这里是表示三个半桥的开关状态)这两种开关状态在电机驱动中都不会产生有效的电流。因此称其为零矢量。另外 6 种开关状态分别是六个非零矢量。它们将 360 度的电压空间分为 60 度一个扇区,共六个扇区,利用这六个基本非零矢量和两个零量,可以合成 360 度内的任何矢量。
  当要合成某一矢量时先将这一矢量分解到离它最近的两个基本矢量,而后用这两个基本矢量去表示,而每个基本矢量的作用大小就利用作用时间长短去代表。用电压矢量按照不同的时间比例去合成所需要的电压矢量。从而保证生成电压波形近似于正弦波。
  在变频电机驱动时,矢量方向是连续变化的,因此我们需要不断的计算矢量作用时间。为了计算机处理的方便,在合成时一般是定时器计算(如每 0.1ms 计算一次)。这样我们只要算出在 0.1ms 内两个基本矢量作用的时间就可以了。由于计算出的两个时间的总和可能并不是 0.1ms(比这小),而那剩下的时间就按情况插入合适零矢量。 由于在这样处理时,合成的驱动波形和 PWM 很类似。因此我们还叫它 PWM,又因这种 PWM 是基于电压空间矢量去合成的,所以就叫它 SVPWM 了。

2.3.2 SVPWM算法讲解

  设直流母线侧电压为,MOS 管 3 相调制输出电压分别为、、,其分别加在空间上互差 120°的三相静止坐标系上,如图所示:
FOC矢量控制_第22张图片
定义三个电压空间矢量、、,方向分别在其轴线上,大小随时间按正弦规律
变化,相位差 120°,设为相电压基波峰值,f 为电源频率则:
FOC矢量控制_第23张图片
在三相静止坐标系下:
在这里插入图片描述

则三相电压空间矢量的合成矢量()为下,可见()是一个旋转的空间矢量,它的幅值不变,为相电压峰值的1.5倍,且以角频率ω= 2πf 按逆时针方向匀速旋转的空间矢量。
FOC矢量控制_第24张图片

  由于驱动器三相桥臂依靠 6 只 MOS 管,而 MOS 管只有导通和非导通状态(PWM 信号输入),因此三相开关全部组合有 8 种情况,这里定义一个开关函数
〈 = 、、〉,abc 分别代表三相绕组,当 = 1时,代表 A 相上桥臂导通,当 = 0时,代表 A 相下桥臂导通,其他相同理。
  那么(、、)的全部可能组合共有八个,包括 6 个非零矢量 Ul(001)、U2(010)、U3(011)、U4(100)、U5(101)、U6(110)、和两个零矢量 U0(000)、U7(111)。下面我们以非零矢量 U4(100)为例来进行分析,即 (、、) = (100),代表 a 相上桥臂导通,b 相下桥臂导通,c 相下桥臂导通,如图所示:
FOC矢量控制_第25张图片
此时等效电路如图所示:
FOC矢量控制_第26张图片
根据串联分压定理,得:
在这里插入图片描述

剩下的三相开关组合情况同理

三、FOC例程创建

  在使用 ST Motor Control Workbench (以下简称:Workbench) 前我们需要知道电机的一些参数,在我们知道电机参数后我们就可以使用 Workbench 来配置生成代码来控制电机了,以下我们使用 BLDC 速度控制使用霍尔传感器(HALL)为例来说一下 Workbench 的使用方法,以下只是简单介绍 Workbench 的使用,这里的目的是使用 Workbench 配置后生成的代码让电机跑起来,不过生成的代码并不能直接使用,还需要做简单的修改。电机参数参考如下:

电机参数 BLDC PMSM
极对数 2 对极 4 对极
额定转速 3000RPM 3000RPM
额定电流 5.90A 4.00A
额定电压 24V 24V
相电阻 0.42±10%Ω 1.02±10%Ω
相电感 1.12±20%0mH 0.590±20%mH
反电动势系数 4.3Vrms/krpm 4.3Vrms/krpm
编码器 - 1000 线

3.1 新建项目

双击 MotorControl Workbench 5.4.4 打开界面,整个界面可以分为 3 个部分:
①新建项目、加载项目、启动 Motor Profiler 5.4.4
②最近打开过的项目列表
③示例项目
FOC矢量控制_第27张图片

这里我们点击 New Project 来创建我们的第一个项目,选择应用类型、控制板、驱动板和电机个数,这里我们都选择默认模式,选择完成后点击 OK 即可。
FOC矢量控制_第28张图片

工程建立好了后,弹出参数配置界面整个界面可以大概分为 4 个部分:
①用户图标按钮,可以通过点击图标来新建、加载、保存项目、生成代码和上位机控制电机等;
②用于设置所选硬件的功能,如电机参数或传感器的使用;
③显示一些主要的参数;
④用于提示一些用户的操作反馈,或者错误等。
FOC矢量控制_第29张图片

3.2 参数配置

3.2.1 芯片相关参数选择

  1. 选择MCU型号
    点击下图中的芯片型号可以选择对应我们控制板的 MCU 型号,注意时钟源的选择
    FOC矢量控制_第30张图片
    注意
    ①如果没有对应芯片型号,所以选择型号较接近的即可
    ②外部晶振这里只能选择 24M,但是板载的外部高速晶振为8M,后续需要在CubeMX中修改

  2. 数字输出输入 I/O 配置
    点击 Digital I/O 配置数字输出输入相关引脚,在这里需要配置驱动定时器和相关的引脚,以及霍尔传感器的配置,还可以配置串口和启动停止按键的 IO 配置,这里我们只需要根据原理图来配置就可以了,我们选择电机驱动接口 1 来接电机驱动板。
    FOC矢量控制_第31张图片

  3. 电流采集模拟接口
    点击 Analog Input and Protection 可以配置模拟量输出相关的引脚和保护功能。如下图所示,这里可以配置采样电流相关的 ADC 和引脚,已经采样率等参数,只需要根据原理图中对应的引脚配置就可以了,这里的过流保护选择没有保护。
    在这里插入图片描述
    电源电压采集模拟接口设置如下:
    FOC矢量控制_第32张图片
    温度采集模拟接口设置如下:
    FOC矢量控制_第33张图片

  4. DAC功能
    点击 DAC Functionality 可以配置DAC功能,这里主要是调试使用,DAC 设置用于调试时候观测 FOC 数据,例如将电机的电角度、交轴电流通过 DAC 方式输出,这样就可以使用示波器实时观测数据的变化,一般无需使用时直接选择不用即可。不过这里的输出引脚是固定的,只能是 PA4 和 PA5 并不能更改,而这里的 PA4 我们已经使用了,所以这里只能选择不使用。
    FOC矢量控制_第34张图片

  5. 引脚分配与检查
    点击 Pin assignment 可以查看引脚的分配,Check 可以检查引脚是否有冲突,在检查 OK 后配置工作就完成了。
    FOC矢量控制_第35张图片

3.2.2 电压参数设置

  1. 设置母线电压
    选择Rated Bus Voltage根据无刷驱动板输入电源范围设置母线电压
    FOC矢量控制_第36张图片
  2. 母线电压检测设置
    点击 Bus Volatage Sensing 可以设置电压传感器相关参数,如下图所示。由于我们使用了电压隔离芯片,还使用加法电路,所以这里不能配置出适合我们驱动板的参数,需要我们重新实现电压的转换函数,所以这里对于我们的驱动板来只配置了前面的分压电路。
    FOC矢量控制_第37张图片
    交流输入配置
    在下图中,红框部分是关于交流输入的相关配置,不过我们驱动板使用的是直流输入,所以这部分我们可以不用管。
    FOC矢量控制_第38张图片

3.2.3 电机配置

  1. 电机基本参数
    如下图所示,电机 Motor Parameters 可以配置电机相关的参数和传感器,以下内容需要根据实际使用的电机准确填写,否则可能导致电机无法启动或者抖动。在下图填写电机相关参数,如极对数、最大速度、额定电流电压等参数。
    FOC矢量控制_第39张图片

  2. 传感器设置
    在下图中可以选择传感器,可以选择 HALL(霍尔) 和 Encoder(编码器),如果都不选则使用无传感器模式。此处要注意下“placement electrical angle”一栏,要根据情况设置霍尔传感器的放置电角度,使用 BLDC的话这里填的是 120,如果使用 PMSM是 240 deg,填写不正确可能导致电机鸣叫或不转等问题。
    FOC矢量控制_第40张图片
    点击 Speed Sensing 可以打开速度反馈配置界面,如下图所示,这里可以选择使用什么传感器来反馈速度,可以配置主传感器和辅助传感器,这里配置主传感器为 HALL,不使用辅助传感器。
    FOC矢量控制_第41张图片

  3. 编码器模式
    下面介绍使用编码器模式获取速度,关于电机和驱动板的参数配置与使用霍尔传感器模式基本一样,如下图所示,点击 Speed Sensing 后主传感器选择 Quadrature encoder 。
    FOC矢量控制_第42张图片
    在 Motor-Parameters 感器勾选 Quadrature encoder ,编码器为 1000 线,
    FOC矢量控制_第43张图片
    编码器模式同样需要配置启动参数,点击 Fimware Drive Management 后,选择 Start-up parameters,配置界面如下图所示。可以配置对齐时间、对齐角度和电流。
    FOC矢量控制_第44张图片
    点击 Digital I/O 配置数字输出输入相关引脚,在这里需要选择编码器使用的定时器和引脚。
    FOC矢量控制_第45张图片

  4. 无感模式
    上面我们介绍了霍尔感器获取速度的配置方法,现在我们介绍不使用传感器的配置方法,关于电机和驱动板的参数配置与使用霍尔传感器模式一样,如下图所示,点击 Speed Sensing 后主传感器选择 Sensor-less (Observer+PLL)
    FOC矢量控制_第46张图片
    无感模式还需要配置启动参数,点击 Fimware Drive Management 后,选择 Start-up parameters,配置界面如下图所示。无感模式需要开环跑来后在切换到 FOC 模式控制,在下面参数中可以配置开环跑的相关参数,例如,开环对齐时持续时间,对齐电角度,速度上升时间,最终速度值等。
    FOC矢量控制_第47张图片

3.2.4 驱动板参数设置

  1. MOS管驱动设置
    点击 Phase U 可以配置 MOS 管的驱动极性,高电平有效,三相驱动配置完全一致
    FOC矢量控制_第48张图片

  2. MOS管最大开关频率和死区时间设置
    点击下图中的 Power Switches 就可以设置 MOS 管的相关参数。如下图所示在这里可以设置死区时间和 MOS 管的最大开关频率,从数据手册中可以知道我们使用的 MOS 管死区时间设置为 100ns 就可以。
    FOC矢量控制_第49张图片

  3. 温度传感器
    点击 Temperature Sensing 可以设置温度传感器相关参数,如下图所示。不过该配置只支持 ST 的温度传感器,所以直接默认设置即可。
    FOC矢量控制_第50张图片

  4. 电流采样电路
    点击 Current Sensing 可以配置电流采集相关的参数,如下图所示,这里根据我们的驱动板选择 3电阻采样,采样电阻的阻值为 0.02Ω,电压放大倍数配置为6倍。
    FOC矢量控制_第51张图片
    然后勾选 Amplification on board ,点击 Calculate 来计算放大倍数。Calculate 选框可以不设置,默认参数如下:
    FOC矢量控制_第52张图片
    接着设置过流保护功能,如下图设置:
    FOC矢量控制_第53张图片

3.2.5 固件驱动管理

  1. 驱动设置
    点击 Fimware Drive Management 后,选择 Drive Settings,配置界面如下图所示。这里可以配置 PWM输出频率,通常配置为 10KHz~20KHz,这里我们配置为 16KHz。把高端和低端 MOS 管的空闲状态都设置为关,执行时间为 1ms。控制模式选择速度控制模式,默认目标速度设置为 1500RPM。左下侧PI 可以根据电机的运行效果来调整,转矩和磁通控制的 PI 这里使用默认参数,当然如果觉得控制效果不好也可以自己调整。
    FOC矢量控制_第54张图片
  2. 附加功能和 PFC 配置
    点击 Fimware Drive Management 后,选择 Additional Features,在这里可以选择一些控制算法,不过我们这里都不选择。
    FOC矢量控制_第55张图片
  3. 传感器使能和固件保护配置
    点击 Fimware Drive Management 后,选择 Sensing and FW protections,如下图所示,这里可以使能电压传感器和使能过压、欠压保护功能,并且配置有效的电压工作范围,超过电压范围后禁用PWM 输出。
    FOC矢量控制_第56张图片
  4. FreeRTOS
    点击 Fimware Drive Management 后,选择 FreeRTOS,如下图所示,这里可以选择是否启用 FreeRTOS操作系统,这里我们不需要就不启用了。
    FOC矢量控制_第57张图片
  5. 用户界面
    点击 User Interface 可以配置用户界面,在 SDK 5.x 中 LCD 相关的固件已经没有了,这里参数都被禁用,Start/Stop Button 选择使能,Serial Communication 中使能串口,使用 Bidirectional。
    FOC矢量控制_第58张图片

3.3 生成工程代码

  在配置完所有参数后我们可以保存我们的项目了,点击 Save Project 就可以保存项目了(注意,保存路径中不能有中文)。
FOC矢量控制_第59张图片
  我们可以点击 Generation 来生成代码,如下图所示,左侧可以选STM32CubeMX,可以选择开发环境,这里我们选择 Keil MDK-ARM V5 ,固件版本可以选择最新或者已经下载好的版本,驱动类型选择 HAL 库。配置好后就可以点击 Generation 生成代码了。如果之后还需要修改配置,那么我们可以点击 UPDATE 来更新代码。
FOC矢量控制_第60张图片
  生成结束后可以打开 CubeMX 添加自己的设置,点击 RUNSTM32Cube…打开 CubeMX
在这里插入图片描述

3.4 修改工程代码

3.4.1 修改系统时钟配置

根据具体时钟配置
FOC矢量控制_第61张图片

3.4.2 初始化 SD 控制脚

  通过 STM32CubeMX 来初始化 SD 引脚,如下图所示,将 PG12 配置为 GPIO_Output,并且将默认的电平输出设置为高电平,User Labe 项填写 SD 。修改完成后保存关闭窗口,这里不使用STM32CubeMX 来生成代码,需要回到 Workbench,使用 Workbench 来更新代码(注意,不是生成)。
FOC矢量控制_第62张图片
FOC矢量控制_第63张图片

3.4.3 修改电压传感器

3.4.4 修改温度传感器

3.5 编译下载测试

  修改完之后,编译下载后可以按 KEY2 来启动和停止电机。还可以使用 Workbench 里面的监视器来控制电机。如下图所示,点击 Monitor 图标就可以打开监视器了。
FOC矢量控制_第64张图片
  连接到开发板后,可以通过 Start Motor 和 Stop Motor 来启动和停止电机,可以通过速度旋钮来调节目标速度,或者通过旋钮下方的编辑框来调节目标速度,编辑好后回车就可以发送目标速度。可以通过速度表盘来观察速度值,也可以通过 plotting 来观察实际速度与目标速度的关系,如下图所示。
FOC矢量控制_第65张图片
状态指示灯有 3 种颜色:

  • 绿色:正常状态
  • 红色:故障产生,并且没有被排除
  • 黄色:故障产生,但是已经被排除

  当故障故障产生时,对应的故障灯也会亮起,此时电机不能启动,需我们排除故障后才能启动电机。如下图所示,电机驱动板电压过低发生欠压故障,此时欠压故障灯和状态指示灯都为红色。当故障故障产生时,对应的故障灯也会亮起,此时电机不能启动,需我们排除故障后才能启动电
机。如下图所示,电机驱动板电压过低发生欠压故障,此时欠压故障灯和状态指示灯都为红色。
  如果需要进一步调节 PID,可以点击 Advanced 按钮切换到参数调整,如下:
FOC矢量控制_第66张图片
  修改好 PID 之后可以点击 按钮把参数上传到开发板,观测运行效果。如果使能了DAC 输出,还可以选择 DAC 设置,默认是输出 a 和 b 电流。

四、ST MCSDK库源码介绍

以 5.4 版本的 MCSDK 库为例,Any 文件夹中包含 Src和Inc 文件夹,分别存放核心算法的源文件和头文件,源码目录如下:
在这里插入图片描述
学习 SDK 最好的方式便是阅读帮助文档,通过 ST MC Workbench 打开帮助文档的方法如下:
FOC矢量控制_第67张图片
FOC矢量控制_第68张图片

4.1 总体软件架构

  MC SDK5.x 包含有芯片外设库、电机库和电机应用层三个主要部分,其中芯片外设库使用 STHAL/LL 库,可被各个层级调用;电机库则是主要的电机 FOC 控制层;最上层为电机应用层,供用户直接使用电机库,而不去关心底层如何实现的,加快用户程序开发;另外 MC SDK5.x 还提供 UI 库,用于界面调试通讯使用,比如和 Workbench 之间的交互就是通过 UI 库实现;这边强调的一点是电机库是综合体,包含 FOC 算法,单片机外设配置,中断机制等各个环节,简单控制可能只需要关心电机应用层即可,如果复杂控制将涉及到整体操作
FOC矢量控制_第69张图片
  在 SDK 使用过程中,电机本体,电机控制硬件板,控制管脚,控制策略在 MC workbench 中配置完成,顺序为 MC Workbench→CubeMx 工程 → 电机库代码(芯片外设库 + 电机控制库 + 电机驾驶舱 + 用户界面库 + 系统初始化),该生成代码加入简单 API 后(比如 MC_StartMotor1)可以直接运行对应电机,当需要细化控制或者复杂控制时才有可能涉及到修改电机控制库中的代码。

电机控制流程图如下图所示,其中电机的控制都在中断中执行:
FOC矢量控制_第70张图片

4.2 电机控制库文件

  在简单的电机控制应用中通常不需要修改这部分代码,如果在 Application MC API 层不能满足应用需求时才会需要修改这部分代码,在修改前需要对电机运行框架非常熟悉的情况下再来修改。

源文件 说明
bus_voltage_sensor.c 总线电压
circle_limitation.c 电压极限限制
enc_align_ctrl.c 编码器初始定位控制
encoder_speed_pos_fdbk.c 编码器传感器相关
fast_div.c 快速软件除法
hall_speed_pos_fdbk.c Hall 传感器相关
inrush_current_limiter.c 浪涌电流限制
mc_math.c 数学计算
mc_interface.c 马达控制底层接口
motor_power_measurement.c 平均功率计算
ntc_temperature_sensor.c NTC温度传感
open_loop.c 开环控制
pid_regulator.c PID 环路控制
pqd_motor_power_measurement.c 功率计算
pwm_common.c TIMER 同步使能
pwm_curr_fdbk.c SVPWM,ADC 设定相关接口
r_divider_bus_voltage_sensor.c 实际总线电压采集
virtual_bus_voltage_sensor.c 虚拟总线电压
ramp_ext_mngr.c 无传感开环转闭环控制
speed_pos_fdbk.c 速度传感接口
speed_torq_ctrl.c 速度力矩控制
state_machine.c 电机状态相关
virtual_speed_sensor.c 无传感开环运行相关
以下部分在工程中只会存在其中一个文件 -
ics_f4xx_pwm_curr_fdbk.c STM32F4 的 ICS 采样
r1_f4xx_pwm_curr_fdbk.c STM32F4 的单电阻采样
r3_1_f4xx_pwm_curr_fdbk.c STM32F4 的三电阻采样(1 个 ADC)
r3_2_f4xx_pwm_curr_fdbk.c STM32F4 的三电阻采样(2 个 ADC)

4.3 电机控制API

  在 mc_api.c 中有各种可以供用户使用的 API 接口,对于普通的电机控制用户可以不用关心底层的实现,只需要使用这些 API 就可完成电机控制,电机库可以支持两个电机,在函数中使用后缀Motor1 和 Motor2 来区分是电机 1 还是电机 2。这里以控制电机 1 为例来说明个 API 接口的含义,电机 2 的控制类似。

函数名称 函数形参 函数返回值 函数功能
MC_StartMotor1 void bool 启动电机
MC_StopMotor1 void bool 停止电机
MC_ProgramSpeedRampMotor1 hFinalSpeed、hDurationms void 设定目标速度以及持续时间
MC_ProgramTorqueRampMotor1 hFinalTorque、hDurationms void 设定目标力矩以及持续时间
MC_SetCurrentReferenceMotor1 Iqdref void 设定 Iq,Id 参考
MC_GetCommandStateMotor1 void MCI_Command State_t 返回指令执行状态
MC_StopSpeedRampMotor1 void bool 停止速度指令执行,速度指令保存为执行停止前速度指令
MC_StopRampMotor1 void void 停止执行电机正在运行的斜坡
MC_HasRampCompletedMotor1 void bool 指令是否执行完成
MC_GetMecSpeedReferenceMotor1 void int16_t 返回机械参考速度
MC_GetMecSpeedAverageMotor1 void int16_t 返回平均机械速度
MC_GetLastRampFinalSpeedMotor1 void int16_t 返回上次指令速度
MC_GetControlModeMotor1 void STC_Modality_t 返回控制模式
MC_GetImposedDirectionMotor1 void int16_t 返回电机转动方向
MC_GetSpeedSensorReliabilityMotor1 void bool 返回当前速度传感器可信度
MC_GetPhaseCurrentAmplitudeMotor1 void int16_t 返回电流值
MC_GetPhaseVoltageAmplitudeMotor1 void int16_t 返回电压值
MC_GetIabMotor1 void ab_t 返回 a,b 相电流
MC_GetIalphabetaMotor1 void alphabeta_t 返回 clark 变换后的Iα,Iβ
MC_GetIqdMotor1 void qd_t 返回 park 变换后的 Id,Iq
MC_GetIqdrefMotor1 void qd_t 返回 Id,Iq 参考
MC_GetVqdMotor1 void qd_t 返回变换电压量 Vd,Vq
MC_GetValphabetaMotor1 void alphabeta_t 返回变换电压量 Vα,Vβ
MC_GetElAngledppMotor1 void int16_t 返回电角度 DPP 数据
MC_GetTerefMotor1 void int16_t 返回电流参考
MC_SetIdrefMotor1 hNewIdref void 设定电流 Id 参考
MC_Clear_IqdrefMotor1 void void Iq,Id 数据回到默认值
MC_AcknowledgeFaultMotor1 void bool 清除异常状态
MC_GetOccurredFaultsMotor1 void uint16_t 得到发生了的故障状态
MC_GetCurrentFaultsMotor1 void uint16_t 得到当前的故障状态
MC_GetSTMStateMotor1 void State_t 得到电机状态

上面表格中只是简单的函数功能说明,更加详细的说明请参考函数源码或函数源码前的注释。


补充

使用MotorControl Workbench 5.4.4生成工程代码可能会出现以下报错
FOC矢量控制_第71张图片
此时直接删除红色目录下对应文件,即可成功生成代码

你可能感兴趣的:(单片机,单片机,自动化)