目录
[1 项目概述](#1 项目概述)
[1.1 项目背景](#1.1 项目背景)
[1.2 系统功能介绍](#1.2 系统功能介绍)
[1.3 系统使用的技术要点](#1.3 系统使用的技术要点)
[2 系统硬件框架结构](#2 系统硬件框架结构)
[2.1 电机PWM接口](#2.1 电机PWM接口)
[2.2 电流采样接口](#2.2 电流采样接口)
[2.3 编码器接口](#2.3 编码器接口)
[3 驱动程序实现](#3 驱动程序实现)
[3.1 PWM 功能实现](#3.1 PWM 功能实现)
[3.1.1 PWM接口配置](#3.1.1 PWM接口配置)
[3.1.2 验证PWM输出波形](#3.1.2 验证PWM输出波形)
[3.2 AS5600的驱动](#3.2 AS5600的驱动)
[3.2.1 AS5600与MCU之间的电路结构](#3.2.1 AS5600与MCU之间的电路结构)
[3.2.2 驱动程序实现](#3.2.2 驱动程序实现)
[3.2.3 验证角度值](#3.2.3 验证角度值)
[3.3 读取电流值驱动](#3.3 读取电流值驱动)
[3.3.1 MCU的ADC与驱动板接口](#3.3.1 MCU的ADC与驱动板接口)
[3.3.2 电流数据验证](#3.3.2 电流数据验证)
[3.4 RT-Thread Nano版本在GB32上的移植](#3.4 RT-Thread Nano版本在GB32上的移植)
[4 控制算法实现](#4 控制算法实现)
[4.1 FOC控制算法](#4.1 FOC控制算法)
[4.1.1 FOC控制算法的模型](#4.1.1 FOC控制算法的模型)
[4.1.2 Clarke和Park变换数学原理](#4.1.2 Clarke和Park变换数学原理)
[4.2 PID算法实现原理](#4.2 PID算法实现原理)
[4.2.1 闭环控制系统模型](#4.2.1 闭环控制系统模型)
[4.2.2 PID算法模型](#4.2.2 PID算法模型)
[5 功能验证](#5 功能验证)
[5.1 开环控制(设置Vq)](#5.1 开环控制(设置Vq))
[5.2 速度环实现和PID调参验证](#5.2 速度环实现和PID调参验证)
[5.2.1 电机加速-PID算法验证](#5.2.1 电机加速-PID算法验证)
[5.2.2 电机减速-PID算法](#5.2.2 电机减速-PID算法)
[5.2.3 kd参数对速度环的影响](#5.2.3 kd参数对速度环的影响)
测试视频:
【兆易创新 GD32F5】直流无刷电机控制FOC算法的实现和验证_哔哩哔哩_bilibili
【兆易创新 GD32F5】直流无刷电机控制FOC算法的实现和验证-角度、svpwm波形_哔哩哔哩_bilibili
【兆易创新 GD32F5】直流无刷电机控制FOC算法的实现和验证_哔哩哔哩_bilibili
1 项目概述
1.1 项目背景
如果要问当下那个行业最火,当属人形机器人行业。而机器人最核心的执行设备为关节,控制关节的动力来源一般为电机,而直流无刷电机控制需要专门的控制电路和软件控制算法,以实现其精确的位置,速度控制。
本项目主要是基于 GD32F527I-EVAL开发板,应用RT-Thread软件操作系统,设计一套直流无刷电机的控制算法,实现闭环速度、位置等功能的控制和参数验证。

1.2 系统功能介绍
基于GD32F527I-EVAL开发板实现如下功能:
1) 移植RT-Thread Nano,管理整个系统资源
2) 实现FOC控制算法,并计算个输出PWM控制波至BLCD直流无刷电机驱动驱动模块。
3)BLCD通过转换电路将PWM
- 编码器模块
-- 1) GD32F527I驱动AS5600芯片获取编码器的角度值
-- 2) 将机械角度转换为电角度,在FOC算法中使用该角度计算SVPWM的值
5) 电机控制算法实现的主要功能:
--1) 开环控制: 该环主要验证FOC算法的是否能满足驱动电机的功能,无需加上PID算法
--2)闭环控制(速度环):使用编码器测试电机的转动角度,并根据该值计算速度值。基于该值使用PID算法形成闭环控制。
--3)闭环控制(位置环):使用编码器测试电机的转动角度,并根据该值计算电机当前转过的线性值。基于该值使用PID算法形成闭环控制。
1.3 系统使用的技术要点
1)主控模块基于RT-Thread 软件架构设计
2)使用的MCU: GD32F527I
硬件开发板: GD32F527I-EVAL,
开发软件和工具: RT-Studio , Keil, Visual Code ,VOFA
3)开发语言: C语言,
6) 控制算法: PID控制技术,FOC控制算法,SVPWM
7)编码器测试技术
8) I2C总线挂载多个设备,实时进行数据传输
9)控制:PWM调速,运动方向控制,直流无刷电机控制原理
10)RT-Thread Nano版本在GD32F527I上的移植
2 系统硬件框架结构

2.1 电机PWM接口
1) MCU上 IO接口位置: pwm波频率:20 K hz , 对应的时间为: 20 000 Hz 近似 5us

2)其对应摄像头上的插针接口位置

3) 原理图上位置:

2.2 电流采样接口
1) MCU上 IO接口位置

2) 其对应摄像头上的插针接口位置

3) 原理图上位置:

2.3 编码器接口
1) MCU上 IO接口位置

2) 其对应摄像头上的插针接口位置

3) 其对应摄像头上的插针接口位置

3 驱动程序实现
3.1 PWM 功能实现
3.1.1 PWM接口配置
- 直流无刷电机的驱动板与MCU之间的通过PWM信号进行控制,其接口电路框架结构如下:


3)通过定时器配置PWM输出功能

3.1.2 验证PWM输出波形
配置PWM的的占空比,使用逻辑分析仪观察波形的占空比,其具体波形如下:
1) 程序中配置占空比参数如下:

2) 逻辑分析仪测试的波形
PWM-U路波形

PWM-V路波形

PWM-W路波形

3.2 AS5600的驱动
3.2.1 AS5600与MCU之间的电路结构
AS5600与MCU之间通过I2C接口连接,其与磁环和电机一起集成在电机控制单元中。具体连接结构图如下:

3.2.2 驱动程序实现

3.2.3 验证角度值
电机模块与开发板的连接结构图如下:

用手拨动电机旋转,使用VOFA接收编码器的数据,并显示波形数据

使用定时器单次读取AS5600的角度值数据所需要的时间为:

3.3 读取电流值驱动
3.3.1 MCU的ADC与驱动板接口
使用GB32的PA4和PA6接口采样电流值

电机驱动板上的电流输入接口位置如下图:

3.3.2 电流数据验证
电路连接方式如下:

驱动电机转动,并使用VOFA显示数据的波形,具体波形如下:

数据log如下:

3.4 RT-Thread Nano版本在GB32上的移植
笔者使用GB32板卡作为电机的控制模块,为了更好的利用GB32的资源,这里选用RT-Thread Nano版本作为该MCU的操作系统。在使用该系统之前,需要移植该系统,其具体步骤如下:
Step -1: 在Keil IDE上选择RTOS(笔者已经安装了RT-Thread packet)

Step-2: 配置相关的代码
1)在board.c文件中添加MCU的时钟初始化函数

2)在rtconfig.h文件中使能RT_USING_CONSOLE

- 实现console的相关接口

4)控制台命令接口

5) SysTick_Handler函数调用rt_os_tick_callback函数

step-3: 测试RT-Thread运行情况,当系统打印如下log信息,说明RT-Thread在板卡上已经移植成功。

4 控制算法实现
4.1 FOC控制算法
4.1.1 FOC控制算法的模型

模型介绍:
-
测量 :通过电流传感器测量电机的两相或三相电流
,通过编码器测量转子角度 (θ)。
-
Clarke变换 :将三相电流
转换为两相静止坐标系下的 。
-
Park变换 :利用转子角度 θ,将
转换为旋转坐标系下的直流分量
。
-
PI控制 :将测量到的
与给定的目标值 进行比较,通过PI控制器计算出需要施加的电压
。
-
Park逆变换 :将控制器的输出
利用角度 θ 反变换回静止坐标系下的
-
SVPWM :利用 (
) 生成驱动三相逆变器的PWM信号,最终产生所需的三相电压施加到电机上。
4.1.2 Clarke和Park变换数学原理
矢量控制(FOC)中的完整流程 如下:

1) Clarke变换数学原理
Clarke变换是将坐标系从三相静止坐标系(a, b, c)变换到两相静止坐标系(α, β)。
假设三相电流 是平衡的,即
。
等幅值变换(变换前后矢量幅值不变):

为了计算方便,通常假设: , 所以
, 上式可以简化为:

等功率变换(变换前后功率不变):矩阵系数会有所不同,但在FOC中常用等幅值变换。
2) Park变换数学原理
Park变换 是将坐标系从两相静止坐标系(α, β)变换到两相旋转坐标系(d, q)。 Park变换需要一个关键参数:转子当前的电角度 θ。这个角度通常通过编码器等位置传感器获得。

其逆变换(Park反变换)为:

4.2 PID算法实现原理
4.2.1 闭环控制系统模型
闭环(Closed Loop):控制器输出值给被控对象,同时获取被控对象的反馈,控制器知道被控对象的执行状态,可以根据反馈修改输出值以优化控制。其控制模型如下:

4.2.2 PID算法模型
核心思想 :根据系统的"当前误差 "(P)、"过去累积的误差 "(I)和"未来误差的变化趋势"(D)这三个因素,通过线性组合的方式计算出控制量,从而让被控对象(电机转速)快速、准确、稳定地达到并维持在目标值(Setpoint)。PID算法是一种常用的反馈控制算法,全称为Proportional-Integral-Derivative。它根据测量值与设定值的差距,经过比例、积分和微分的处理,得到控制器的输出。 其定义如下:

具体控制模型如下图:

离散化的PID控制算法(位置式)公式如下:

5 功能验证
5.1 开环控制(设置Vq)
根据FOC 控制算法的原理,设置Vq的值,驱动电机转动,观察角度值的变化,同时逆变器输出的电压波形图,本测试不将加入PID相关的自动控制算法。
系统电源的工作最大电压为: 12V
电机Uq的取值范围为:(-6, 6),单位为: V
1) 设置Uq = 1(v)时,电压运行的状态

参数意义:

2)设置Uq = 4(v)时,电压运行速度明显加快,其波形如下:

- 验证算法的运行时间:
使用示波器验证foc算法的运行时间, 通过波形可得,该算法消耗时间为: 256.688 ns


5.2 速度环实现和PID调参验证
5.2.1 电机加速-PID算法验证

目标速度值为: 20 rad/s
运行的波形图:

5.2.2 电机减速-PID算法

目标速度值为: 12 rad/s
运行的波形图:

当前运行速度: 20 rad/s
目标速度值为: 1 rad/s
运行的波形图:

5.2.3 kd参数对速度环的影响
更改PID参数如下:

当前运行速度: 20 rad/s
目标速度值为: 1 rad/s
运行的波形图如下,其和4.2.2中的运行波形相比,调节速度明显快很多。

当前运行速度: 1 rad/s
目标速度值为: 20 rad/s
