FocControlFunction.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553
  1. /********************************************************************************
  2. **** Copyright (C), 2020, Fortior Technology Co., Ltd. ****
  3. ********************************************************************************
  4. File Name : FocControlFunction.c
  5. Author : Bruce HW&RD
  6. Date : 2020-10-13
  7. Description : .C file function description
  8. Version : 1.0
  9. Function List :
  10. Record :
  11. 1.Date : 2020-10-13
  12. Author : Bruce HW&RD
  13. Modification: Created file
  14. ********************************************************************************/
  15. #include "FU68xx_5.h"
  16. #include <Myproject.h>
  17. CurrentOffset xdata mcCurOffset;
  18. /*---------------------------------------------------------------------------*/
  19. /* Name : void FOC_Init(void)
  20. /* Input : NO
  21. /* Output : NO
  22. /* Description: mcInit状态下,对FOC的相关寄存器进行配置,先清理寄存器,后配置,最后使能
  23. /*---------------------------------------------------------------------------*/
  24. void FOC_Init(void)
  25. {
  26. DRV_CMR = 0x0ABF; // UH/VH/WH UL/VL/WL 互补并使能
  27. /*使能FOC*/
  28. ClrBit(DRV_CR, DRVEN); // 关闭DRVIVER 计时器,防止第一拍采样出错
  29. ClrBit(DRV_CR, FOCEN);
  30. SetBit(DRV_CR, FOCEN);
  31. SetBit(FOC_CR0, MERRS1); //FTC6804新增200190530
  32. SetBit(FOC_CR0, MERRS0); //FTC6804新增200190530
  33. FOC_EOMEKLPF = 0xff; //速度滤波系数,值越小滤波深度越深
  34. FOC_KFG = 0; //FG计算系数 = 6M(TIM4分频结果)/640(FBase)
  35. /*配置FOC寄存器*/
  36. FOC_CR1 = 0; // 清零 FOC_CR1
  37. FOC_CR2 = 0; // 清零 FOC_CR2
  38. FOC_IDREF = 0; // 清零 Id
  39. FOC_IQREF = 0; // 清零 Iq
  40. FOC__THETA = 0; // 清零 角度
  41. FOC_RTHEACC = 0; // 清零 爬坡函数的初始加速度
  42. FOC__RTHESTEP = 0; // 清零 爬坡速度
  43. FOC_RTHECNT = 0; // 清零 爬坡次数
  44. FOC_THECOMP = Start_FOC_THECOMP; // SMO 估算补偿角
  45. FOC_THECOR = 0x02; // 误差角度补偿
  46. mcFocCtrl.STT_FOC_THECOMP = Start_FOC_THECOMP;
  47. /*电流环参数配置*/
  48. FOC_DKP = DQKP;
  49. FOC_DKI = DQKI;
  50. FOC_QKP = DQKP;
  51. FOC_QKI = DQKI;
  52. FOC_ID_LPFK = 250;
  53. FOC_IQ_LPFK = 250;
  54. FOC_DMAX = DOUTMAX;
  55. FOC_DMIN = DOUTMIN;
  56. FOC_QMAX = QOUTMAX;
  57. FOC_QMIN = QOUTMIN;
  58. SetBit(FOC_CR0, ESCMS); //选择arctan估算模式
  59. /*位置估算参数配置*/
  60. /*********PLL或SMO**********/
  61. #if (EstimateAlgorithm == SMO)
  62. {
  63. ClrBit(FOC_CR2, ESEL);
  64. ClrBit(FOC_CR3, MFP_EN);
  65. }
  66. #elif (EstimateAlgorithm == AO)
  67. {
  68. SetBit(FOC_CR3, MFP_EN);
  69. ClrBit(FOC_CR2, ESEL);
  70. }
  71. #elif (EstimateAlgorithm == PLL)
  72. {
  73. ClrBit(FOC_CR3, MFP_EN);
  74. SetBit(FOC_CR2, ESEL);
  75. FOC_KSLIDE = OBSE_PLLKP_GAIN1;
  76. FOC_EKLPFMIN = OBSE_PLLKI_GAIN1;
  77. }
  78. #endif //end SVPMW_Mode
  79. FOC_EK1 = OBS_K1T;
  80. FOC_EK2 = OBS_K2T;
  81. FOC_EK3 = OBS_K3T;
  82. FOC_EK4 = OBS_K4T;
  83. FOC_KSLIDE = OBS_KSLIDE;
  84. FOC_EKLPFMIN = OBS_EA_KS;
  85. FOC_FBASE = OBS_FBASE;
  86. FOC_OMEKLPF = SPEED_KLPF;
  87. FOC_TGLI = PWM_TGLI_LOAD;
  88. SetBit(FOC_CR1, SVPWMEN); // SVPWM模式
  89. #if (IRMODE == 1)
  90. {
  91. SetBit(DRV_CR, DDIR); // 反转标志位
  92. }
  93. #elif (IRMODE == 0)
  94. {
  95. ClrBit(DRV_CR, DDIR); // 反转标志位
  96. }
  97. #endif //end IRMODE
  98. /**过调制**/
  99. #if (OverModulation == 1)
  100. {
  101. SetBit(FOC_CR1, OVMDL); // 过调制
  102. }
  103. #endif //end OverModulation
  104. /*单电阻采样;需要最小采样窗,FOC_TRGDLY为0,七段式SVPWM方式*/
  105. #if (Shunt_Resistor_Mode == Single_Resistor)
  106. {
  107. SetReg(FOC_CR1, CSM0 | CSM1, 0x00);
  108. FOC_TSMIN = PWM_TS_LOAD; // 最小采样窗口
  109. FOC_TRGDLY = 0x3B; // 采样时刻在中点,一般考虑开关噪声影响,会设置延迟;3B
  110. #if (SVPMW_Mode == SVPWM_7_Segment)
  111. {
  112. ClrBit(FOC_CR2, F5SEG); // 7段式
  113. }
  114. #elif (SVPMW_Mode == SVPWM_5_Segment)
  115. {
  116. SetBit(FOC_CR2, F5SEG); // 5段式
  117. }
  118. #endif
  119. }
  120. /*双电阻采样,可设置死区补偿值,在下降沿结束前开始采样Ia,配置81*/
  121. #elif (Shunt_Resistor_Mode == Double_Resistor) // double resistor sample
  122. {
  123. SetReg(FOC_CR1, CSM0 | CSM1, CSM0);
  124. FOC_TSMIN = PWM_DT_LOAD; // 死区补偿值
  125. FOC_TRGDLY = 0x05; // ADC采样的时刻,采样时刻在计数器零点附近,83为下降沿结束前3个clock采样Ia,与单电阻不同
  126. // 01为上升沿开始后第一个clock开始采样。根据实际情况调整。
  127. FOC_TBLO = PWM_DLOWL_TIME; //下桥臂最小脉冲,保证采样
  128. /*五段式或七段式选择*/
  129. #if (SVPMW_Mode == SVPWM_7_Segment)
  130. {
  131. ClrBit(FOC_CR2, F5SEG); // 7段式
  132. }
  133. #elif (SVPMW_Mode == SVPWM_5_Segment)
  134. {
  135. SetBit(FOC_CR2, F5SEG); // 5段式
  136. }
  137. #endif
  138. #if (DouRes_Sample_Mode == DouRes_1_Cycle)
  139. {
  140. ClrBit(FOC_CR2, DSS); // 7段式
  141. }
  142. #elif (DouRes_Sample_Mode == DouRes_2_Cycle)
  143. {
  144. SetBit(FOC_CR2, DSS); // 5段式
  145. }
  146. #endif //end DouRes_Sample_Mode
  147. }
  148. /*三电阻采样*/
  149. #elif (Shunt_Resistor_Mode == Three_Resistor) // signel resistor sample
  150. {
  151. SetReg(FOC_CR1, CSM0 | CSM1, CSM0 | CSM1); // 三电阻
  152. FOC_TSMIN = PWM_DT_LOAD; // 死区补偿值
  153. FOC_TRGDLY = 0x08; // ADC采样的时刻,采样时刻在计数器零点附近,83为下降沿结束前3个clock采样Ia,与单电阻不同。
  154. // 01为上升沿开始后第一个clock开始采样。根据实际情况调整。
  155. FOC_TBLO = PWM_OVERMODULE_TIME; // 过调制电流采样处理的TB脉宽
  156. /*五段式或七段式选择*/
  157. #if (SVPMW_Mode == SVPWM_7_Segment)
  158. {
  159. ClrBit(FOC_CR2, F5SEG); // 7段式
  160. }
  161. #elif (SVPMW_Mode == SVPWM_5_Segment)
  162. {
  163. SetBit(FOC_CR2, F5SEG); // 5段式
  164. }
  165. #endif //end SVPMW_Mode
  166. #if (DouRes_Sample_Mode == DouRes_1_Cycle)
  167. {
  168. ClrBit(FOC_CR2, DSS); // 7段式
  169. }
  170. #elif (DouRes_Sample_Mode == DouRes_2_Cycle)
  171. {
  172. SetBit(FOC_CR2, DSS); // 5段式
  173. }
  174. #endif //end DouRes_Sample_Mode
  175. }
  176. #endif //end Shunt_Resistor_Mode
  177. /* 使能电流基准校正 */
  178. #if (CalibENDIS == Enable)
  179. {
  180. if (mcCurOffset.OffsetFlag == 1)
  181. {
  182. #if (Shunt_Resistor_Mode == Single_Resistor) // 单电阻校正
  183. {
  184. /*set ibus current sample offset*/
  185. SetReg(FOC_CR2, CSOC0 | CSOC1, 0x00);
  186. FOC_CSO = mcCurOffset.Iw_busOffset; // 写入Ibus的偏置
  187. }
  188. #elif (Shunt_Resistor_Mode == Double_Resistor) // 双电阻校正
  189. {
  190. /*set ia, ib current sample offset*/
  191. SetReg(FOC_CR2, CSOC0 | CSOC1, CSOC0);
  192. FOC_CSO = mcCurOffset.IuOffset; // 写入IA的偏置
  193. SetReg(FOC_CR2, CSOC0 | CSOC1, CSOC1);
  194. FOC_CSO = mcCurOffset.IvOffset; // 写入IB的偏置
  195. }
  196. #elif (Shunt_Resistor_Mode == Three_Resistor) // 三电阻校正
  197. {
  198. /*set ibus current sample offset*/
  199. SetReg(FOC_CR2, CSOC0 | CSOC1, CSOC0);
  200. FOC_CSO = mcCurOffset.IuOffset; // 写入IA的偏置
  201. SetReg(FOC_CR2, CSOC0 | CSOC1, CSOC1);
  202. FOC_CSO = mcCurOffset.IvOffset; // 写入IB的偏置
  203. SetReg(FOC_CR2, CSOC0 | CSOC1, 0x00);
  204. FOC_CSO = mcCurOffset.Iw_busOffset; // 写入IC的偏置
  205. }
  206. #endif //end Shunt_Resistor_Mode
  207. }
  208. }
  209. #endif //end CalibENDIS
  210. /* -------------------------------------------------------------------------------------------------
  211. DRV_CTL:PWM来源选择
  212. OCS = 0, DRV_COMR
  213. OCS = 1, FOC/SVPWM/SPWM
  214. -------------------------------------------------------------------------------------------------*/
  215. // ClrBit(DRV_CR , DRVEN);
  216. // _nop_();_nop_();_nop_();_nop_();
  217. SetBit(DRV_CR, DRVEN);
  218. /*计数器比较值来源FOC*/
  219. SetBit(DRV_CR, OCS);
  220. }
  221. /*---------------------------------------------------------------------------*/
  222. /* Name : void Motor_Charge(void)
  223. /* Input : NO
  224. /* Output : NO
  225. /* Description: 预充电,当一直处于预充电状态下,不接电机,可用于验证IPM或者Mos。
  226. 预充电分三步
  227. 第一步是对U相进行预充电
  228. 第二步是对U,V两相进行预充电
  229. 第三步是对U、V、W三相进行预充电。
  230. /*---------------------------------------------------------------------------*/
  231. void Motor_Charge(void)
  232. {
  233. if (McStaSet.SetFlag.ChargeSetFlag == 0)
  234. {
  235. McStaSet.SetFlag.ChargeSetFlag = 1;
  236. DRV_DR = Calib_Duty * DRV_ARR; //下桥臂10% duty
  237. // DRV_CMR = 0x00;
  238. /* ---------------------------------------------------------------------
  239. DRV_CTL:PWM来源选择
  240. OCS = 0, DRV_COMR
  241. OCS = 1, FOC/SVPWM/SPWM
  242. ----------------------------------------------------------------------*/
  243. ClrBit(DRV_CR, OCS);
  244. mcFocCtrl.ChargeStep = 0;
  245. }
  246. if ((mcFocCtrl.State_Count < Charge_Time) && (mcFocCtrl.ChargeStep == 0))
  247. {
  248. mcFocCtrl.ChargeStep = 1;
  249. DRV_CMR |= 0x01; // U相下桥臂通
  250. MOE = 1;
  251. }
  252. if (( mcFocCtrl.State_Count <= (Charge_Time << 1) / 3) && (mcFocCtrl.ChargeStep == 1))
  253. {
  254. mcFocCtrl.ChargeStep = 2;
  255. DRV_CMR |= 0x04; // V相下桥臂导通
  256. }
  257. if ((mcFocCtrl.State_Count <= Charge_Time / 3) && (mcFocCtrl.ChargeStep == 2))
  258. {
  259. mcFocCtrl.ChargeStep = 3;
  260. DRV_CMR |= 0x10; // W相下桥臂导通
  261. }
  262. }
  263. /*---------------------------------------------------------------------------*/
  264. /* Name : void Motor_Align(void)
  265. /* Input : NO
  266. /* Output : NO
  267. /* Description: 预定位函数,当无逆风判断时,采用预定位固定初始位置;当有逆风判断时,采用预定位刹车
  268. /*---------------------------------------------------------------------------*/
  269. void Motor_Align(void)
  270. {
  271. if (McStaSet.SetFlag.AlignSetFlag == 0)
  272. {
  273. McStaSet.SetFlag.AlignSetFlag = 1;
  274. /*FOC初始化*/
  275. FOC_Init();
  276. /*配置预定位的电流、KP、KI*/
  277. FOC_IDREF = 0;//ID_Align_CURRENT;
  278. FOC_IQREF = 0;//IQ_Align_CURRENT;
  279. FOC_DKP = DQKP_Alignment;
  280. FOC_DKI = DQKI_Alignment;
  281. FOC_QKP = DQKP_Alignment;
  282. FOC_QKI = DQKI_Alignment;
  283. FOC_EKP = OBSW_KP_GAIN;
  284. FOC_EKI = OBSW_KI_GAIN;
  285. // /*配置预定位角度*/
  286. // FOC__THETA = 0;//Align_Theta;
  287. /*********PLL或SMO**********/
  288. #if (EstimateAlgorithm == SMO)
  289. FOC__ETHETA = FOC__THETA - 4836;
  290. #elif (EstimateAlgorithm == PLL)
  291. FOC__ETHETA = FOC__THETA;
  292. #endif //end EstimateAlgorithm
  293. /*使能输出*/
  294. DRV_CMR |= 0x0abF; // U、V、W相上下互补输出 FTC6805
  295. MOE = 1;
  296. }
  297. if (mcFocCtrl.State_Count > (AlignmentHoldTime1 + AlignmentHoldTime2)) /* Ramp 1s */
  298. {
  299. mcFocCtrl.CurrentAlignStatus = 0;
  300. FOC__THETA = Align_Angle1;
  301. FOC_IDREF = ID_Align_CURRENT_End * (Align_Time - mcFocCtrl.State_Count) / AlignmentRampTime;
  302. }
  303. else if (mcFocCtrl.State_Count > AlignmentHoldTime2) /* Hold 900ms*/
  304. {
  305. mcFocCtrl.CurrentAlignStatus = 1;
  306. FOC__THETA = Align_Angle1;
  307. FOC_IDREF = ID_Align_CURRENT_End;
  308. }
  309. else if (mcFocCtrl.State_Count > 0) /* Hold */
  310. {
  311. mcFocCtrl.CurrentAlignStatus = 2;
  312. FOC__THETA = Align_Angle2;
  313. FOC_IDREF = ID_Align_CURRENT_End;
  314. }
  315. else
  316. {
  317. mcState = mcStart;
  318. }
  319. }
  320. /*---------------------------------------------------------------------------*/
  321. /* Name : void Motor_Open(void)
  322. /* Input : NO
  323. /* Output : NO
  324. /* Description: 开环启动的参数配置
  325. /*---------------------------------------------------------------------------*/
  326. void Motor_Open(void)
  327. {
  328. static uint8 OpenRampCycles;
  329. if (McStaSet.SetFlag.StartSetFlag == 0)
  330. {
  331. McStaSet.SetFlag.StartSetFlag = 1;
  332. }
  333. FOC_Init();
  334. FOC__THETA = _Q15((float)0.0 / 180.0);
  335. /*********PLL或SMO**********/
  336. #if ((EstimateAlgorithm == SMO)||(EstimateAlgorithm == AO))
  337. FOC__ETHETA = FOC__THETA - 4836; //SMO估算角度延迟
  338. #elif (EstimateAlgorithm == PLL)
  339. FOC__ETHETA = FOC__THETA;
  340. #endif //end EstimateAlgorithm
  341. FOC__EOME = 0;
  342. /*启动电流、KP、KI、FOC_EKP、FOC_EKI*/
  343. FOC_IDREF = ID_Start_CURRENT; // D轴启动电流
  344. mcFocCtrl.mcIqref = IQ_Start_CURRENT; // Q轴启动电流
  345. mcFocCtrl.iiqq = IQ_Start_CURRENT;
  346. FOC_DKP = DQKPStart;
  347. FOC_DKI = DQKIStart;
  348. FOC_QKP = DQKPStart;
  349. FOC_QKI = DQKIStart;
  350. FOC_EKP = OBSW_KP_GAIN;
  351. FOC_EKI = OBSW_KI_GAIN;
  352. /*启动方式选择*/
  353. #if (Open_Start_Mode == Omega_Start) // Omega 启动
  354. FOC_EFREQACC = Motor_Omega_Ramp_ACC;
  355. FOC_EFREQMIN = Motor_Omega_Ramp_Min;
  356. FOC_EFREQHOLD = Motor_Omega_Ramp_End;
  357. SetReg(FOC_CR1, EFAE | RFAE | ANGM, EFAE | ANGM);
  358. #if (IFFDebugg==1)
  359. {
  360. /*估算器禁止输出*/
  361. ClrBit(FOC_CR1, EFAE); // 禁止估算器强制输出
  362. ClrBit(FOC_CR1, RFAE); // 使能强拉
  363. ClrBit(FOC_CR1, ANGM); // 禁止估算器输出
  364. }
  365. #endif
  366. #elif (Open_Start_Mode == Open_Start)
  367. FOC_RTHEACC = Motor_Open_Ramp_ACC; // 爬坡函数的初始加速度
  368. FOC__RTHESTEP = Motor_Open_Ramp_Min; // 0.62 degree acce speed
  369. FOC_RTHECNT = MOTOR_OPEN_ACC_CNT; // acce time
  370. SetReg(FOC_CR1, EFAE | RFAE | ANGM, RFAE);
  371. #elif (Open_Start_Mode == Open_Omega_Start)
  372. FOC_RTHEACC = Motor_Open_Ramp_ACC; // 爬坡函数的初始加速度
  373. FOC__RTHESTEP = Motor_Open_Ramp_Min; // 0.62 degree acce speed
  374. FOC_RTHECNT = MOTOR_OPEN_ACC_CNT; // acce time
  375. FOC_EFREQACC = Motor_Omega_Ramp_ACC;
  376. FOC_EFREQMIN = Motor_Omega_Ramp_Min;
  377. FOC_EFREQHOLD = Motor_Omega_Ramp_End;
  378. SetReg(FOC_CR1, EFAE | RFAE | ANGM, EFAE | RFAE | ANGM);
  379. #endif //end Open_Start_Mode
  380. /*不同启动方式下,切换到MCRUN状态*/
  381. #if (Open_Start_Mode == Open_Start) //OPEN状态启动时拖动多次
  382. if (OpenRampCycles < (MOTOR_OPEN_ACC_CYCLE - 1))
  383. {
  384. if (!ReadBit(FOC_CR1, RFAE))
  385. {
  386. SetBit(FOC_CR1, RFAE);
  387. OpenRampCycles++;
  388. }
  389. }
  390. else
  391. {
  392. mcFocCtrl.State_Count = 2;
  393. mcState = mcRun;
  394. }
  395. FOC_EKP = OBSW_KP_GAIN_RUN4; // 估算器里的PI的KP
  396. FOC_EKI = OBSW_KI_GAIN_RUN4; // 估算器里的PI的KI
  397. #elif (Open_Start_Mode == Open_Omega_Start)
  398. mcFocCtrl.State_Count = 2600;
  399. mcState = mcRun;
  400. #elif (Open_Start_Mode == Omega_Start)
  401. /*********PLL或SMO**********/
  402. mcFocCtrl.State_Count = 1200;
  403. mcState = mcRun;
  404. #endif //end Open_Start_Mode
  405. FOC_IQREF = mcFocCtrl.mcIqref; // Q轴启动电流
  406. }
  407. /*---------------------------------------------------------------------------*/
  408. /* Name : void MC_Stop(void)
  409. /* Input : NO
  410. /* Output : NO
  411. /* Description: inital motor control parameter
  412. /*---------------------------------------------------------------------------*/
  413. void MC_Stop(void)
  414. {
  415. MOE = 0;
  416. ClrBit(DRV_CR, FOCEN); //关闭FOC // disable FOC output and initial register
  417. mcState = mcInit;
  418. }
  419. /*---------------------------------------------------------------------------*/
  420. /* Name : void VariablesPreInit(void)
  421. /* Input : NO
  422. /* Output : NO
  423. /* Description: 初始化电机参数
  424. /*---------------------------------------------------------------------------*/
  425. void VariablesPreInit(void)
  426. {
  427. /***********保护******************/
  428. mcFaultSource = 0;
  429. memset(&mcFaultDect, 0, sizeof(FaultVarible)); // FaultVarible变量清零
  430. /*****外部控制环*******/
  431. memset(&mcFocCtrl, 0, sizeof(FOCCTRL)); // mcFocCtrl变量清零
  432. memset(&mcIimit, 0, sizeof(ILIMIT)); // mcFocCtrl变量清零
  433. mcFocCtrl.mcDcbus_chazhi = 32760;
  434. /*****电机状态机时序变量***********/
  435. McStaSet.SetMode = 0; //电流校准标志位置1,其它置0
  436. /*****LED灯响应***/
  437. memset(&mcLedDisplay, 0, sizeof(MCLedDisplay)); // mcLedDisplay变量清零
  438. mcLedDisplay.Counttime = 4999;
  439. memset(&VoltageComp, 0, sizeof(VOLCOMP));
  440. }
  441. /*---------------------------------------------------------------------------*/
  442. /* Name : void GetCurrentOffset(void)
  443. /* Input : NO
  444. /* Output : NO
  445. /* Description: 上电时,先对硬件电路的电流进行采集,写入对应的校准寄存器中。
  446. 调试时,需观察mcCurOffset结构体中对应变量是否在范围内。采集结束后,OffsetFlag置1。
  447. /*---------------------------------------------------------------------------*/
  448. void GetCurrentOffset(void)
  449. {
  450. if (!mcCurOffset.OffsetFlag)
  451. {
  452. SetBit(ADC_CR, ADCBSY); // 使能ADC
  453. while (ReadBit(ADC_CR, ADCBSY));
  454. mcCurOffset.IuOffsetSum += ((ADC0_DR & 0x7ff8));
  455. mcCurOffset.IuOffset = mcCurOffset.IuOffsetSum >> 4;
  456. mcCurOffset.IuOffsetSum -= mcCurOffset.IuOffset;
  457. mcCurOffset.IvOffsetSum += ((ADC1_DR & 0x7ff8));
  458. mcCurOffset.IvOffset = mcCurOffset.IvOffsetSum >> 4;
  459. mcCurOffset.IvOffsetSum -= mcCurOffset.IvOffset;
  460. mcCurOffset.Iw_busOffset = mcCurOffset.IvOffset;
  461. mcCurOffset.OffsetCount++;
  462. if (mcCurOffset.OffsetCount > Calib_Time)
  463. {
  464. if (((mcCurOffset.IuOffset > 19959) || (mcCurOffset.IuOffset < 10107)) ||
  465. ((mcCurOffset.IvOffset > 19959) || (mcCurOffset.IvOffset < 10107)))
  466. {
  467. mcFaultSource = FaultIbusOffset;//进入偏置电压错误保护
  468. FaultProcess();
  469. }
  470. else
  471. {
  472. mcCurOffset.OffsetFlag = 1;
  473. }
  474. }
  475. }
  476. }
  477. /*---------------------------------------------------------------------------*/
  478. /* Name : void Motor_Ready(void)
  479. /* Input : NO
  480. /* Output : NO
  481. /* Description: 上电时,关闭输出,先对硬件电路的电流进行采集,在FOC_Init中写入对应的校准寄存器中。
  482. 调试时,需观察mcCurOffset结构体中对应变量是否在范围内。
  483. /*---------------------------------------------------------------------------*/
  484. void Motor_Ready(void)
  485. {
  486. if (McStaSet.SetFlag.CalibFlag == 0)
  487. {
  488. McStaSet.SetFlag.CalibFlag = 1;
  489. ClrBit(DRV_CR, FOCEN); // 关闭FOC
  490. MOE = 0; // 关闭MOE
  491. #if (Shunt_Resistor_Mode == Single_Resistor)
  492. SetBit(ADC_MASK, CH4EN | CH3EN | CH2EN | CH1EN | CH0EN);// 开启ADC
  493. #else
  494. SetBit(ADC_MASK, CH4EN | CH1EN | CH0EN); // 开启ADC
  495. #endif
  496. mcCurOffset.OffsetCount = 0;
  497. mcCurOffset.OffsetFlag = 0; // 开始电流采集
  498. }
  499. }
  500. /*---------------------------------------------------------------------------*/
  501. /* Name : void Motor_Init(void)
  502. /* Input : NO
  503. /* Output : NO
  504. /* Description: 对电机相关变量、PI进行初始化设置
  505. /*---------------------------------------------------------------------------*/
  506. void Motor_Init(void)
  507. {
  508. #if ( Shunt_Resistor_Mode == Single_Resistor)
  509. {
  510. ClrBit(ADC_MASK, CH4EN ); // 关闭软件电流采样的ADC FOC模块会自动调用相应ADC 无需外部使能
  511. }
  512. #else
  513. {
  514. ClrBit(ADC_MASK, CH4EN | CH1EN | CH0EN); // 关闭软件电流采样的ADC FOC模块会自动调用相应ADC 无需外部使能
  515. }
  516. #endif
  517. VariablesPreInit(); // 电机相关变量初始化
  518. PI_Init(); // PI初始化
  519. #if (FiledWeakenCompEnable==1)
  520. {
  521. memset(&mcFieldWeaken, 0, sizeof(FieldWeakeningTypeDef));
  522. }
  523. #endif
  524. #if (IQCOMPENSATEENBLE==1)
  525. MCTorqueCompensationCodeInit();
  526. #endif
  527. }