前言:V1.0版本是初始入门版本,主要分为硬件篇和软件篇。硬件篇是熟悉硬件测试平台,和实现电机控制过程中用到的外设;软件篇是整体CCS工程的架构、实现的开发过程以及对应的理论介绍。
永磁同步电机(PMSM)位置、速度、电流三闭环矢量控制(FOC)软件(以下简称“软件”)是为学习矢量控制算法而编写的,针对的是永磁同步电机,代码已经经过了项目验证,可以放心学习、使用。
软件以一套完整的、成熟的PMSM的FOC控制方案为例,从各个方面详细讲解了FOC的原理、实现方法等知识,几乎是逐条的分析了程序,又兼顾程序的系统层面,目的是让初学者看完资料,可以独立的完成FOC的编写,独立的解决一些项目中的实际问题。知识是个触类旁通的东西,相信大家学完这个PMSM的FOC算法后,对其他的控制算法也能很快的上手。


图1 永磁同步电机矢量控制框图(PMSM_FOC_sensor_ABZ)
图1是永磁同步电机常见的有感矢量控制(Field Oriented Control,FOC),ABZ编码器测取转速位置信息用于坐标变换。FOC的核心部分主要有电流采样、PI调节器和电压矢量空间脉宽调制技术(Space Vector Pulse Width Modulation,SVPWM)。
所采用的开发环境是MATLAB和TI的DSP_C2000系列的控制芯片(CCS),后续的软硬件测试验证就使用这两种工具。

图3 MATLAB和CCS软件
CCS软件采用语言C编程,需要具备一定的基础。MATLAB的建模方式多种,适合迭代优化的仿真类型是利用sfunction模块并结合M语言实现控制策略或者功能。
采用sfunction模块进行M语言实现与CCS软件中的C代码实现具有相同之处,可相辅相成,可加深对实现的内容理解。

图4 基于TI_DSP_F283xC2000的硬件测试平台

表1 永磁同步电机参数
硬件测试平台主要分为驱动板和控制板,以及配套的电源、开关、仿真烧录器和100W的永磁同步电机。控制板搭载的是TI_DSP_F28335芯片,板上资源丰富,适合后续的电机控制所需的算力。

表2 V1.0版本的开发大纲
V1.0版本的开发主要是基于目前的软硬件平台搭建出一套CCS软件架构,实现基础的带ABZ编码器的永磁同步电机有感矢量控制,并移植一套成熟的上位机通过串口通信实现高刷新率的控制变量的显示,方便调试。
接下来从硬件、软件和上位机三个方面介绍PMSM_FOC_sensor_ABZ。

图1.1 ePWM外设模块的配置流程

七段式SVPWM

五段式SVPWM
注:电流和电压采样是电机控制的重中之重,电机控制的核心目标之一就是精准地调节电流。ADC外设模块的采样精度,直接决定闭环控制的稳定性与准确性。

图1.3 ADC外设模块的配置步骤流程图

图1.4 eQEP外设模块的配置步骤流程图


图2.1各种离散化仿真类型的分析

图2.2 硬件部分

图2.3 控制策略实现部分
整个仿真验证部分一共分成4个部分:
(1)硬件模拟;
(2)控制层和SVPWM调制模块;
(3)加载部分和Powergui、示波器;
(4)脚本文件,用于设置电机参数和控制参数;


图2.4 基于零极点对消设计的速度波形变化情况


图2.5 基于零极点对消的电流波形变化情况
从框图中可以看出,FOC运算,需要知道电机的三相电流和转子位置,因此我们在设计中,需要采集、解算这两个量。
硬件平台我们采用常见的DSP,资源如下:
1)处理器:TMS320F28335,晶振频率30MHz,工作主频150MHz;
2)存储器:TMS320F28335内部资源模块寄存器,片内18K×16位SARAM存储器,64K×16位Flash存储器;
3)中断源:Pwm1中断,8Khz;

图2.1 软件结构图
软件通过RS485与上位机实时通讯交互,在主循环中采用轮询的方式将系统相关状态监测量实时反馈给上位机;为了保障系统安全,软件对输入指令进行了限幅,避免指令超限。
表1软件功能描述

软件的具体功能及实现需求如下:
a)在控制电源上电后,完成各功能模块初始化;
b)通过串口与上位机通讯;
c)利用TI最新的SVPWM算法和基于零序电压注入的方法,产生占空比,驱动功率板;
d)通过DSP内部自带ADC采集母线电压信号、相电流信号;
e)完成速度闭环、电流闭环调节;
f)系统状态监测、故障诊断与处理(工业应用中故障诊断、系统检测是很复杂的,为了突出本教程重点,故程序仅保留过压、欠压、过流保护功能);
控制软件全部功能描述见表2。
表2 软件性能描述

与FOC控制软件相关的硬件接口,包括RS485串口,片内ADC,外设I/O,数字I/O等,连接关系见图(2.2)所示,具体的IO配置表见附录I所示。

图2.2 DSP接口图
暂且把这个架构叫《伺服软件迭代进化架构》吧。
伺服软件代码架构千奇百怪,初学者甚至是一些“老师傅”都很难辨别优劣,差的架构不利于代码的理解,更不利于知识的积累,跨平台移植代码更是劳民伤财,不利于个人、企业的发展。
根据自己的理解,提出本架构,买家可以依托自己原有的技术积累,以此架构为平台,进行自身技术的积累,软件的迭代、进化,通过不断的学习、实践,凝结核心技术,形成多种成熟可靠的电机控制软件平台,逐步扩充自己的伺服软件型谱,提高个人薪资竞争力,同时,打造出值得信赖的伺服软件品牌。
软件采用分层架构设计思想,分5个层次:
(1)系统配置层(CMD文件、LIB文件、启动文件、官方库文件……);
(2)外设配置层(时钟、GPIO分配、ADC配置、PWM配置、SCI配置……);
和硬件确定标准接口,明确所有接口的首选、备选方案。根据永磁同步电机驱动特点,设置标准的底层配置模式,可实现快速切换。
(3)模块驱动层(速度反馈解算、位置反馈解算、各种滤波、指令斜坡处理、SVPWM计算、ClarkPark变换、各种PID运算、串口通信、总线、故障诊断……);
以功能划分模块,各模块之间采用水平逻辑,模块内采用自上而下的垂直逻辑。
每个模块自成体系,具有明确的输入、输出,设置自己的参数结构体,表征所有用到的中间变量、标志位信息,整个生命周期不能直接影响模块以外的任何变量、参数,必须采用参数传递的形式。
模块采用统一写法,设计时必须附带调用说明,参数设置说明,功能说明等文档。
模块之间相互独立,便于更新、升级。
通过项目验证的,进入CBB货架管理,通过多次飞试验证等,进行封包,进入系统配置层的LIB中。
(4)控制算法层;
a)前馈补偿、抗负载扰动、参数惯量(电机极对数、旋变极对数、旋变安装偏差、电阻、电感、转动惯量、负载转矩、反电动势系数、摩擦系数)、参数自整定(电流环、速度环PI参数)、电流解耦、死区补偿、执行机构末端抖振抑制、母线电压波动拟制补偿、再生制动、能量回馈、故障保护(常规故障保护、缺相运行、异常状态的再启动等技术)……
b)弱磁、直接转矩……
c)无位置算法(观测器、锁相环、高频注入……)
d)先进智能控制算法的研究应用(自抗扰、滑模变结构)……
根据算法需求,调用模块驱动层的函数,进行算法设计。
同样,算法之间平行、独立,自成体系,采用标准写法。
软件人员利用实验平台,验证先进的智能控制算法,不断的扩充算法层、优化、升级现有算法层中内容。
成熟稳定的算法可进入模块驱动层,无需修改,供直接调用。
(5)任务调度层(实时任务采用中断机制,执行快速、慢速流程任务,非实时任务采用多任务调度机制,整个软件采用实时操作系统进行任务调度);
中断任务中完成实时性较强的电流电压采集、控制算法和故障保护等任务,不同的实时任务运行于不同的控制周期;
多任务调度系统中完成通信、系统检测等实时性要求较弱的任务。
(1)跨平台开发时,仅需移植系统配置层、外设配置层,内容很少,而核心的模块驱动层、软件算法层、任务调度层可无需修改,直接复 制。
(2)模块按最小化功能划分,输入、输出、中间变量明确,各模块之间完全独立,使得功能函数的迁移完全自由,极大方便了协同工作,同时,给同一功能不同实现方法的对比分析提供了便利条件,有利于整个软件的迭代、进化。
(3)算法层模块化处理,使得软件可以很方便的借助Simulink工具对已有c形式的算法进行脱离硬件平台的仿真验证,模拟出很多硬件难以达到的边界条件,扩充了算法验证手段。同时,也更方便借助Simulink代码生成技术,对新算法先仿真,然后直接生成可用的c代码,加快了新算法、新控制策略的落地、应用。
(4)任务调度层模块化处理,单线程中任务跳转逻辑可采用Stateflow进行设计、验证,复杂系统的多进程任务,可采用RTOS进行调度、管理。
(5)组织架构清爽,模块界线清晰,方便排查问题。
(6)优秀的架构,使得软件的质量和可靠性得到保证。
选择1个具有代表性的型号,按以下步骤展开工作:
(1)以任务书为指导,按架构设计伺服软件框架。
输出:软件架构以及功能说明。
(2)从标准和产品特点出发,形成功能函数的编写模板。
输出:功能函数模板。
(3)梳理软硬件接口推荐表,进行软件底层配置的首选配置以及备选配置的快速切换设计,封装固定模式,预留可调模式的对外接口。
输出:推荐接口表;底层架构。
(4)按软件功能划分模块,梳理模块驱动层中所有函数的输入、输出、中间变量、激励要素等,并按c语言模板进行初次定型。
输出:功能函数表;每个函数的输入、输出要素表。
(5)实时任务、非实时任务流程设计,完成项目调试、交付,对软件进行评审。
输出:软件改进建议表。
(6)改进软件、新项目中继续验证优化,算法迭代、进化……
同时,梳理需求,搭建实验平台,帮助算法验证。

图2.3 代码组织形式
主循环模块是程序运行时的主控流程,控制程序的流程走向。
软件在控制电源上电复位后执行主程序,主程序完成初始化后,开中断(触发周期125us),然后进入主循环等待中断的发生,同时在主循环中完成与上位机的实时通讯,翻转LED,提示用户系统正在正常运行中。
主程序主要完成初始化(相关功能模块初始配置,控制变量、结构体的初始化),开主中断,然后进入主循环等待中断发生。主循环中完成与上位机的实时通讯交互(查询接收上位机输入的工作指令),具体流程见图5所示。

图2.4 DSP主循环模块流程图

图2.5 lsw=1时软件执行流程图
矢量控制中,一般需要六路(3组)PWM输出,配置为两两互补带死区的导通形式。PWM初始化,配置PWM频率、死区,载波频率8kHz,死区时间为2us,对PWM1启动125us中断以及ePWM模块的错误联防保护功能。
串口主要完成和上位机的通信,接收上位机的控制指令,并将一些需要监视的变量回传给上位机。
本程序中设置波特率为460800pbs,8位数据位,1位停止位;无奇偶校验,全双工传送,设置RX FIFO中断深度1,TX FIFO中断深度0。
SCI内部串行时钟信号由低速外设时钟信号LSPCLK及波特率选择寄存器共同决定。BRR为16为波特率设定值,其高8位装入SCIHBAUD中,低8位装入SCILBAUD中,即可配制出不同的波特率。

最基本的FOC只需要两相电流即可,为了硬件保护等,我们可能还要采集母线电压、电流、温度等信号。并对采样值进行滤波数据处理。
ADC模块具有多个分频器,以产生任何需要的ADC操作时钟,图15为ADC的时钟链结构。

图2.6 ADC时钟链结构图
EPWM1产生的主中断,每次事件触发1次中断,因此中断触发周期为125us,该模块执行时间不能超过125us的80%即100us,因为还要留时间去执行非中断中的任务。
该模块完成状态机机制下各子函数定时计数器时间分配任务(根据上位机指令,选择要执行的流程)。
中断服务程序流程图见图16所示,中断服务程序中主要完成(故障保护不分析):
(a)获取转子位置角度(每120us);
(b)获取电机三相电流(每120us);
(c)通过分频获取其他周期定时;
(d)每120us执行电流闭环控制;
(e)每500us执行速度闭环控制(如果被选择);
(f)每1ms执行位置闭环控制(如果被选择);
其中电流闭环、速度电流双闭环、位置速度电流3闭环执行流程分别如图2.7、图2.8、图2.9所示。
中断服务程序流程图见图16所示,中断服务程序中主要完成(故障保护不分析):
(a)获取转子位置角度(每120us);
(b)获取电机三相电流(每120us);
(c)通过分频获取其他周期定时;
(d)每120us执行电流闭环控制;
(e)每500us执行速度闭环控制(如果被选择);
(f)每1ms执行位置闭环控制(如果被选择);
其中电流闭环、速度电流双闭环、位置速度电流3闭环执行流程分别如图2.7、图2.8、图2.9所示。

图2.7 中断服务程序流程图

图2.8 中断服务程序流程图

图2.9 速度环子程序流程图

图2.10 位置闭环子程序
其中三个环中使用的MotorCtrl()流程如图(2.11)所示。

图2.11 子程序
MotorCtrl函数中,对变换使用的转子位置角进行了判断,目的是,在开环拉电机时,直接使用给定的theta = 0.0(调试时,也可以改变theta值,观察电机转向)将电机拉到指定的位置。正常工作时,再使用编码器计算得到的eQEP1.ElecTheta。
同理,下面的这两段代码也是为了开环拉电机和校准编码器零位使用的,正常工作时,程序不会执行这两段代码。
定时计数器配置功能:使用EPWM1产生的主中断周期作为时间基准,使用TimerCtrl结构体定义的变量TimerCnt自加,得到125us到500ms不同的定时计数器,当TimerCnt变量累加到所需定时计数器的预设值时,设置时间标识位变量置1,执行相应的功能函数,函数执行完成后该变量清零。
软件定时器功能见表6。
表6 定时器功能

电机用的是增量式正交编码器,因此本程序采用的EQEP模块来采集电机的转子位置角,该模块就是一个片内外设的配置应用问题,没有技术上的难度。

(a)速度波形变化

(b)电流、位置和调制波波形的变化
图3.1 上位机波形抓取
如果控制板上没有DAC模块,那就只能采用上位机(电子示波器)来抓取过程变量,评判电机运行的性能。
一款好的上位机是电机控制开发的调试利器,直观的查看电机运行过程中的速度、位置、电流的变化,更改控制参数和功能代码的实现。

1、PI调节器中为什么不加入D项?
微分,说白了在离散情况下,就是error的差值,就是t时刻和t-1时刻error的差,会引入噪声反而会劣化控制性能。另一个实际只用到了PI控制,没有引入微分,因为电流的采样率非常高不需要加入微分项。
