pwm.c 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071
  1. /************************************************************************
  2. Project: Welling Motor Control Paltform
  3. Filename: pwm.c
  4. Partner Filename: pwm.h
  5. Description: SVPWM and over voltage modulation
  6. Complier: IAR Embedded Workbench for ARM 7.80.4
  7. CPU TYPE : GD32F3x0
  8. *************************************************************************
  9. Copyright (c) 2018 Welling Motor Technology(Shanghai) Co. Ltd.
  10. All rights reserved.
  11. *************************************************************************
  12. *************************************************************************
  13. Revising History (ECL of this file):
  14. ************************************************************************/
  15. /************************************************************************
  16. Beginning of File, do not put anything above here except notes
  17. Compiler Directives:
  18. ************************************************************************/
  19. #ifndef _PWM_C_
  20. #define _PWM_C_
  21. #endif
  22. /************************************************************************
  23. Include File
  24. ************************************************************************/
  25. #include "syspar.h"
  26. #include "user.h"
  27. /************************************************************************
  28. Private Variables
  29. *************************************************************************/
  30. SWORD pwm_pvt_sw1st_Cur_Smpl_Ct = 0;
  31. SWORD pwm_pvt_sw2nd_Cur_Smpl_Ct = 0;
  32. SWORD pwm_pvt_swMin_Double_Cur_Smpl_Pu = 0;
  33. SWORD pwm_pvt_swMin_Cur_Smpl_Ct = 0;
  34. SWORD pwm_pvt_swMin_Cur_Smpl_Pu = 0;
  35. /************************************************************************
  36. Constant Table:
  37. ************************************************************************/
  38. /************************************************************************
  39. Exported Functions:
  40. ************************************************************************/
  41. /************************************************************************
  42. Function: pwm_voInit;
  43. Description: pwm generation initial;
  44. Call by: functions in main loop;
  45. Input Variables: N/A;
  46. Output/Return Variables: N/A;
  47. Subroutine Call: N/A;
  48. Reference: N/A;
  49. ************************************************************************/
  50. void pwm_voInit(void)
  51. {
  52. pwm_stGenOut.swUalphaPu = 0; // Q14
  53. pwm_stGenOut.swUbetaPu = 0; // Q14
  54. pwm_stGenOut.uwNewSectorNum = 0;
  55. pwm_stGenOut.uwNewTIM1COMPR[0] = HW_HHPWM_PERIOD;
  56. pwm_stGenOut.uwNewTIM1COMPR[1] = HW_HHPWM_PERIOD;
  57. pwm_stGenOut.uwNewTIM1COMPR[2] = HW_HHPWM_PERIOD;
  58. pwm_stGenOut.uwNewTIM1COMPR[3] = HW_HHPWM_PERIOD;
  59. pwm_stGenOut.uwNewTIM1COMPR[4] = HW_HHPWM_PERIOD;
  60. pwm_stGenOut.uwNewTIM1COMPR[5] = HW_HHPWM_PERIOD;
  61. pwm_stGenOut.uwFirstTrigCOMPR = HW_HHHPWM_PERIOD;
  62. pwm_stGenOut.uwSecondTrigCOMPR = HW_HHPWM_PERIOD + HW_HHHPWM_PERIOD;
  63. pwm_stGenOut.uwOldTrig = 0;
  64. pwm_stGenOut.uwNewTrig = 0;
  65. pwm_stGenOut.uwSampleArea = IgnoreNone;
  66. pwm_stGenOut.uwRDSONTrig = 108;
  67. pwm_stGenOut.uwSigRTrig = HW_HHHPWM_PERIOD;
  68. }
  69. /************************************************************************
  70. Function: pwm_voGenCoef;
  71. Description: pwm generation coefficient initial;
  72. Call by: functions in main loop;
  73. Input Variables: PWM_COF_IN;
  74. Output/Return Variables: PWM_CALC_COF;
  75. Subroutine Call: N/A;
  76. Reference: N/A;
  77. ************************************************************************/
  78. void pwm_voGenCoef(PWM_COF_IN *in, PWM_CALC_COF *coef)
  79. {
  80. if (in->uwPWMDutyMax > 1000)
  81. {
  82. in->uwPWMDutyMax = 1000;
  83. }
  84. else if (in->uwPWMDutyMax == 0)
  85. {
  86. in->uwPWMDutyMax = 1;
  87. }
  88. if (in->uwPWM7To5Duty > 1000)
  89. {
  90. in->uwPWM7To5Duty = 1000;
  91. }
  92. else if (in->uwPWM7To5Duty == 0)
  93. {
  94. in->uwPWM7To5Duty = 1;
  95. }
  96. if (in->uwOvmNo > 2)
  97. {
  98. in->uwOvmNo = 2;
  99. }
  100. if (in->uwPWMPd > 31250)
  101. {
  102. in->uwPWMPd = 31250;
  103. }
  104. else if (in->uwPWMPd < 4)
  105. {
  106. in->uwPWMPd = 4;
  107. }
  108. pwm_pvt_sw1st_Cur_Smpl_Ct = cp_stControlPara.swPWM1STSampleCnt; // 采样点1:超前PWM2上升沿43个TIMER计数,实际时间为:43/4500*62.5=0.6us
  109. pwm_pvt_sw2nd_Cur_Smpl_Ct = cp_stControlPara.swPWM2NDSampleCnt; // 采样点2:超前PWM2上升沿280个TIMER计数,实际时间为:43/4500*62.5=3.88us
  110. pwm_pvt_swMin_Cur_Smpl_Ct = cp_stControlPara.swPWM1STSampleCnt + cp_stControlPara.swPWM2NDSampleCnt; // 采样点1+采样点2计数
  111. pwm_pvt_swMin_Double_Cur_Smpl_Pu = ((SLONG)pwm_pvt_swMin_Cur_Smpl_Ct<<15)/HW_PWM_PERIOD;//Q14 最小预留采样时间
  112. coef->uwOvmNo = in->uwOvmNo;
  113. coef->uwPWMPd = in->uwPWMPd;
  114. coef->uwHPWMPd = in->uwPWMPd >> 1;
  115. coef->uwHHPWMPd = in->uwPWMPd >> 2;
  116. coef->ulPWMPerInv = (((ULONG)1 << 21) / in->uwPWMPd); // Q21, 1/PWM period
  117. coef->swPWMDutyMaxPu = ((SLONG)(in->uwPWMDutyMax - 3) << 14) / 1000; // Q14
  118. coef->swPWM7To5DutyPu =((SLONG)in->uwPWM7To5Duty << 14) / 1000; // Q14
  119. // coef->swPWM7To5DutyPu = (coef->uwPWMPd - (pwm_pvt_swMin_Cur_Smpl_Ct << 2 ) - 45) * coef->ulPWMPerInv >> 7; // Q14 //
  120. coef->swPWMMinSample1Pu = ((SLONG)in->uwPWMMinSample1Pu << 14) / 1000; // Q14, unit:Pu two zero vector
  121. coef->swPWMMinSample2Pu = ((SLONG)in->uwPWMMinSample2Pu << 14) / 1000; // Q14, unit:Pu (one zero vector + sample time)*2
  122. coef->swPWMMinSample3Pu = ((SLONG)in->uwPWMMinSample3Pu << 14) / 1000; // Q14, unit:Pu (one Singel Resistance steady time + sample time)*2
  123. coef->uwMaxCmpCt = ((SLONG)in->uwPWMDutyMax * coef->uwHPWMPd) / 1000; // Q14
  124. coef->uwSampleSteadyCt = ((SLONG)in->uwSampleSteadyPu * coef->uwHPWMPd) / 1000;
  125. coef->uwSingelResisSampleCt = ((SLONG)in->uwSingelResisSamplePu * coef->uwHPWMPd) / 1000;
  126. }
  127. /************************************************************************
  128. Function: pwm_voGen;
  129. Description: pwm generation;
  130. Call by: functions in TBC;
  131. Input Variables: PWM_GEN_IN, PWM_CALC_COF;
  132. Output/Return Variables: PWM_GEN_OUT;
  133. Subroutine Call: N/A;
  134. Reference: N/A;
  135. ************************************************************************/
  136. void pwm_voGen(PWM_GEN_IN *in, PWM_CALC_COF *coef, PWM_GEN_OUT *out)
  137. {
  138. SLONG slL1, slL2, slL3;
  139. SLONG slKsvpwm;
  140. SLONG slX, slY, slZ;
  141. SWORD swT1, swT2;
  142. SWORD swOvmT1, swOvmT2;
  143. UWORD uwSector;
  144. SWORD swUaPu, swUbPu, swUcPu;
  145. SWORD swPWMPRD1, swPWMPRD2, swPWMPRD3;
  146. // SWORD swPWMPRD11,swPWMPRD21,swPWMPRD31,swPWMPRD12,swPWMPRD22,swPWMPRD32;
  147. SWORD tmp_swPeriodA, tmp_swPeriodB, tmp_swPeriodC;
  148. /*==============================================================================
  149. Sector Determination
  150. L1 = Ubeta
  151. L2 = sqrt(3)/2 * Ualfa - 1/2 * Ubeta
  152. L3 = -sqrt(3)/2 * Ualfa - 1/2 * Ubeta
  153. ==============================================================================*/
  154. slL1 = in->swUbetaPu + 1; // Q14
  155. slL2 = ((in->swUalphaPu * PWM_SQRT3 >> 14) - in->swUbetaPu) >> 1; // Q14
  156. slL3 = (-(in->swUalphaPu * PWM_SQRT3 >> 14) - in->swUbetaPu) >> 1; // Q14
  157. uwSector = 0;
  158. if (slL1 > 0)
  159. {
  160. uwSector += 1;
  161. }
  162. if (slL2 > 0)
  163. {
  164. uwSector += 2;
  165. }
  166. if (slL3 > 0)
  167. {
  168. uwSector += 4;
  169. }
  170. /*======================================================================
  171. Base Voltage Vector Period(t1/t2) calculation according to sector
  172. X = 2/sqrt(3)*Ts*slv1
  173. Y = -2/sqrt(3)*Ts*slv3
  174. Z = -2/sqrt(3)*Ts*slv2
  175. =======================================================================*/
  176. if (in->uwVdcPu < 10)
  177. {
  178. in->uwVdcPu = 10;
  179. }
  180. slKsvpwm = (PWM_SQRT3 << 15) / in->uwVdcPu; // Q15=Q14+Q15-Q14
  181. slX = slKsvpwm * (slL1 - 1) >> 15; // Q14
  182. slY = -slKsvpwm * slL3 >> 15; // Q14
  183. slZ = -slKsvpwm * slL2 >> 15; // Q14
  184. switch (uwSector)
  185. {
  186. case 3:
  187. swT1 = -slZ; // Q14, t1
  188. swT2 = slX; // Q14, t2
  189. break;
  190. case 1:
  191. swT1 = slZ; // Q14, t1
  192. swT2 = slY; // Q14, t2
  193. break;
  194. case 5:
  195. swT1 = slX; // Q14, t1
  196. swT2 = -slY; // Q14, t2
  197. break;
  198. case 4:
  199. swT1 = -slX; // Q14, t1
  200. swT2 = slZ; // Q14, t2
  201. break;
  202. case 6:
  203. swT1 = -slY; // Q14, t1
  204. swT2 = -slZ; // Q14, t2
  205. break;
  206. case 2:
  207. swT1 = slY; // Q14, t1
  208. swT2 = -slX; // Q14, t2
  209. break;
  210. default:
  211. swT1 = 0;
  212. swT2 = 0;
  213. break;
  214. }
  215. /*================================================================
  216. Over voltage modulation
  217. ================================================================*/
  218. switch (coef->uwOvmNo)
  219. {
  220. case 0:
  221. /* SVPWM over modulation: min phase error */
  222. if ((swT1 + swT2) > coef->swPWMDutyMaxPu)
  223. {
  224. swOvmT1 = (SLONG)swT1 * coef->swPWMDutyMaxPu / (swT1 + swT2); // Q14=Q14+Q14-Q14
  225. swOvmT2 = coef->swPWMDutyMaxPu - swOvmT1;
  226. out->blOvmFlag = TRUE;
  227. }
  228. else
  229. {
  230. swOvmT1 = swT1;
  231. swOvmT2 = swT2;
  232. out->blOvmFlag = FALSE;
  233. }
  234. break;
  235. case 1:
  236. /* SVPWM over modulation: min amplitude error */
  237. if ((swT1 + swT2) > coef->swPWMDutyMaxPu)
  238. {
  239. swOvmT1 = swT1 - ((swT1 + swT2 - coef->swPWMDutyMaxPu) >> 1);
  240. swOvmT2 = swT2 - ((swT1 + swT2 - coef->swPWMDutyMaxPu) >> 1);
  241. if (swOvmT1 < 0)
  242. {
  243. swOvmT1 = 0;
  244. swOvmT2 = coef->swPWMDutyMaxPu;
  245. }
  246. if (swOvmT2 < 0)
  247. {
  248. swOvmT2 = 0;
  249. swOvmT1 = coef->swPWMDutyMaxPu;
  250. }
  251. out->blOvmFlag = TRUE;
  252. }
  253. else
  254. {
  255. swOvmT1 = swT1;
  256. swOvmT2 = swT2;
  257. out->blOvmFlag = FALSE;
  258. }
  259. break;
  260. case 2:
  261. /* SVPWM over modulation: amplitude and phase optimum */
  262. if ((swT1 + swT2) > coef->swPWMDutyMaxPu)
  263. {
  264. if (swT1 > swT2)
  265. {
  266. if (swT1 > coef->swPWMDutyMaxPu)
  267. {
  268. swOvmT1 = coef->swPWMDutyMaxPu;
  269. }
  270. else
  271. {
  272. swOvmT1 = swT1;
  273. }
  274. swOvmT2 = coef->swPWMDutyMaxPu - swOvmT1;
  275. }
  276. else
  277. {
  278. if (swT2 > coef->swPWMDutyMaxPu)
  279. {
  280. swOvmT2 = coef->swPWMDutyMaxPu;
  281. }
  282. else
  283. {
  284. swOvmT2 = swT2;
  285. }
  286. swOvmT1 = coef->swPWMDutyMaxPu - swOvmT2;
  287. }
  288. out->blOvmFlag = TRUE;
  289. }
  290. else
  291. {
  292. swOvmT1 = swT1;
  293. swOvmT2 = swT2;
  294. out->blOvmFlag = FALSE;
  295. }
  296. break;
  297. default:
  298. /* SVPWM over modulation: amplitude and phase optimum */
  299. if ((swT1 + swT2) > coef->swPWMDutyMaxPu)
  300. {
  301. if (swT1 > swT2)
  302. {
  303. if (swT1 > coef->swPWMDutyMaxPu)
  304. {
  305. swOvmT1 = coef->swPWMDutyMaxPu;
  306. }
  307. else
  308. {
  309. swOvmT1 = swT1;
  310. }
  311. swOvmT2 = coef->swPWMDutyMaxPu - swOvmT1;
  312. }
  313. else
  314. {
  315. if (swT2 > coef->swPWMDutyMaxPu)
  316. {
  317. swOvmT2 = coef->swPWMDutyMaxPu;
  318. }
  319. else
  320. {
  321. swOvmT2 = swT2;
  322. }
  323. swOvmT1 = coef->swPWMDutyMaxPu - swOvmT2;
  324. }
  325. out->blOvmFlag = TRUE;
  326. }
  327. else
  328. {
  329. swOvmT1 = swT1;
  330. swOvmT2 = swT2;
  331. out->blOvmFlag = FALSE;
  332. }
  333. break;
  334. }
  335. // if(cp_stFlg.CurrentSampleModelSelect == SINGLERESISITANCE)
  336. // {
  337. // SWORD swPWMPRD11=0;
  338. // SWORD swPWMPRD21=0;
  339. // SWORD swPWMPRD31=0;
  340. // SWORD swPWMPRD12=0;
  341. // SWORD swPWMPRD22=0;
  342. // SWORD swPWMPRD32=0;
  343. //
  344. // /*1/4 of zero vector in the middle,and others apart in the beginning and ending*/
  345. // swPWMPRD1 = (((SLONG)16384 + swOvmT1 + swOvmT2) * coef->uwPWMPd) >> 16; // Q14
  346. // swPWMPRD2 = (((SLONG)16384 + swOvmT1 - swOvmT2) * coef->uwPWMPd) >> 16;
  347. // swPWMPRD3 = (((SLONG)16384 - swOvmT1 - swOvmT2) * coef->uwPWMPd) >> 16;
  348. // swPWMPRD11 = swPWMPRD1;
  349. // swPWMPRD21 = swPWMPRD2;
  350. // swPWMPRD31 = swPWMPRD3;
  351. // swPWMPRD12 = swPWMPRD1;
  352. // swPWMPRD22 = swPWMPRD2;
  353. // swPWMPRD32 = swPWMPRD3;
  354. // /* comparision value correction when two vectors are both too short*/
  355. //
  356. // if ((swOvmT1 + swOvmT2) < (pwm_pvt_swMin_Double_Cur_Smpl_Pu << 1))
  357. // {
  358. // /*if t1 is too short, move the last comparision value to left*/
  359. // if ((swOvmT1 - pwm_pvt_swMin_Double_Cur_Smpl_Pu) < 0)
  360. // {
  361. // swPWMPRD31 = swPWMPRD2 - pwm_pvt_swMin_Cur_Smpl_Ct;
  362. // swPWMPRD32 = (swPWMPRD3 << 1) - swPWMPRD31;
  363. // }
  364. // /*if t2 is too short, move the first comparision value to right*/
  365. // if ((swOvmT2 - pwm_pvt_swMin_Double_Cur_Smpl_Pu) < 0)
  366. // {
  367. // swPWMPRD21 = swPWMPRD1 - pwm_pvt_swMin_Cur_Smpl_Ct;
  368. // swPWMPRD22 = (swPWMPRD2 << 1) - swPWMPRD21;
  369. // swPWMPRD31 = swPWMPRD1 - (pwm_pvt_swMin_Cur_Smpl_Ct << 1);
  370. // swPWMPRD32 = (swPWMPRD3 << 1) - swPWMPRD31;
  371. // }
  372. // }
  373. // else
  374. // {
  375. // /*if t2 is too short and t1 is long enough for current sampling*/
  376. // if ((swOvmT2 - pwm_pvt_swMin_Double_Cur_Smpl_Pu) < 0)
  377. // {
  378. // /*if duty ratio is big enought, SEVEN_SEGEMNT change to five_SEGEMNT */
  379. // if((coef->uwHPWMPd + swPWMPRD1 - 2 * swPWMPRD2) <= pwm_pvt_swMin_Cur_Smpl_Ct)
  380. // {
  381. // swPWMPRD1 = (((SLONG)swOvmT1 + swOvmT2) * coef->uwPWMPd) >> 15;
  382. // swPWMPRD2 = ((SLONG)swOvmT1 * coef->uwPWMPd) >> 15;
  383. // swPWMPRD3 = 0;
  384. // if((coef->uwHPWMPd + swPWMPRD1 - 2 * swPWMPRD2) <= pwm_pvt_swMin_Cur_Smpl_Ct)
  385. // {
  386. // swPWMPRD11 = coef->uwHPWMPd;
  387. // swPWMPRD12 = (swPWMPRD1 << 1) - swPWMPRD11;
  388. // swPWMPRD31 = swPWMPRD3;
  389. // swPWMPRD32 = swPWMPRD3;
  390. // swPWMPRD22 = coef->uwHPWMPd;
  391. // swPWMPRD21 = (swPWMPRD2 << 1) - swPWMPRD22;
  392. // }
  393. // else
  394. // {
  395. // swPWMPRD11 = swPWMPRD1;
  396. // swPWMPRD12 = swPWMPRD1;
  397. // swPWMPRD21 = swPWMPRD1 - pwm_pvt_swMin_Cur_Smpl_Ct;
  398. // swPWMPRD22 = (swPWMPRD2 << 1) - swPWMPRD21;
  399. // swPWMPRD31 = swPWMPRD3;
  400. // swPWMPRD32 = swPWMPRD3;
  401. // }
  402. // }
  403. // else
  404. // {
  405. // swPWMPRD21 = swPWMPRD1 - pwm_pvt_swMin_Cur_Smpl_Ct;
  406. // swPWMPRD22 = (swPWMPRD2 << 1) - swPWMPRD21;
  407. // }
  408. // }
  409. // /*if t1 is too short and t1 is long enough for current sampling*/
  410. // if ((swOvmT1 - pwm_pvt_swMin_Double_Cur_Smpl_Pu) < 0)
  411. // {
  412. // /*if duty ratio is big enought, SEVEN_SEGEMNT change to five_SEGEMNT */
  413. // if((2 * swPWMPRD2 - swPWMPRD3) <= pwm_pvt_swMin_Cur_Smpl_Ct)
  414. // {
  415. // swPWMPRD1 = coef->uwHPWMPd;
  416. // swPWMPRD2 = (((SLONG)16384 - swOvmT2) * coef->uwPWMPd) >> 15;
  417. // swPWMPRD3 = (((SLONG)16384 - swOvmT1 - swOvmT2) * coef->uwPWMPd) >> 15;
  418. // if ((2 * swPWMPRD2 - swPWMPRD3) <= pwm_pvt_swMin_Cur_Smpl_Ct)
  419. // {
  420. // swPWMPRD11 = swPWMPRD1;
  421. // swPWMPRD12 = swPWMPRD1;
  422. // swPWMPRD22 = 0;
  423. // swPWMPRD21 = (swPWMPRD2 << 1) - swPWMPRD22;
  424. // swPWMPRD31 = 0;
  425. // swPWMPRD32 = (swPWMPRD3 << 1) - swPWMPRD31;
  426. // }
  427. // else
  428. // {
  429. // swPWMPRD11 = swPWMPRD1;
  430. // swPWMPRD12 = swPWMPRD1;
  431. // swPWMPRD21 = swPWMPRD3 + pwm_pvt_swMin_Cur_Smpl_Ct;
  432. // swPWMPRD22 = (swPWMPRD2 << 1) - swPWMPRD21;
  433. // swPWMPRD31 = swPWMPRD3;
  434. // swPWMPRD32 = swPWMPRD3;
  435. // }
  436. // }
  437. // else
  438. // {
  439. // swPWMPRD21 = swPWMPRD3 + pwm_pvt_swMin_Cur_Smpl_Ct;
  440. // swPWMPRD22 = (swPWMPRD2 << 1) - swPWMPRD21;
  441. // }
  442. // }
  443. // else
  444. // {}
  445. // }
  446. // out->uwOldTrig = out->uwNewTrig;
  447. // out->uwNewTrig = swPWMPRD21;
  448. // switch (uwSector)
  449. // {
  450. // case 3:
  451. // out->uwNewTIM1COMPR[0] = swPWMPRD31;
  452. // out->uwNewTIM1COMPR[1] = swPWMPRD21;
  453. // out->uwNewTIM1COMPR[2] = swPWMPRD11;
  454. // out->uwNewTIM1COMPR[3] = swPWMPRD32;
  455. // out->uwNewTIM1COMPR[4] = swPWMPRD22;
  456. // out->uwNewTIM1COMPR[5] = swPWMPRD12;
  457. // out->uwFirstTrigCOMPR = swPWMPRD21 - pwm_pvt_sw1st_Cur_Smpl_Ct;
  458. // out->uwSecondTrigCOMPR = swPWMPRD21 + pwm_pvt_sw2nd_Cur_Smpl_Ct;
  459. // break;
  460. // case 1:
  461. // out->uwNewTIM1COMPR[0] = swPWMPRD21;
  462. // out->uwNewTIM1COMPR[1] = swPWMPRD31;
  463. // out->uwNewTIM1COMPR[2] = swPWMPRD11;
  464. // out->uwNewTIM1COMPR[3] = swPWMPRD22;
  465. // out->uwNewTIM1COMPR[4] = swPWMPRD32;
  466. // out->uwNewTIM1COMPR[5] = swPWMPRD12;
  467. // out->uwFirstTrigCOMPR = swPWMPRD21 - pwm_pvt_sw1st_Cur_Smpl_Ct;
  468. // out->uwSecondTrigCOMPR = swPWMPRD21 + pwm_pvt_sw2nd_Cur_Smpl_Ct;
  469. // break;
  470. // case 5:
  471. // out->uwNewTIM1COMPR[0] = swPWMPRD11;
  472. // out->uwNewTIM1COMPR[1] = swPWMPRD31;
  473. // out->uwNewTIM1COMPR[2] = swPWMPRD21;
  474. // out->uwNewTIM1COMPR[3] = swPWMPRD12;
  475. // out->uwNewTIM1COMPR[4] = swPWMPRD32;
  476. // out->uwNewTIM1COMPR[5] = swPWMPRD22;
  477. // out->uwFirstTrigCOMPR = swPWMPRD21 - pwm_pvt_sw1st_Cur_Smpl_Ct;
  478. // out->uwSecondTrigCOMPR = swPWMPRD21 + pwm_pvt_sw2nd_Cur_Smpl_Ct;
  479. // break;
  480. // case 4:
  481. // out->uwNewTIM1COMPR[0] = swPWMPRD11;
  482. // out->uwNewTIM1COMPR[1] = swPWMPRD21;
  483. // out->uwNewTIM1COMPR[2] = swPWMPRD31;
  484. // out->uwNewTIM1COMPR[3] = swPWMPRD12;
  485. // out->uwNewTIM1COMPR[4] = swPWMPRD22;
  486. // out->uwNewTIM1COMPR[5] = swPWMPRD32;
  487. // out->uwFirstTrigCOMPR = swPWMPRD21 - pwm_pvt_sw1st_Cur_Smpl_Ct;
  488. // out->uwSecondTrigCOMPR = swPWMPRD21 + pwm_pvt_sw2nd_Cur_Smpl_Ct;
  489. // break;
  490. // case 6:
  491. // out->uwNewTIM1COMPR[0] = swPWMPRD21;
  492. // out->uwNewTIM1COMPR[1] = swPWMPRD11;
  493. // out->uwNewTIM1COMPR[2] = swPWMPRD31;
  494. // out->uwNewTIM1COMPR[3] = swPWMPRD22;
  495. // out->uwNewTIM1COMPR[4] = swPWMPRD12;
  496. // out->uwNewTIM1COMPR[5] = swPWMPRD32;
  497. // out->uwFirstTrigCOMPR = swPWMPRD21 - pwm_pvt_sw1st_Cur_Smpl_Ct;
  498. // out->uwSecondTrigCOMPR = swPWMPRD21 + pwm_pvt_sw2nd_Cur_Smpl_Ct;
  499. // break;
  500. // case 2:
  501. // out->uwNewTIM1COMPR[0] = swPWMPRD31;
  502. // out->uwNewTIM1COMPR[1] = swPWMPRD11;
  503. // out->uwNewTIM1COMPR[2] = swPWMPRD21;
  504. // out->uwNewTIM1COMPR[3] = swPWMPRD32;
  505. // out->uwNewTIM1COMPR[4] = swPWMPRD12;
  506. // out->uwNewTIM1COMPR[5] = swPWMPRD22;
  507. // out->uwFirstTrigCOMPR = swPWMPRD21 - pwm_pvt_sw1st_Cur_Smpl_Ct;
  508. // out->uwSecondTrigCOMPR = swPWMPRD21 + pwm_pvt_sw2nd_Cur_Smpl_Ct;
  509. // break;
  510. // default:
  511. // out->uwNewTIM1COMPR[0] = coef->uwHHPWMPd;
  512. // out->uwNewTIM1COMPR[1] = coef->uwHHPWMPd;
  513. // out->uwNewTIM1COMPR[2] = coef->uwHHPWMPd;
  514. // out->uwNewTIM1COMPR[3] = coef->uwHHPWMPd;
  515. // out->uwNewTIM1COMPR[4] = coef->uwHHPWMPd;
  516. // out->uwNewTIM1COMPR[5] = coef->uwHHPWMPd;
  517. // out->uwFirstTrigCOMPR = coef->uwHHPWMPd >> 1;
  518. // out->uwSecondTrigCOMPR = coef->uwHPWMPd - coef->uwHHPWMPd >> 1;
  519. // break;
  520. // }
  521. // out->uwNewSectorNum = uwSector;
  522. // out->uwPWMNewSectorNum = out->uwNewSectorNum;
  523. //
  524. // tmp_swPeriodA = coef->uwPWMPd - out->uwNewTIM1COMPR[0] - out->uwNewTIM1COMPR[3];
  525. // tmp_swPeriodB = coef->uwPWMPd - out->uwNewTIM1COMPR[1] - out->uwNewTIM1COMPR[4];
  526. // tmp_swPeriodC = coef->uwPWMPd - out->uwNewTIM1COMPR[2] - out->uwNewTIM1COMPR[5];
  527. //
  528. // swUaPu = ((((SLONG)tmp_swPeriodA * coef->ulPWMPerInv) >> 5) * in->uwVdcPu) >> 16; // Q21-Q5+Q14-Q16=Q14
  529. // swUbPu = ((((SLONG)tmp_swPeriodB * coef->ulPWMPerInv) >> 5) * in->uwVdcPu) >> 16; // Q21-Q5+Q14-Q16=Q14
  530. // swUcPu = ((((SLONG)tmp_swPeriodC * coef->ulPWMPerInv) >> 5) * in->uwVdcPu) >> 16; // Q21-Q5+Q14-Q16=Q14
  531. //
  532. // out->swUalphaPu = (swUaPu + swUaPu - swUbPu - swUcPu) * PWM_1DIV3 >> 14; // Q14=Q14+Q14-Q14
  533. // out->swUbetaPu = (swUbPu - swUcPu) * PWM_SQRT3_INV >> 14; // Q14=Q14+Q14-Q14
  534. //
  535. // }
  536. // else if(cp_stFlg.CurrentSampleModelSelect == RDSON)
  537. // {
  538. // /*================================================================
  539. // Calculate compare value
  540. // ================================================================*/
  541. // if ((swOvmT1 + swOvmT2) > coef->swPWM7To5DutyPu) /* Five SVPWM */
  542. // {
  543. // swPWMPRD1 = coef->uwHPWMPd;
  544. // swPWMPRD2 = ((ULONG)(16384 - swOvmT2) * coef->uwHPWMPd) >> 14;
  545. // swPWMPRD3 = ((ULONG)(16384 - swOvmT1 - swOvmT2) * coef->uwHPWMPd) >> 14;
  546. // }
  547. // else /* Seven SVPWM */
  548. // {
  549. // swPWMPRD1 = ((ULONG)(16384 + swOvmT1 + swOvmT2) * coef->uwHHPWMPd) >> 14;
  550. // swPWMPRD2 = ((ULONG)(16384 + swOvmT1 - swOvmT2) * coef->uwHHPWMPd) >> 14;
  551. // swPWMPRD3 = ((ULONG)(16384 - swOvmT1 - swOvmT2) * coef->uwHHPWMPd) >> 14;
  552. // }
  553. //
  554. // switch (uwSector)
  555. // {
  556. // case 3:
  557. // out->uwNewTIM1COMPR[0] = swPWMPRD3;
  558. // out->uwNewTIM1COMPR[1] = swPWMPRD2;
  559. // out->uwNewTIM1COMPR[2] = swPWMPRD1;
  560. // out->uwNewTIM1COMPR[3] = swPWMPRD3;
  561. // out->uwNewTIM1COMPR[4] = swPWMPRD2;
  562. // out->uwNewTIM1COMPR[5] = swPWMPRD1;
  563. //
  564. // break;
  565. // case 1:
  566. // out->uwNewTIM1COMPR[0] = swPWMPRD2;
  567. // out->uwNewTIM1COMPR[1] = swPWMPRD3;
  568. // out->uwNewTIM1COMPR[2] = swPWMPRD1;
  569. // out->uwNewTIM1COMPR[3] = swPWMPRD2;
  570. // out->uwNewTIM1COMPR[4] = swPWMPRD3;
  571. // out->uwNewTIM1COMPR[5] = swPWMPRD1;
  572. //
  573. // break;
  574. // case 5:
  575. // out->uwNewTIM1COMPR[0] = swPWMPRD1;
  576. // out->uwNewTIM1COMPR[1] = swPWMPRD3;
  577. // out->uwNewTIM1COMPR[2] = swPWMPRD2;
  578. // out->uwNewTIM1COMPR[3] = swPWMPRD1;
  579. // out->uwNewTIM1COMPR[4] = swPWMPRD3;
  580. // out->uwNewTIM1COMPR[5] = swPWMPRD2;
  581. //
  582. // break;
  583. // case 4:
  584. // out->uwNewTIM1COMPR[0] = swPWMPRD1;
  585. // out->uwNewTIM1COMPR[1] = swPWMPRD2;
  586. // out->uwNewTIM1COMPR[2] = swPWMPRD3;
  587. // out->uwNewTIM1COMPR[3] = swPWMPRD1;
  588. // out->uwNewTIM1COMPR[4] = swPWMPRD2;
  589. // out->uwNewTIM1COMPR[5] = swPWMPRD3;
  590. //
  591. // break;
  592. // case 6:
  593. // out->uwNewTIM1COMPR[0] = swPWMPRD2;
  594. // out->uwNewTIM1COMPR[1] = swPWMPRD1;
  595. // out->uwNewTIM1COMPR[2] = swPWMPRD3;
  596. // out->uwNewTIM1COMPR[3] = swPWMPRD2;
  597. // out->uwNewTIM1COMPR[4] = swPWMPRD1;
  598. // out->uwNewTIM1COMPR[5] = swPWMPRD3;
  599. //
  600. // break;
  601. // case 2:
  602. // out->uwNewTIM1COMPR[0] = swPWMPRD3;
  603. // out->uwNewTIM1COMPR[1] = swPWMPRD1;
  604. // out->uwNewTIM1COMPR[2] = swPWMPRD2;
  605. // out->uwNewTIM1COMPR[3] = swPWMPRD3;
  606. // out->uwNewTIM1COMPR[4] = swPWMPRD1;
  607. // out->uwNewTIM1COMPR[5] = swPWMPRD2;
  608. //
  609. // break;
  610. // default:
  611. // out->uwNewTIM1COMPR[0] = coef->uwHHPWMPd;
  612. // out->uwNewTIM1COMPR[1] = coef->uwHHPWMPd;
  613. // out->uwNewTIM1COMPR[2] = coef->uwHHPWMPd;
  614. // out->uwNewTIM1COMPR[3] = coef->uwHHPWMPd;
  615. // out->uwNewTIM1COMPR[4] = coef->uwHHPWMPd;
  616. // out->uwNewTIM1COMPR[5] = coef->uwHHPWMPd;
  617. //
  618. // break;
  619. // }
  620. //
  621. // /* Calculate actual output voltage */
  622. // out->uwNewSectorNum = uwSector;
  623. // out->uwPWMNewSectorNum = out->uwNewSectorNum;
  624. //
  625. // tmp_swPeriodA = coef->uwPWMPd - out->uwNewTIM1COMPR[0] - out->uwNewTIM1COMPR[3];
  626. // tmp_swPeriodB = coef->uwPWMPd - out->uwNewTIM1COMPR[1] - out->uwNewTIM1COMPR[4];
  627. // tmp_swPeriodC = coef->uwPWMPd - out->uwNewTIM1COMPR[2] - out->uwNewTIM1COMPR[5];
  628. //
  629. // swUaPu = ((((SLONG)tmp_swPeriodA * coef->ulPWMPerInv) >> 5) * in->uwVdcPu) >> 16; // Q21-Q5+Q14-Q16=Q14
  630. // swUbPu = ((((SLONG)tmp_swPeriodB * coef->ulPWMPerInv) >> 5) * in->uwVdcPu) >> 16; // Q21-Q5+Q14-Q16=Q14
  631. // swUcPu = ((((SLONG)tmp_swPeriodC * coef->ulPWMPerInv) >> 5) * in->uwVdcPu) >> 16; // Q21-Q5+Q14-Q16=Q14
  632. //
  633. // out->swUalphaPu = (swUaPu + swUaPu - swUbPu - swUcPu) * PWM_1DIV3 >> 14; // Q14=Q14+Q14-Q14
  634. // out->swUbetaPu = (swUbPu - swUcPu) * PWM_SQRT3_INV >> 14; // Q14=Q14+Q14-Q14
  635. //
  636. // if ((16384 - swOvmT1 - swOvmT2) > coef->swPWMMinSample1Pu)
  637. // {
  638. // out->uwSampleArea = IgnoreNone;
  639. // out->uwRDSONTrig = 108;
  640. // }
  641. // else
  642. // {
  643. // if (swOvmT1 > coef->swPWMMinSample1Pu)
  644. // {
  645. // switch (uwSector)
  646. // {
  647. // case 3:
  648. // out->uwSampleArea = IgnoreA;
  649. // break;
  650. // case 1:
  651. // out->uwSampleArea = IgnoreB;
  652. // break;
  653. // case 5:
  654. // out->uwSampleArea = IgnoreB;
  655. // break;
  656. // case 4:
  657. // out->uwSampleArea = IgnoreC;
  658. // break;
  659. // case 6:
  660. // out->uwSampleArea = IgnoreC;
  661. // break;
  662. // case 2:
  663. // out->uwSampleArea = IgnoreA;
  664. // break;
  665. // default:
  666. // out->uwSampleArea = IgnoreNone;
  667. // break;
  668. // }
  669. // out->uwRDSONTrig = swPWMPRD3 + coef->uwSampleSteadyCt;
  670. // }
  671. // else
  672. // {
  673. // switch (uwSector)
  674. // {
  675. // case 3:
  676. // out->uwSampleArea = IgnoreAB;
  677. // break;
  678. // case 1:
  679. // out->uwSampleArea = IgnoreAB;
  680. // break;
  681. // case 5:
  682. // out->uwSampleArea = IgnoreBC;
  683. // break;
  684. // case 4:
  685. // out->uwSampleArea = IgnoreBC;
  686. // break;
  687. // case 6:
  688. // out->uwSampleArea = IgnoreAC;
  689. // break;
  690. // case 2:
  691. // out->uwSampleArea = IgnoreAC;
  692. // break;
  693. // default:
  694. // out->uwSampleArea = IgnoreNone;
  695. // break;
  696. // }
  697. // out->uwRDSONTrig = swPWMPRD2 + coef->uwSampleSteadyCt;
  698. // }
  699. // }
  700. // }
  701. // else if(cp_stFlg.CurrentSampleModelSelect == COMBINATION)
  702. #if(SampleModelSelect == COMBINATION)
  703. /*================================================================
  704. Calculate compare value
  705. ================================================================*/
  706. if ((swOvmT1 + swOvmT2) > coef->swPWM7To5DutyPu) /* Five SVPWM */
  707. {
  708. swPWMPRD1 = coef->uwHPWMPd;
  709. swPWMPRD2 = ((ULONG)(16384 - swOvmT2) * coef->uwHPWMPd) >> 14;
  710. swPWMPRD3 = ((ULONG)(16384 - swOvmT1 - swOvmT2) * coef->uwHPWMPd) >> 14;
  711. }
  712. else /* Seven SVPWM */
  713. {
  714. swPWMPRD1 = ((ULONG)(16384 + swOvmT1 + swOvmT2) * coef->uwHHPWMPd) >> 14;//TC
  715. swPWMPRD2 = ((ULONG)(16384 + swOvmT1 - swOvmT2) * coef->uwHHPWMPd) >> 14;//TB
  716. swPWMPRD3 = ((ULONG)(16384 - swOvmT1 - swOvmT2) * coef->uwHHPWMPd) >> 14;//TA
  717. }
  718. if (swOvmT2 > coef->swPWMMinSample3Pu) //6us
  719. {
  720. if(swPWMPRD2>( coef->uwSingelResisSampleCt*20))
  721. {
  722. out->blSampleCalibFlag = TRUE;
  723. out->uwSigRTrig = swPWMPRD2 + (coef->uwSingelResisSampleCt +18 );
  724. }
  725. }
  726. // else if(swOvmT1>coef->swPWMMinSample3Pu)
  727. // {
  728. // out->blSampleCalibFlag = TRUE;
  729. // out->uwSigRTrig = swPWMPRD3 - coef->uwSingelResisSampleCt;
  730. // }
  731. else
  732. {
  733. out->blSampleCalibFlag = FALSE;
  734. out->uwSigRTrig = coef->uwHPWMPd;
  735. }
  736. switch (uwSector)
  737. {
  738. case 3:
  739. out->uwNewTIM1COMPR[0] = swPWMPRD3;
  740. out->uwNewTIM1COMPR[1] = swPWMPRD2;
  741. out->uwNewTIM1COMPR[2] = swPWMPRD1;
  742. out->uwNewTIM1COMPR[3] = swPWMPRD3;
  743. out->uwNewTIM1COMPR[4] = swPWMPRD2;
  744. out->uwNewTIM1COMPR[5] = swPWMPRD1;
  745. if (out->blSampleCalibFlag == TRUE)
  746. {
  747. out->uwSingelRSampleArea = SampleC;
  748. }
  749. else
  750. {
  751. out->uwSingelRSampleArea = SampleNone;
  752. }
  753. break;
  754. case 1:
  755. out->uwNewTIM1COMPR[0] = swPWMPRD2;
  756. out->uwNewTIM1COMPR[1] = swPWMPRD3;
  757. out->uwNewTIM1COMPR[2] = swPWMPRD1;
  758. out->uwNewTIM1COMPR[3] = swPWMPRD2;
  759. out->uwNewTIM1COMPR[4] = swPWMPRD3;
  760. out->uwNewTIM1COMPR[5] = swPWMPRD1;
  761. if (out->blSampleCalibFlag == TRUE)
  762. {
  763. out->uwSingelRSampleArea = SampleC;
  764. }
  765. else
  766. {
  767. out->uwSingelRSampleArea = SampleNone;
  768. }
  769. break;
  770. case 5:
  771. out->uwNewTIM1COMPR[0] = swPWMPRD1;
  772. out->uwNewTIM1COMPR[1] = swPWMPRD3;
  773. out->uwNewTIM1COMPR[2] = swPWMPRD2;
  774. out->uwNewTIM1COMPR[3] = swPWMPRD1;
  775. out->uwNewTIM1COMPR[4] = swPWMPRD3;
  776. out->uwNewTIM1COMPR[5] = swPWMPRD2;
  777. if (out->blSampleCalibFlag == TRUE)
  778. {
  779. out->uwSingelRSampleArea = SampleA;
  780. }
  781. else
  782. {
  783. out->uwSingelRSampleArea = SampleNone;
  784. }
  785. break;
  786. case 4:
  787. out->uwNewTIM1COMPR[0] = swPWMPRD1;
  788. out->uwNewTIM1COMPR[1] = swPWMPRD2;
  789. out->uwNewTIM1COMPR[2] = swPWMPRD3;
  790. out->uwNewTIM1COMPR[3] = swPWMPRD1;
  791. out->uwNewTIM1COMPR[4] = swPWMPRD2;
  792. out->uwNewTIM1COMPR[5] = swPWMPRD3;
  793. if (out->blSampleCalibFlag == TRUE)
  794. {
  795. out->uwSingelRSampleArea = SampleA;
  796. }
  797. else
  798. {
  799. out->uwSingelRSampleArea = SampleNone;
  800. }
  801. break;
  802. case 6:
  803. out->uwNewTIM1COMPR[0] = swPWMPRD2;
  804. out->uwNewTIM1COMPR[1] = swPWMPRD1;
  805. out->uwNewTIM1COMPR[2] = swPWMPRD3;
  806. out->uwNewTIM1COMPR[3] = swPWMPRD2;
  807. out->uwNewTIM1COMPR[4] = swPWMPRD1;
  808. out->uwNewTIM1COMPR[5] = swPWMPRD3;
  809. if (out->blSampleCalibFlag == TRUE)
  810. {
  811. out->uwSingelRSampleArea = SampleB;
  812. }
  813. else
  814. {
  815. out->uwSingelRSampleArea = SampleNone;
  816. }
  817. break;
  818. case 2:
  819. out->uwNewTIM1COMPR[0] = swPWMPRD3;
  820. out->uwNewTIM1COMPR[1] = swPWMPRD1;
  821. out->uwNewTIM1COMPR[2] = swPWMPRD2;
  822. out->uwNewTIM1COMPR[3] = swPWMPRD3;
  823. out->uwNewTIM1COMPR[4] = swPWMPRD1;
  824. out->uwNewTIM1COMPR[5] = swPWMPRD2;
  825. if (out->blSampleCalibFlag == TRUE)
  826. {
  827. out->uwSingelRSampleArea = SampleB;
  828. }
  829. else
  830. {
  831. out->uwSingelRSampleArea = SampleNone;
  832. }
  833. break;
  834. default:
  835. out->uwNewTIM1COMPR[0] = coef->uwHHPWMPd;
  836. out->uwNewTIM1COMPR[1] = coef->uwHHPWMPd;
  837. out->uwNewTIM1COMPR[2] = coef->uwHHPWMPd;
  838. out->uwNewTIM1COMPR[3] = coef->uwHHPWMPd;
  839. out->uwNewTIM1COMPR[4] = coef->uwHHPWMPd;
  840. out->uwNewTIM1COMPR[5] = coef->uwHHPWMPd;
  841. out->uwSingelRSampleArea = SampleNone;
  842. break;
  843. }
  844. /* Calculate actual output voltage */
  845. out->uwNewSectorNum = uwSector;
  846. out->uwPWMNewSectorNum = out->uwNewSectorNum;
  847. tmp_swPeriodA = coef->uwPWMPd - out->uwNewTIM1COMPR[0] - out->uwNewTIM1COMPR[3];
  848. tmp_swPeriodB = coef->uwPWMPd - out->uwNewTIM1COMPR[1] - out->uwNewTIM1COMPR[4];
  849. tmp_swPeriodC = coef->uwPWMPd - out->uwNewTIM1COMPR[2] - out->uwNewTIM1COMPR[5];
  850. swUaPu = ((((SLONG)tmp_swPeriodA * coef->ulPWMPerInv) >> 5) * in->uwVdcPu) >> 16; // Q21-Q5+Q14-Q16=Q14
  851. swUbPu = ((((SLONG)tmp_swPeriodB * coef->ulPWMPerInv) >> 5) * in->uwVdcPu) >> 16; // Q21-Q5+Q14-Q16=Q14
  852. swUcPu = ((((SLONG)tmp_swPeriodC * coef->ulPWMPerInv) >> 5) * in->uwVdcPu) >> 16; // Q21-Q5+Q14-Q16=Q14
  853. out->swUalphaPu = (swUaPu + swUaPu - swUbPu - swUcPu) * PWM_1DIV3 >> 14; // Q14=Q14+Q14-Q14
  854. out->swUbetaPu = (swUbPu - swUcPu) * PWM_SQRT3_INV >> 14; // Q14=Q14+Q14-Q14
  855. // if((16384-swOvmT1-swOvmT2)>coef->swPWMMinSample1Pu)
  856. // {
  857. // out->uwSampleArea = IgnoreNone;
  858. out->uwRDSONTrig = 108; //108
  859. // }
  860. // else
  861. // {
  862. // if(swOvmT1>coef->swPWMMinSample1Pu)
  863. // {
  864. // switch(uwSector)
  865. // {
  866. // case 3:
  867. // out->uwSampleArea = IgnoreA;
  868. // break;
  869. // case 1:
  870. // out->uwSampleArea = IgnoreB;
  871. // break;
  872. // case 5:
  873. // out->uwSampleArea = IgnoreB;
  874. // break;
  875. // case 4:
  876. // out->uwSampleArea = IgnoreC;
  877. // break;
  878. // case 6:
  879. // out->uwSampleArea = IgnoreC;
  880. // break;
  881. // case 2:
  882. // out->uwSampleArea = IgnoreA;
  883. // break;
  884. // default:
  885. // out->uwSampleArea = IgnoreNone;
  886. // break;
  887. // }
  888. // out->uwRDSONTrig = swPWMPRD3 + coef->uwSampleSteadyCt;
  889. // }
  890. // else
  891. // {
  892. // switch(uwSector)
  893. // {
  894. // case 3:
  895. // out->uwSampleArea = IgnoreAB;
  896. // break;
  897. // case 1:
  898. // out->uwSampleArea = IgnoreAB;
  899. // break;
  900. // case 5:
  901. // out->uwSampleArea = IgnoreBC;
  902. // break;
  903. // case 4:
  904. // out->uwSampleArea = IgnoreBC;
  905. // break;
  906. // case 6:
  907. // out->uwSampleArea = IgnoreAC;
  908. // break;
  909. // case 2:
  910. // out->uwSampleArea = IgnoreAC;
  911. // break;
  912. // default:
  913. // out->uwSampleArea = IgnoreNone;
  914. // break;
  915. // }
  916. // out->uwRDSONTrig = swPWMPRD2 + coef->uwSampleSteadyCt;
  917. // }
  918. // }
  919. #elif(SampleModelSelect == DOUBLERESISTANCE) // if(cp_stFlg.CurrentSampleModelSelect == DOUBLERESISTANCE)
  920. /*================================================================
  921. Calculate compare value
  922. ================================================================*/
  923. if ((swOvmT1 + swOvmT2) > coef->swPWM7To5DutyPu) /* Five SVPWM */
  924. {
  925. swPWMPRD1 = coef->uwHPWMPd;
  926. swPWMPRD2 = ((ULONG)(16384 - swOvmT2) * coef->uwHPWMPd) >> 14;
  927. swPWMPRD3 = ((ULONG)(16384 - swOvmT1 - swOvmT2) * coef->uwHPWMPd) >> 14;
  928. }
  929. else /* Seven SVPWM */
  930. {
  931. swPWMPRD1 = ((ULONG)(16384 + swOvmT1 + swOvmT2) * coef->uwHHPWMPd) >> 14;
  932. swPWMPRD2 = ((ULONG)(16384 + swOvmT1 - swOvmT2) * coef->uwHHPWMPd) >> 14;
  933. swPWMPRD3 = ((ULONG)(16384 - swOvmT1 - swOvmT2) * coef->uwHHPWMPd) >> 14;
  934. }
  935. switch (uwSector)
  936. {
  937. case 3:
  938. out->uwNewTIM1COMPR[0] = swPWMPRD3;
  939. out->uwNewTIM1COMPR[1] = swPWMPRD2;
  940. out->uwNewTIM1COMPR[2] = swPWMPRD1;
  941. out->uwNewTIM1COMPR[3] = swPWMPRD3;
  942. out->uwNewTIM1COMPR[4] = swPWMPRD2;
  943. out->uwNewTIM1COMPR[5] = swPWMPRD1;
  944. break;
  945. case 1:
  946. out->uwNewTIM1COMPR[0] = swPWMPRD2;
  947. out->uwNewTIM1COMPR[1] = swPWMPRD3;
  948. out->uwNewTIM1COMPR[2] = swPWMPRD1;
  949. out->uwNewTIM1COMPR[3] = swPWMPRD2;
  950. out->uwNewTIM1COMPR[4] = swPWMPRD3;
  951. out->uwNewTIM1COMPR[5] = swPWMPRD1;
  952. break;
  953. case 5:
  954. out->uwNewTIM1COMPR[0] = swPWMPRD1;
  955. out->uwNewTIM1COMPR[1] = swPWMPRD3;
  956. out->uwNewTIM1COMPR[2] = swPWMPRD2;
  957. out->uwNewTIM1COMPR[3] = swPWMPRD1;
  958. out->uwNewTIM1COMPR[4] = swPWMPRD3;
  959. out->uwNewTIM1COMPR[5] = swPWMPRD2;
  960. break;
  961. case 4:
  962. out->uwNewTIM1COMPR[0] = swPWMPRD1;
  963. out->uwNewTIM1COMPR[1] = swPWMPRD2;
  964. out->uwNewTIM1COMPR[2] = swPWMPRD3;
  965. out->uwNewTIM1COMPR[3] = swPWMPRD1;
  966. out->uwNewTIM1COMPR[4] = swPWMPRD2;
  967. out->uwNewTIM1COMPR[5] = swPWMPRD3;
  968. break;
  969. case 6:
  970. out->uwNewTIM1COMPR[0] = swPWMPRD2;
  971. out->uwNewTIM1COMPR[1] = swPWMPRD1;
  972. out->uwNewTIM1COMPR[2] = swPWMPRD3;
  973. out->uwNewTIM1COMPR[3] = swPWMPRD2;
  974. out->uwNewTIM1COMPR[4] = swPWMPRD1;
  975. out->uwNewTIM1COMPR[5] = swPWMPRD3;
  976. break;
  977. case 2:
  978. out->uwNewTIM1COMPR[0] = swPWMPRD3;
  979. out->uwNewTIM1COMPR[1] = swPWMPRD1;
  980. out->uwNewTIM1COMPR[2] = swPWMPRD2;
  981. out->uwNewTIM1COMPR[3] = swPWMPRD3;
  982. out->uwNewTIM1COMPR[4] = swPWMPRD1;
  983. out->uwNewTIM1COMPR[5] = swPWMPRD2;
  984. break;
  985. default:
  986. out->uwNewTIM1COMPR[0] = coef->uwHHPWMPd;
  987. out->uwNewTIM1COMPR[1] = coef->uwHHPWMPd;
  988. out->uwNewTIM1COMPR[2] = coef->uwHHPWMPd;
  989. out->uwNewTIM1COMPR[3] = coef->uwHHPWMPd;
  990. out->uwNewTIM1COMPR[4] = coef->uwHHPWMPd;
  991. out->uwNewTIM1COMPR[5] = coef->uwHHPWMPd;
  992. break;
  993. }
  994. /* Calculate actual output voltage */
  995. out->uwNewSectorNum = uwSector;
  996. out->uwPWMNewSectorNum = out->uwNewSectorNum;
  997. tmp_swPeriodA = coef->uwPWMPd - out->uwNewTIM1COMPR[0] - out->uwNewTIM1COMPR[3];
  998. tmp_swPeriodB = coef->uwPWMPd - out->uwNewTIM1COMPR[1] - out->uwNewTIM1COMPR[4];
  999. tmp_swPeriodC = coef->uwPWMPd - out->uwNewTIM1COMPR[2] - out->uwNewTIM1COMPR[5];
  1000. swUaPu = ((((SLONG)tmp_swPeriodA * coef->ulPWMPerInv) >> 5) * in->uwVdcPu) >> 16; // Q21-Q5+Q14-Q16=Q14
  1001. swUbPu = ((((SLONG)tmp_swPeriodB * coef->ulPWMPerInv) >> 5) * in->uwVdcPu) >> 16; // Q21-Q5+Q14-Q16=Q14
  1002. swUcPu = ((((SLONG)tmp_swPeriodC * coef->ulPWMPerInv) >> 5) * in->uwVdcPu) >> 16; // Q21-Q5+Q14-Q16=Q14
  1003. out->swUalphaPu = (swUaPu + swUaPu - swUbPu - swUcPu) * PWM_1DIV3 >> 14; // Q14=Q14+Q14-Q14
  1004. out->swUbetaPu = (swUbPu - swUcPu) * PWM_SQRT3_INV >> 14; // Q14=Q14+Q14-Q14
  1005. #endif
  1006. //// hw_uwPWMCmpr[0] = out->uwNewTIM1COMPR[0];
  1007. //// hw_uwPWMCmpr[1] = out->uwNewTIM1COMPR[1];
  1008. //// hw_uwPWMCmpr[2] = out->uwNewTIM1COMPR[2];
  1009. //// hw_uwPWMCmpr[3] = out->uwNewTIM1COMPR[3];
  1010. //// hw_uwPWMCmpr[4] = out->uwNewTIM1COMPR[4];
  1011. //// hw_uwPWMCmpr[5] = out->uwNewTIM1COMPR[5];
  1012. }
  1013. /************************************************************************
  1014. Local Functions: N/A
  1015. ************************************************************************/
  1016. /************************************************************************
  1017. Copyright (c) 2018 Welling Motor Technology(Shanghai) Co. Ltd.
  1018. All rights reserved.
  1019. ************************************************************************/
  1020. #ifdef _PWM_C_
  1021. #undef _PWM_C_
  1022. #endif
  1023. /************************************************************************
  1024. End of this File (EOF)!
  1025. Do not put anything after this part!
  1026. ************************************************************************/