iq_fw);idqRef.real id_fw;idqRef.imag (T_ref 0) ? -iq_fw : iq_fw;model-fw idqRef;}else{idqRef.real id_mtpa;idqRef.imag (T_ref 0) ? -iq_mtpa : iq_mtpa;}}else{idqRef.real id_mtpa;idqRef.imag (T_ref 0) ? -iq_mtpa : iq_mtpa;}/* Transfer the current references to current controller (FOC) block ---------------*/input-ref.current idqRef; 四关于调试 本调试方法来自 一测试相电流采样电路的功能,通过SVPWM模块可以把FOC的控制结果转换为定时器6个通道的占空比从而驱动三相逆变模块控制定子绕组产生旋转磁场拖动转子旋转,而整体的电机控制算法是基于小信号控制理论的,。
再用adc采样相电流计算相电流采样极性和大小是否正常。
2、反park变换的输入参数有3个Vq、Vd、Angle将Vq0Vd设置为一个较小的值Angle0然后接电机上电此时svpwm会有输出电机有力转子被锁定在当前电角度位置, 三各个模块的简介 1. 电机数学模型-坐标变换clark和park变换。
如果是自己写的需要通过仿真测试等手段确保程序的正确性。
0.0);model-fluxMax fluxMax;float32 fluxMax_sq fluxMax * fluxMax;// Q-axis fluxfloat32 Lq p-lq;float32 Ld p-ld;float32 fluxQ Lq * iq_mtpa;float32 fluxQ_sq fluxQ * fluxQ;// Calculate Id_fw from the following conditions://fluxQ_sq fluxD_sq fluxMax_sq//(Lq*Iq)^2 (fluxM Ld*Id)^2 fluxMax_sq//Id -fluxPM /Ld sqrtf(fluxMax_sq - fluxQ_sq)/Ld;float32 id_fw;float32 deltaFlux_sq fluxMax_sq - fluxQ_sq;id_fw (deltaFlux_sq 0) ? ((-fluxM __sqrtf(deltaFlux_sq)) / Ld) : (-fluxM / Ld);float32 deltaId id_fw - id_mtpa;if (deltaId 0){// We are in field-weakening, 4. 该算法受物理定律软件框架软件相应速度等限制, 2. FOC算法可用于异步电机直流无刷电机永磁同步电机, id_mtpa;cfloat32idqRef;float32T_ref input-ref.torque;/* Actual torque (estimated) -------------------------------------------------------*/output-torque p_1_5 * model-foc.idq.imag * (fluxM model-foc.idq.real * deltaL);{ /* MAXIMUM TORQUE PER AMPERE (MTPA) ------------------------------------------- */float32 Tn_ref, -idqLimit);iq_mtpa (T_ref 0) ? -iq_mtpa : iq_mtpa;float32 iq_fw iq_mtpa;float32 fluxD ((Ld * id_fw) fluxM);float32 fluxD_sq fluxD * fluxD;deltaFlux_sq fluxMax_sq - fluxD_sq;iq_fw (deltaFlux_sq 0) ? (__sqrtf(deltaFlux_sq) / Lq) : 0;float32 deltaIq (-iq_mtpa * deltaId * deltaL) / ((id_fw * deltaL) fluxM);float32 iq_corr iq_mtpa deltaIq;boolean reducedTorque (iq_corr iq_fw);iq_fw reducedTorque ? iq_corr : iq_fw;//if (reducedTorque) __debug();iq_fw (iq_fw iq_mtpa) ? iq_fw : iq_mtpa;iq_fw __minf(__sqrtf(__sqrf(idqLimit) - __sqrf(id_fw)),为了验证SVPWM模块的功能需要使用上图中的6、7即反park变换和SVPWM模块产生开环的旋转磁场, 二FOC的框图和模块划分 这里借用https://blog.csdn.net/wofreeo/article/details/82968439的框图, 3. 如何给定的Iq_ref和Id-ref内嵌式永磁同步机模型 在AP32013i_Inverter_TC27xC_1_22中英飞凌给出是MTPA-电压极限圆-MTPF的方法如下; A-B:MTPA(Maximum-torque-per-ampere) C:保持要求扭矩时的减弱磁场 D:弱磁在极限转矩时 E-F:MTPF(Maximum-torque-per-flux) 程序如下 Ifx_MotorModelPmsmF32_Data *p model-params;float32deltaL p-ld - p-lq;float32fluxM p-fluxM;sint16n;float32p_1_5 1.5 * p-polePair;float32iq_mtpa,根据正电压产生正电流的电动机原则U相电流应该是正的V、W两相电流应该是负的且V、W两相电流应基本相同, rotation speed and correction-feedback */float32 absSpeed __absf(model-electricalSpeed) 1.0e-9;float32 fluxMaxAbs model-vdc / (IFX_SQRT_THREE / IFX_FOCF32_VDQ_THRESHOLD) / absSpeed;float32 fluxMax __maxf(fluxMaxAbs model-foc.fw.fbValue,之后保持q轴的PID为0然后整定d轴的参数整定的过程中可以给电机上电观察效果目的是使电流采样值经过clark、park变换后的Iq、Id值接近于IQREF、IDREF, 三、调试SVPWM模块,此时还可以验证电机的极对数若Angle重复增加N个周期后电机回到起始点可用记号笔进行标注电机的极对数即为N,比如处于svpwm的扇区1那么CH1、CH2、CH3上的波形关系如下 你可以在仿真模式下把CH1、CH2、CH3通道的比较值加入watch窗口然后手动改变Vd的值, 主要是对电机的控制电流进行矢量分解变成励磁电流Id和交轴电流Iq 励磁电流主要是产生励磁控制的是磁场的强度励磁就是控制定子的电压使其产生的磁场变化改变直流电机的转速改变励磁同样起到改变转速的作用,如果没有力说明Vd值太小了, 从框图上可以分成下面的几个部分 1. 电机的d-q模型clark变换park变换park逆变换。
一什么是FOC FOCField Oriented Control是采用数学方法实现三相电机的力矩与励磁的解耦控制, 将IqRef设置为正值时电机应该正转设置为负值时电机应该反转且正反转速应该是相同的, 1、把电流采样模块、clark变换、park变换、PID控制器加入, 四、整定d轴、q轴PID参数, 2. 外部的对象三相逆变驱动器3-phase inverter通常指三相全桥驱动电路和电机直流无刷电机BLDC 3. 空间矢量脉冲调制模块SVPWM 4. PI调节器基于小信号控制理论把电流差值转换成电压的调节器, 1、不接电机连续采样相电流此时采样值为相电流为0时的值此时值应该比较稳定变化不大如果变化比较大说明有问题, 5. 给定的Iq_ref和Id-ref: 需要说明的地方 1. FOC算法是电机控制算法的一部分具有可替代性比如DTC。
二、测试变换程序的正确性。
3. 给定的Iq_ref和Id-ref要根据电机相关模型和参数计算得出,设置Angle0IQREF0IDREF设置为一个较小值可以与上面的Vd一样, Iq_n_3;float32 f_n, check whether torque should be reducedfloat32 idqLimit Ifx_FocF32_getIdqLimit(model-foc);id_fw __maxf(id_fw,需要注意的是因为启动电流明显大于稳态电流如果IqRef的值设置得过小电机无法旋转起来而增大IqRef使电机可以旋转起来后电机会一直加速到最高转速。
3、将Angle由0开始每次增加30°左右此时电机会跟着旋转且每次旋转的角度应该是相同的记录下这个旋转方向这就是此系统固有的正方向, fluxM_sq;float32 Iq_n, 五、使用编码器输出角度替代Angle值 六、验证电流闭环 我们先来验证d轴将IqRef设置为0IdRef设置为一个合适的正值此时电机是不会旋转的用手转动电机也是可以转动的只是不同于自由转动状态此时旋转电机时会感到阻力较大有一个力始终在维持电机处于当前位置,为保证安全需要对输出电压占空比进行限幅,而交轴电流是用来控制力矩, 2、此时系统的输入参数有3个PID控制器的参考量IQREF、IDREF和Angle, 3、d轴和q轴都有PID控制器将两个PID的参数都设置为0, 验证q轴时同理将IdRef设置为0IqRef设置为一个合适的值即可, Tn_f;float32 deltaL_sq,改变Vd的值3个通道的比较值也会跟着改变,矢量控制的核心其实就在Clark与Park变换上通过这两个变换实现了直轴与交轴的解耦,若正负号不对需要进行调整。
d轴整定完后把q轴的PID参数设置为相同即可, 坐标轴变换-clark变换 坐标轴变换-park变换 下面的公式x可以是电压也可以是电流 park 正变换: park逆变换 2. SVPWM模块 参见https://blog.csdn.net/u010671230/article/details/79478648这里不在叙述了,如果使用的是官方的库可以不管本步骤。
df_n;Tn_ref (T_ref 0) ? (-T_ref / p_1_5) : (T_ref / p_1_5);deltaL_sq deltaL * deltaL;Tn_f Tn_ref * fluxM;Iq_n Tn_ref / (p_1_5 * fluxM);if (Iq_n 0){for (n 0; n 3; n){Iq_n_3 Iq_n * Iq_n * Iq_n;f_n (Iq_n * (Iq_n_3 * deltaL_sq Tn_f)) - (Tn_ref * Tn_ref);df_n (4 * Iq_n_3 * deltaL_sq) Tn_f;Iq_n Iq_n - (f_n / df_n);}}iq_mtpa Iq_n;fluxM_sq (fluxM * fluxM);id_mtpa (fluxM - __sqrtf(fluxM_sq (4 * deltaL_sq * Iq_n * Iq_n))) / (-2 * deltaL);}if (model-fieldWeakeningEnabled){ /* FIELD-WEAKENING ------------------------------------------------------------ */// Maximum flux from nominal DC voltage。
同时可以查看CH1、CH2、CH3的波形和svpwm的标准波形做对比,此时还可以进一步观察转速采样结果如果和实际情况符合的话就可以进行下一步了, 1、把FOC其他部分注释掉只保留反park变换和svpwm函数, 2、接上电机给U相设置占空比为5%V、W占空比为0此时可以用万用表测量取样电阻上的电压值应该已经有值, 。
