CurrentDecoupledControl.c 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. #include "FU68xx_5.h"
  2. #include <Myproject.h>
  3. CurrentDecoupledControlTypeDef xdata mcCurrentDecoupledControl;
  4. DQCurrentPITypeDef xdata DQCurrentPI;
  5. //void CurrentDecoupledControlFunctionInit(void)
  6. //{
  7. // memset(&mcCurrentDecoupledControl,0, sizeof(CurrentDecoupledControlTypeDef));
  8. // mcCurrentDecoupledControl.DCurrentDecoupledControlK = D_CURRENT_DECOUPLED_CONTROL_K;
  9. // mcCurrentDecoupledControl.QCurrentDecoupledControlK1 = Q_CURRENT_DECOUPLED_CONTROL_K1;
  10. // mcCurrentDecoupledControl.QCurrentDecoupledControlK2 = Q_CURRENT_DECOUPLED_CONTROL_K2;
  11. //}
  12. void CurrentDecoupledControlFunctionInit(float MotorLd, float MotorLq, float MotorPsi, float VoltageBase, float CurrentBase, float OmegaRadSec)
  13. {
  14. memset(&mcCurrentDecoupledControl, 0, sizeof(CurrentDecoupledControlTypeDef));
  15. mcCurrentDecoupledControl.DCurrentDecoupledControlK = _Q11(OmegaRadSec * MotorLq * CurrentBase / VoltageBase);
  16. mcCurrentDecoupledControl.QCurrentDecoupledControlK1 = _Q13(OmegaRadSec * MotorPsi / VoltageBase);
  17. mcCurrentDecoupledControl.QCurrentDecoupledControlK2 = _Q11(OmegaRadSec * MotorLd * CurrentBase / VoltageBase);
  18. mcCurrentDecoupledControl.QCurrentDecoupledControlK3 = _Q11( RS * CurrentBase / VoltageBase);
  19. }
  20. void CurrentDecoupledControlFunction(void)//DQ轴解耦处理
  21. {
  22. // if(LowSpeedObserver.LowSpeedObserverToAoObserverFlag)
  23. {
  24. mcCurrentDecoupledControl.Omega = mcFocCtrl.SpeedFlt1;//Q15格式
  25. }
  26. // else
  27. // {
  28. // mcCurrentDecoupledControl.Omega = LowSpeedObserver.LowSpeedObserverOmegaFlt;//Q15格式
  29. // }
  30. mcCurrentDecoupledControl.DCurrent0 = FOC__ID;//Q15格式
  31. mcCurrentDecoupledControl.QCurrent0 = FOC__IQ;//Q15格式
  32. mcCurrentDecoupledControl.DCurrent = LPF_realize2(mcCurrentDecoupledControl.DCurrent0, mcCurrentDecoupledControl.DCurrent, LPF_K(1.0));
  33. mcCurrentDecoupledControl.QCurrent = LPF_realize2(mcCurrentDecoupledControl.QCurrent0, mcCurrentDecoupledControl.QCurrent, LPF_K(1.0));
  34. // mcCurrentDecoupledControl.DcVoltage = mcFocCtrl.mcDcbusFlt;//FOC__UDCFLT;//Q15格式
  35. mcCurrentDecoupledControl.DcVoltage = FOC__UDCFLT;//FOC__UDCFLT;//Q15格式
  36. MUL0_MA = mcCurrentDecoupledControl.Omega;//Q15格式
  37. MUL0_MB = mcCurrentDecoupledControl.QCurrent;//Q15格式
  38. SMDU_RunBlock(0, S1MUL);
  39. MUL0_MA = MUL0_MCH;//Q15格式
  40. MUL0_MB = mcCurrentDecoupledControl.DCurrentDecoupledControlK;//Q11格式
  41. SMDU_RunBlock(0, S1MUL);
  42. mcCurrentDecoupledControl.DVoltageComponent = MUL0_MCH << 4;//Q15格式
  43. if (mcCurrentDecoupledControl.DVoltageComponent < 0) //硬件除法器不可以为负,空载启动时转速超调可能导致Q轴电流为负,导致电流异常
  44. {
  45. mcCurrentDecoupledControl.DVoltageComponentAbs = -mcCurrentDecoupledControl.DVoltageComponent;
  46. }
  47. else
  48. {
  49. mcCurrentDecoupledControl.DVoltageComponentAbs = mcCurrentDecoupledControl.DVoltageComponent;
  50. }
  51. DIV0_DAH = mcCurrentDecoupledControl.DVoltageComponentAbs;//Q31格式
  52. DIV0_DAL = 0;
  53. DIV0_DB = mcCurrentDecoupledControl.DcVoltage;//Q15格式
  54. SMDU_RunBlock(0, DIV);
  55. if (mcCurrentDecoupledControl.DVoltageComponent < 0)
  56. {
  57. mcCurrentDecoupledControl.DDutyQ15 = DIV0_DQL >> 1;//Q15格式,该分量为负
  58. }
  59. else
  60. {
  61. mcCurrentDecoupledControl.DDutyQ15 = -(DIV0_DQL >> 1);//Q15格式,该分量为负
  62. }
  63. MUL0_MA = mcCurrentDecoupledControl.Omega;//Q15格式
  64. MUL0_MB = mcCurrentDecoupledControl.QCurrentDecoupledControlK1;//Q13格式
  65. SMDU_RunBlock(0, S1MUL);
  66. mcCurrentDecoupledControl.QVoltageComponent1 = MUL0_MCH << 2;//Q15格式
  67. MUL0_MA = mcCurrentDecoupledControl.Omega;//Q15格式
  68. MUL0_MB = mcCurrentDecoupledControl.QCurrentDecoupledControlK2;//Q11格式
  69. SMDU_RunBlock(0, S1MUL);
  70. MUL0_MA = MUL0_MCH;//Q11格式
  71. MUL0_MB = mcCurrentDecoupledControl.DCurrent;//Q15格式
  72. SMDU_RunBlock(0, S1MUL);
  73. mcCurrentDecoupledControl.QVoltageComponent2 = MUL0_MCH << 4;//Q15格式
  74. mcCurrentDecoupledControl.QVoltageComponent = mcCurrentDecoupledControl.QVoltageComponent1 + mcCurrentDecoupledControl.QVoltageComponent2;
  75. if (mcCurrentDecoupledControl.QVoltageComponent < 0) //硬件除法器不可以为负
  76. {
  77. mcCurrentDecoupledControl.QVoltageComponentAbs = -mcCurrentDecoupledControl.QVoltageComponent;
  78. }
  79. else
  80. {
  81. mcCurrentDecoupledControl.QVoltageComponentAbs = mcCurrentDecoupledControl.QVoltageComponent;
  82. }
  83. DIV0_DAH = mcCurrentDecoupledControl.QVoltageComponentAbs;//Q31格式
  84. DIV0_DAL = 0;
  85. DIV0_DB = mcCurrentDecoupledControl.DcVoltage;//Q15格式
  86. SMDU_RunBlock(0, DIV);
  87. mcCurrentDecoupledControl.QDutyQ15 = DIV0_DQL >> 1;//Q15格式
  88. if (mcCurrentDecoupledControl.QVoltageComponent < 0)
  89. {
  90. mcCurrentDecoupledControl.QDutyQ15 = -mcCurrentDecoupledControl.QDutyQ15;
  91. }
  92. FOC_UDCPS = mcCurrentDecoupledControl.DDutyQ15;
  93. FOC_UQCPS = mcCurrentDecoupledControl.QDutyQ15;
  94. }
  95. void DQCurrentKpKiCalInit(float MotorLd, float MotorLq, float Ts, float VoltageBase, float CurrentBase, float hValue)
  96. {
  97. DQCurrentPI.DCurrentKik = _Q11(MotorLd * (hValue + 1.0) / 4.5 / hValue / hValue / Ts);
  98. DQCurrentPI.DCurrentKpk = MotorLd * (hValue + 1.0) / 3.0 / hValue / Ts;
  99. DQCurrentPI.QCurrentKik = _Q11(MotorLq * (hValue + 1.0) / 4.5 / hValue / hValue / Ts);
  100. DQCurrentPI.QCurrentKpk = MotorLq * (hValue + 1.0) / 3.0 / hValue / Ts;
  101. DQCurrentPI.KpwmkValue = VoltageBase / CurrentBase;
  102. }
  103. void DQCurrentKpKiCal(void)
  104. {
  105. MUL1_MA = DQCurrentPI.KpwmkValue;
  106. MUL1_MB = FOC__UDCFLT;//Q15格式
  107. SMDU_RunBlock(1, S1MUL);
  108. DQCurrentPI.KpwmValue = MUL1_MCH;
  109. DIV1_DAH = 0;
  110. DIV1_DAL = DQCurrentPI.DCurrentKik;//Q11格式
  111. DIV1_DB = DQCurrentPI.KpwmValue;
  112. SMDU_RunBlock(1, DIV);
  113. DQCurrentPI.DCurrentKi = DIV1_DQL << 4;//Q15格式
  114. DIV1_DAH = 0;
  115. DIV1_DAL = DQCurrentPI.QCurrentKik;//Q11格式
  116. DIV1_DB = DQCurrentPI.KpwmValue;
  117. SMDU_RunBlock(1, DIV);
  118. DQCurrentPI.QCurrentKi = DIV1_DQL << 4;//Q15格式
  119. DIV1_DAH = DQCurrentPI.DCurrentKpk;//Q16格式
  120. DIV1_DAL = 0;
  121. DIV1_DB = DQCurrentPI.KpwmValue << 4;//Q4格式
  122. SMDU_RunBlock(1, DIV);
  123. if ((DIV1_DQH != 0) || (DIV1_DQL > 32767))
  124. {
  125. DQCurrentPI.DCurrentKp = 32767;//Q12格式
  126. }
  127. else
  128. {
  129. DQCurrentPI.DCurrentKp = DIV1_DQL;//Q12格式
  130. }
  131. DIV1_DAH = DQCurrentPI.QCurrentKpk;//Q16格式
  132. DIV1_DAL = 0;
  133. DIV1_DB = DQCurrentPI.KpwmValue << 4;//Q4格式
  134. SMDU_RunBlock(1, DIV);
  135. if ((DIV1_DQH != 0) || (DIV1_DQL > 32767))
  136. {
  137. DQCurrentPI.QCurrentKp = 32767;//Q12格式
  138. }
  139. else
  140. {
  141. DQCurrentPI.QCurrentKp = DIV1_DQL;//Q12格式
  142. }
  143. FOC_QKP = DQCurrentPI.QCurrentKp;//Q轴电流环参数
  144. FOC_QKI = DQCurrentPI.QCurrentKi;
  145. FOC_DKP = DQCurrentPI.DCurrentKp;//D轴电流环参数
  146. FOC_DKI = DQCurrentPI.DCurrentKi;
  147. // FOC_DQKP = DQKPStart;//Q轴电流环参数
  148. // FOC_DQKI = DQKIStart;
  149. }
  150. //void DQCurrentKpKiCal(void)
  151. //{
  152. // MUL1_MA = Kpwmk;
  153. // MUL1_MB = FOC__UDCFLT;//Q15格式
  154. // SMDU_RunBlock(1,S1MUL);
  155. // DQCurrentPI.KpwmValue = MUL1_MCH;
  156. //
  157. // DIV1_DAH = DCurrentKi_K;//Q16格式
  158. // DIV1_DAL = 0;
  159. // DIV1_DB = DQCurrentPI.KpwmValue;
  160. // SMDU_RunBlock(1,DIV);
  161. // DQCurrentPI.DCurrentKi = DIV1_DQL >> 1;//Q15格式
  162. //
  163. // DIV1_DAH = QCurrentKi_K;//Q16格式
  164. // DIV1_DAL = 0;
  165. // DIV1_DB = DQCurrentPI.KpwmValue;
  166. // SMDU_RunBlock(1,DIV);
  167. // DQCurrentPI.QCurrentKi = DIV1_DQL >> 1;//Q15格式
  168. //
  169. // DIV1_DAH = DCurrentKp_K;//Q16格式
  170. // DIV1_DAL = 0;
  171. // DIV1_DB = DQCurrentPI.KpwmValue << 4;//Q4格式
  172. // SMDU_RunBlock(1,DIV);
  173. //
  174. // if((DIV1_DQH != 0) || (DIV1_DQL > 32767))
  175. // {
  176. // DQCurrentPI.DCurrentKp = 32767;//Q12格式
  177. // }else
  178. // {
  179. // DQCurrentPI.DCurrentKp = DIV1_DQL;//Q12格式
  180. // }
  181. //
  182. // DIV1_DAH = QCurrentKp_K;//Q16格式
  183. // DIV1_DAL = 0;
  184. // DIV1_DB = DQCurrentPI.KpwmValue << 4;//Q4格式
  185. // SMDU_RunBlock(1,DIV);
  186. //
  187. // if((DIV1_DQH != 0) || (DIV1_DQL > 32767))
  188. // {
  189. // DQCurrentPI.QCurrentKp = 32767;//Q12格式
  190. // }else
  191. // {
  192. // DQCurrentPI.QCurrentKp = DIV1_DQL;//Q12格式
  193. // }
  194. //
  195. // FOC_DQKP = DQCurrentPI.QCurrentKp;//Q轴电流环参数
  196. // FOC_DQKI = DQCurrentPI.QCurrentKi;
  197. //
  198. // FOC_DKP = DQCurrentPI.DCurrentKp;//D轴电流环参数
  199. // FOC_DKI = DQCurrentPI.DCurrentKi;
  200. //
  201. //// FOC_DQKP = DQKPStart;//Q轴电流环参数
  202. //// FOC_DQKI = DQKIStart;
  203. //}