ST的FOC库 2.0学习
由于新冠状病毒的缘故,被硬核封村,在家也没事,在网上找到了些ST的FOC代码,看一看,并且写个文档记录一下,可供大家一块看看学习学习。垃圾新手,望大佬多多批评。
因为是老版本的FOC代码,浏览起来简单些,当做了入门代码,我这里只是为了学习一下FOC的代码风格和流程,只是大致浏览代码,很多细节也没有细看。
1.1 霍尔矢量闭环控制
在浏览了ST的有感 FOC代码后,发现除了基本的底层配置外,电机控制的主要流程相对还是挺简单的,因为角度获取不需要复杂的观测器,读取霍尔值即可。
那么下文就只讲讲FOC控制的主要文件MC_FOC_Drive.c,其他的文件都是在为了辅助这个文件的。
1.1.1 底层配置
ST针对FOC的底层代码配置还是比较直观的,大致就是ADC跟高级定时器的配置。
1. TIM1配置
高级定时器要配置成6路互补PWM模式,配置好死区,死区时间和MOS的开关特性有关。至于输出有效电平,就和前驱IC有关了。
使用通道4来硬件触发ADC采集,这样更快更准确,而且可以任意定义触发位置。只要触发在MOS下半桥打开时,PWM占空比中间触发ADC采集即可。因为TIM1配置的是中央对齐高电平为有效电平,那么只要在通道4的比较值设为定时器上溢点即可。
2. ADC
因为STM32F10x系列的ADC分为注入组跟规则组,比较复杂。但是电机控制要保证ADC采集尽可能的快,又要保证能被TIM1_CH4硬件触发。最终的方案是,使用两个ADC单元(ADC1和ADC2)的注入组,每个单元采集两个通道,ADC1(相电流Ia)、ADC2(相电流Ic)。总线电压和温度模拟量采样会分别跟在相电流A、相电流B采集完后进行。
1.1.2 电机驱动文件MC_FOC_Drive.c
这个文件包含了电机控制的基本功能,主要是FOC_Model函数,是电机控制的主要函数。
1. void FOC_Init (void)
初始化函数,只初始了电流环目标值为0。
2. void FOC_Model(void)
该文件包含了电机控制的主要功能。在中断中每次都被调用。
此功能的目的是执行PMSM转矩和通量调节,实现FOC向量算法。
主要流程:获取电角度 --> 得到两相电流 –> Clarke变换 –> Park变换 –> Id/Iq电流环 –>反Park变换 --> SVPWM输出
(1)霍尔传感器获得电角度
HALL_IncElectricalAngle();
通常在三相永磁电机中安装三个霍尔传感器,用来反馈转子位置信息。它们通常间隔 120 °或者 60°,本手册提到的固件库这两种情况都支持。为了使永磁同步电机磁场定向控制软件库能和三个霍尔传感器一起使用,只需修改 stm32f10x_MCconf.h 和 MC_hall_param.h 头文件。下图为反电势与霍尔值的关系。
但是使用霍尔得到的电角度也是得到特定的角度,无法精确到1°,这也是个弊端。
而这个函数基本的功能就是得到霍尔值,每次霍尔值改变就是60°的改变,电角度直接累加就行,最后对电角度溢出清零即可。
(2)获取相电流
Stat_Curr_a_b = GET_PHASE_CURRENTS();
就是直接读取ADC的值,然后减去基值就是相电流大小。基值跟相电流运放电路有关,一般基值都是1.65V。
(3)CLARKE变换
Stat_Curr_alfa_beta = Clarke(Stat_Curr_a_b);
就是根据相电流进行3/2变换。qIalpha = qIas;qIbeta = -(2qIbs+qIas)/sqrt(3)。
(4)PARK变换
Stat_Curr_q_d = Park(Stat_Curr_alfa_beta,GET_ELECTRICAL_ANGLE);
将αβ定子坐标系旋转欧拉角θ变换为dq旋转坐标系,得到Id和Iq。公式如下。
qId=qIalpha_tmpsin(theta)+qIbeta_tmpcos(Theta)
qIq=qIalpha_tmpcos(Theta)-qIbeta_tmpsin(Theta)
(5)反PARK变换
Stat_Volt_alfa_beta = Rev_Park(Stat_Volt_q_d);
就是dq旋转坐标系变化为αβ定子坐标系,公式如下:
qValfa=qVqCos(theta)+qVdSin(theta)
qVbeta=-qVqSin(theta)+qVd*Cos(theta)
(6)电流环控制
PID_Regulator();
电路环就是普通的电流PI控制,PID的实现网上资源就多了。
(7)SVPWM发生器
CALC_SVPWM(Stat_Volt_alfa_beta);
SVPWM就是通过Uα和Uβ,进行扇区选择和扇区时间计算。具体可以百度SVPWM,推荐https://blog.csdn.net/qlexcel/article/details/74787619。
3. void FOC_CalcFluxTorqueRef(void)
使用速度环,速度环的输出就是电流环的目标值,但是实际上这里没有使用速度环。但实际上速度环是很必要的,要注意的时在使用速度环时,要添加一个速度的斜坡函数,让速度环目标值按照一定的加速度上升。
4. void FOC_TorqueCtrl(void)
直接设定Id和Iq的目标值,在不使用速度环的时候,可以直接设置电流环的目标值Stat_Curr_q_d_ref_ref。
5. void FOC_MTPAInterface_Init(void)
MTPA(最大转矩电流比控制)初始化。MTPA是在电机输出转矩满足一定要求的条件 下,通过 调节电机d轴、q轴的电流比例,使电机在输出额定转矩的情况下需要输入的定子电流最小,要维持最大的电流输出。具体要理解的话可以直接百度。推荐https://blog.csdn.net/sy243772901/article/details/82925212。
但是这里没有使用MTPA功能,ST的MPTA代码还没看懂。但是实际上还是作用到Id的目标值,通过动态更改Id目标值的大小,来实现最大力矩控制。
6. void FOC_FluxRegulatorInterface_Init(void)
暂时不知道干嘛用的,程序中也没用到。
至此,这个文件的函数都讲解完,是基本的FOC控制过程,没有添加弱磁、MTPA、电压补偿等高级算法,就是简单的根据电角度和电流PI得到占空比输出。