pwm.c 35 KB

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