svpwm.c 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714
  1. #include "foc/svpwm.h"
  2. #include "math/fast_math.h"
  3. void svpwm(alpha_beta_t *alpha_beta, float vbus, uint32_t PWM_half_period, phase_time_t *phase_out, u8 *sector_out){
  4. float alpha = alpha_beta->alpha / (3.0f/2.0f * vbus);
  5. float beta = alpha_beta->beta / (3.0f/2.0f * vbus);
  6. uint32_t sector = 0xFF;
  7. if (beta >= 0.0f) {
  8. if (alpha >= 0.0f) {
  9. //quadrant I
  10. if (ONE_BY_SQRT3 * beta > alpha) {
  11. sector = SECTOR_2;
  12. } else {
  13. sector = SECTOR_1;
  14. }
  15. } else {
  16. //quadrant II
  17. if (-ONE_BY_SQRT3 * beta > alpha) {
  18. sector = SECTOR_3;
  19. } else {
  20. sector = SECTOR_2;
  21. }
  22. }
  23. } else {
  24. if (alpha >= 0.0f) {
  25. //quadrant IV5
  26. if (-ONE_BY_SQRT3 * beta > alpha) {
  27. sector = SECTOR_5;
  28. } else {
  29. sector = SECTOR_6;
  30. }
  31. } else {
  32. //quadrant III
  33. if (ONE_BY_SQRT3 * beta > alpha) {
  34. sector = SECTOR_4;
  35. } else {
  36. sector = SECTOR_5;
  37. }
  38. }
  39. }
  40. // PWM timings
  41. u32 tA, tB, tC;
  42. u32 low, midle, high;
  43. switch (sector) {
  44. // sector 1-2
  45. case SECTOR_1: {
  46. // Vector on-times
  47. uint32_t t1 = (alpha - ONE_BY_SQRT3 * beta) * PWM_half_period;
  48. uint32_t t2 = (TWO_BY_SQRT3 * beta) * PWM_half_period;
  49. // PWM timings
  50. tA = (PWM_half_period - t1 - t2) / 2;
  51. tB = tA + t1;
  52. tC = tB + t2;
  53. low = tA;
  54. midle = tB;
  55. high = tC;
  56. break;
  57. }
  58. // sector 2-3
  59. case SECTOR_2: {
  60. // Vector on-times
  61. uint32_t t2 = (alpha + ONE_BY_SQRT3 * beta) * PWM_half_period;
  62. uint32_t t3 = (-alpha + ONE_BY_SQRT3 * beta) * PWM_half_period;
  63. // PWM timings
  64. tB = (PWM_half_period - t2 - t3) / 2;
  65. tA = tB + t3;
  66. tC = tA + t2;
  67. low = tB;
  68. midle = tA;
  69. high = tC;
  70. break;
  71. }
  72. // sector 3-4
  73. case SECTOR_3: {
  74. // Vector on-times
  75. uint32_t t3 = (TWO_BY_SQRT3 * beta) * PWM_half_period;
  76. uint32_t t4 = (-alpha - ONE_BY_SQRT3 * beta) * PWM_half_period;
  77. // PWM timings
  78. tB = (PWM_half_period - t3 - t4) / 2;
  79. tC = tB + t3;
  80. tA = tC + t4;
  81. low = tB;
  82. midle = tC;
  83. high = tA;
  84. break;
  85. }
  86. // sector 4-5
  87. case SECTOR_4: {
  88. // Vector on-times
  89. uint32_t t4 = (-alpha + ONE_BY_SQRT3 * beta) * PWM_half_period;
  90. uint32_t t5 = (-TWO_BY_SQRT3 * beta) * PWM_half_period;
  91. // PWM timings
  92. tC = (PWM_half_period - t4 - t5) / 2;
  93. tB = tC + t5;
  94. tA = tB + t4;
  95. low = tC;
  96. midle = tB;
  97. high = tA;
  98. break;
  99. }
  100. // sector 5-6
  101. case SECTOR_5: {
  102. // Vector on-times
  103. uint32_t t5 = (-alpha - ONE_BY_SQRT3 * beta) * PWM_half_period;
  104. uint32_t t6 = (alpha - ONE_BY_SQRT3 * beta) * PWM_half_period;
  105. // PWM timings
  106. tC = (PWM_half_period - t5 - t6) / 2;
  107. tA = tC + t5;
  108. tB = tA + t6;
  109. low = tC;
  110. midle = tA;
  111. high = tB;
  112. break;
  113. }
  114. // sector 6-1
  115. case SECTOR_6: {
  116. // Vector on-times
  117. uint32_t t6 = (-TWO_BY_SQRT3 * beta) * PWM_half_period;
  118. uint32_t t1 = (alpha + ONE_BY_SQRT3 * beta) * PWM_half_period;
  119. // PWM timings
  120. tA = (PWM_half_period - t6 - t1) / 2;
  121. tC = tA + t1;
  122. tB = tC + t6;
  123. low = tA;
  124. midle = tC;
  125. high = tB;
  126. break;
  127. }
  128. }
  129. phase_out->A = tA;
  130. phase_out->B = tB;
  131. phase_out->C = tC;
  132. phase_out->low = low;
  133. phase_out->midle = midle;
  134. phase_out->high = high;
  135. *sector_out = sector;
  136. #if 0
  137. static int tet_p = 0;
  138. if (tet_p++ % 5 == 0) {
  139. printf("$%d %d %d;", tA, tB, tC);
  140. }
  141. #endif
  142. }
  143. #if 0
  144. static u8 __inline Calc_N(alpha_beta_t *alpha_beta){
  145. float sqr_alpha = alpha_beta->alpha * SQRT3_BY_2;
  146. float half_beta = 0.5f * alpha_beta->beta;
  147. return (((sqr_alpha - half_beta > 0.0f) << 1) + (alpha_beta->beta > 0.0f)) + ((-(sqr_alpha + half_beta) > 0.0f) << 2);
  148. }
  149. static void __inline Calc_XYZ(alpha_beta_t *alpha_beta, float vbus, uint32_t PWM_Period, float *XYZ_Out) {
  150. float modu = (1.0f / vbus) * (float)PWM_Period;
  151. float sqr_beta = SQRT3_BY_2 * alpha_beta->beta;
  152. float alpha = 1.5f * alpha_beta->alpha;
  153. XYZ_Out[0] = SQRT3 * alpha_beta->beta * modu;
  154. XYZ_Out[1] = (sqr_beta + alpha) * modu;
  155. XYZ_Out[2] = (sqr_beta - alpha) * modu;
  156. }
  157. #endif
  158. static void __inline ModuleTime(u32 *T4, u32 *T6, u32 PWM_Period) {
  159. u32 period = PWM_Period * 95 / 100; //95%�ĵ���
  160. if (*T4 + *T6 > period){
  161. float ration = ((float)period)/((float)*T4 + (float)*T6);
  162. *T4 *= ration;
  163. *T6 *= ration;
  164. }
  165. }
  166. void SVPWM_ST(alpha_beta_t *alpha_beta, float vbus, u32 PWM_half_period, phase_time_t *phase_out, u8 *sector_out){
  167. u32 PWM_Period = PWM_half_period * 2;
  168. float wAlpha = SQRT3 * alpha_beta->alpha * 2.0f;
  169. float wBeta = -alpha_beta->beta * 2.0f;
  170. float X = wBeta * PWM_Period/vbus;
  171. float Y = (wBeta + wAlpha)*PWM_Period/vbus/2.0f;
  172. float Z = (wBeta - wAlpha)*PWM_Period/vbus/2.0f;
  173. s32 tA, tB, tC;
  174. s32 low, midle, high;
  175. if (Y < 0) {
  176. if (Z < 0) {
  177. *sector_out = 5;
  178. tA = PWM_Period/4 + (Y - Z)/4;
  179. tB = tA + Z/2;
  180. tC = tA - Y/2;
  181. low = tC;
  182. midle = tA;
  183. high = tB;
  184. }else {
  185. if (X <= 0 ) {
  186. *sector_out = 4;
  187. tA = PWM_Period/4 + (X - Z)/4;
  188. tB = tA + Z/2;
  189. tC = tB - X/2;
  190. low = tC;
  191. midle = tB;
  192. high = tA;
  193. }else {
  194. *sector_out = 3;
  195. tA = PWM_Period/4 + (Y - X)/4;
  196. tC = tA - Y/2;
  197. tB = tC + X/2;
  198. low = tB;
  199. midle = tC;
  200. high = tA;
  201. }
  202. }
  203. }else {
  204. if (Z >= 0) {
  205. *sector_out = 2;
  206. tA = PWM_Period/4 + (Y - Z)/4;
  207. tB= tA + Z/2;
  208. tC = tA - Y/2;
  209. low = tB;
  210. midle = tC;
  211. high = tA;
  212. }else {
  213. if (X <= 0 ) {
  214. *sector_out = 6;
  215. tA = PWM_Period/4 + (Y - X)/4;
  216. tC = tA - Y/2;
  217. tB = tC + X/2;
  218. low = tA;
  219. midle = tC;
  220. high = tB;
  221. } else {
  222. *sector_out = 1;
  223. tA = PWM_Period/4 + (X - Z)/4;
  224. tB = tA + Z/2;
  225. tC = tB - X/2;
  226. low = tA;
  227. midle = tB;
  228. high = tC;
  229. }
  230. }
  231. }
  232. phase_out->A = ( uint16_t )tA;
  233. phase_out->B = ( uint16_t )tB;
  234. phase_out->C = ( uint16_t )tC;
  235. phase_out->low = low;
  236. phase_out->midle = midle;
  237. phase_out->high = high;
  238. }
  239. void SVPWM_7(alpha_beta_t *alpha_beta, float vbus, u32 PWM_half_period, phase_time_t *phase_out, u8 *sector_out) {
  240. float alpha = alpha_beta->alpha * 2.0f / 3.0f;
  241. float beta = alpha_beta->beta * 2.0f / 3.0f;
  242. u8 sector = 0xFF;
  243. u32 A_duty, B_duty, C_duty;
  244. u32 low, midle, high;
  245. u32 T1, T2;
  246. float X, Y, Z;
  247. float modu = (float)(PWM_half_period) / vbus;
  248. if (beta >= 0.0f) {
  249. if (alpha >= 0.0f) {
  250. //quadrant I
  251. if (ONE_BY_SQRT3 * beta > alpha) {
  252. sector = SECTOR_2;
  253. } else {
  254. sector = SECTOR_1;
  255. }
  256. } else {
  257. //quadrant II
  258. if (-ONE_BY_SQRT3 * beta > alpha) {
  259. sector = SECTOR_3;
  260. } else {
  261. sector = SECTOR_2;
  262. }
  263. }
  264. } else {
  265. if (alpha >= 0.0f) {
  266. //quadrant IV5
  267. if (-ONE_BY_SQRT3 * beta > alpha) {
  268. sector = SECTOR_5;
  269. } else {
  270. sector = SECTOR_6;
  271. }
  272. } else {
  273. //quadrant III
  274. if (ONE_BY_SQRT3 * beta > alpha) {
  275. sector = SECTOR_4;
  276. } else {
  277. sector = SECTOR_5;
  278. }
  279. }
  280. }
  281. //X = SQRT3 * beta * modu;
  282. X = TWO_BY_SQRT3 * beta * modu;
  283. //Y = (1.5f * alpha + SQRT3_BY_2 * beta) * modu;
  284. Y = (alpha + ONE_BY_SQRT3 * beta) * modu;
  285. //Z = (-1.5f * alpha + SQRT3_BY_2 * beta) * modu;
  286. Z = (-alpha + ONE_BY_SQRT3 * beta) * modu;
  287. switch(sector) {
  288. case SECTOR_1: // 3
  289. T1 = -Z;
  290. T2 = X;
  291. break;
  292. case SECTOR_2: // 1
  293. T1 = Z;
  294. T2 = Y;
  295. break;
  296. case SECTOR_3: // 5
  297. T1 = X;
  298. T2 = -Y;
  299. break;
  300. case SECTOR_4: // 4
  301. T1 = -X;
  302. T2 = Z;
  303. break;
  304. case SECTOR_5: // 6
  305. T1 = -Y;
  306. T2 = -Z;
  307. break;
  308. case SECTOR_6: // 2
  309. T1 = Y;
  310. T2 = -X;
  311. break;
  312. default:
  313. break;
  314. }
  315. ModuleTime(&T1, &T2, PWM_half_period);
  316. /*
  317. u32 ta = (PWM_half_period - T1 - T2) / 2;
  318. u32 tb = ta + T1 ;
  319. u32 tc = tb + T2 ; */
  320. switch(sector) {
  321. case SECTOR_1: // 3
  322. A_duty = (PWM_half_period - T1 - T2) / 2;
  323. B_duty = A_duty + T1;
  324. C_duty = B_duty + T2;
  325. low = C_duty;
  326. midle = B_duty;
  327. high = A_duty;
  328. break;
  329. case SECTOR_2: // 1
  330. B_duty = (PWM_half_period - T1 - T2) / 2;
  331. A_duty = B_duty + T1;
  332. C_duty = A_duty + T2;
  333. low = C_duty;
  334. midle = A_duty;
  335. high = B_duty;
  336. break;
  337. case SECTOR_3: // 5
  338. B_duty = (PWM_half_period - T1 - T2) / 2;
  339. C_duty = B_duty + T1;
  340. A_duty = C_duty + T2;
  341. low = A_duty;
  342. midle = C_duty;
  343. high = B_duty;
  344. break;
  345. case SECTOR_4: // 4
  346. C_duty = (PWM_half_period - T1 - T2) / 2;
  347. B_duty = C_duty + T1;
  348. A_duty = B_duty + T2;
  349. low = A_duty;
  350. midle = B_duty;
  351. high = C_duty;
  352. break;
  353. case SECTOR_5: // 6
  354. C_duty = (PWM_half_period - T1 - T2) / 2;
  355. A_duty = C_duty + T1;
  356. B_duty = A_duty + T2;
  357. low = B_duty;
  358. midle = A_duty;
  359. high = C_duty;
  360. break;
  361. case SECTOR_6: // 2
  362. A_duty = (PWM_half_period - T1 - T2) / 2;
  363. C_duty = A_duty + T1;
  364. B_duty = C_duty + T2;
  365. low = B_duty;
  366. midle = C_duty;
  367. high = A_duty;
  368. break;
  369. default:
  370. break;
  371. }
  372. phase_out->A = A_duty;
  373. phase_out->B = B_duty;
  374. phase_out->C = C_duty;
  375. phase_out->low = low;
  376. phase_out->midle = midle;
  377. phase_out->high = high;
  378. *sector_out = sector;
  379. #if 0
  380. static int tet_p = 0;
  381. if (tet_p++ % 10 == 0) {
  382. printf("$%d %d %d;", A_duty, B_duty, C_duty);
  383. }
  384. #endif
  385. // printf("3sec %d, A:%d, B:%d, C:%d\n", sector, A_duty, B_duty, C_duty);
  386. }
  387. /* 7段式SVPWM
  388. * 返回设置3相PWM的3个CCR寄存器的值
  389. * 这里使用的是stm32的PWM mode1,在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平
  390. * 在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效 电平(OC1REF=1)。
  391. * 整个时间的计算,前面X,Y,Z都是一样的,后面计算ABC三相的pwm CCR寄存器值的时候,需要注意,很多网络包括书本的资料都是用PWM2模式的
  392. 就是高电平的时间 pwm_period - ccr,我们用PWM1模式,所以最后abc的计算稍微有些不一样
  393. */
  394. void SVM_Get_Phase_Time(alpha_beta_t *alpha_beta, float vbus, u32 PWM_half_period, phase_time_t *phase_out, u8 *sector_out) {
  395. float alpha = alpha_beta->alpha * SQRT3_BY_2;
  396. float beta = alpha_beta->beta * SQRT3_BY_2;
  397. u32 PWM_Period = PWM_half_period * 2;
  398. u8 sector = 0xFF;
  399. u32 tA, tB, tC;
  400. u32 low, midle, high;
  401. float X, Y, Z;
  402. float modu = (float)(PWM_Period) / vbus;
  403. if (beta >= 0.0f) {
  404. if (alpha >= 0.0f) {
  405. //quadrant I
  406. if (ONE_BY_SQRT3 * beta > alpha) {
  407. sector = SECTOR_2;
  408. } else {
  409. sector = SECTOR_1;
  410. }
  411. } else {
  412. //quadrant II
  413. if (-ONE_BY_SQRT3 * beta > alpha) {
  414. sector = SECTOR_3;
  415. } else {
  416. sector = SECTOR_2;
  417. }
  418. }
  419. } else {
  420. if (alpha >= 0.0f) {
  421. //quadrant IV5
  422. if (-ONE_BY_SQRT3 * beta > alpha) {
  423. sector = SECTOR_5;
  424. } else {
  425. sector = SECTOR_6;
  426. }
  427. } else {
  428. //quadrant III
  429. if (ONE_BY_SQRT3 * beta > alpha) {
  430. sector = SECTOR_4;
  431. } else {
  432. sector = SECTOR_5;
  433. }
  434. }
  435. }
  436. X = TWO_BY_SQRT3 * beta * modu;
  437. Y = (alpha + ONE_BY_SQRT3 * beta) * modu;
  438. Z = (-alpha + ONE_BY_SQRT3 * beta) * modu;
  439. switch(sector) {
  440. case SECTOR_1: // 3
  441. { u32 T4 = -Z;
  442. u32 T6 = X;
  443. tC = (PWM_Period - T4 - T6)/4;
  444. tB = tC + T6/2;
  445. tA = tB + T4/2;
  446. low = tA;
  447. midle = tB;
  448. high = tC;
  449. break;
  450. }
  451. case SECTOR_2: // 1
  452. {
  453. u32 T6 = Y;
  454. u32 T2 = Z;
  455. tC = (PWM_Period - T6 - T2)/4;
  456. tA = tC + T6/2;
  457. tB = tA + T2/2;
  458. low = tB;
  459. midle = tA;
  460. high = tC;
  461. break;
  462. }
  463. case SECTOR_3: // 5
  464. {
  465. u32 T2 = X;
  466. u32 T3 = -Y;
  467. tA = (PWM_Period - T2 - T3)/4;
  468. tC = tA + T3/2;
  469. tB = tC + T2/2;
  470. low = tB;
  471. midle = tC;
  472. high = tA;
  473. break;
  474. }
  475. case SECTOR_4: // 4
  476. {
  477. u32 T1 = -X;
  478. u32 T3 = Z;
  479. tA = (PWM_Period - T1 - T3)/4;
  480. tB = tA + T3/2;
  481. tC = tB + T1/2;
  482. low = tC;
  483. midle = tB;
  484. high = tA;
  485. break;
  486. }
  487. case SECTOR_5: // 6
  488. {
  489. u32 T1 = -Y;
  490. u32 T5 = -Z;
  491. tB = (PWM_Period - T1 - T5)/4;
  492. tA = tB + T5/2;
  493. tC = tA + T1/2;
  494. low = tC;
  495. midle = tA;
  496. high = tB;
  497. break;
  498. }
  499. case SECTOR_6: // 2
  500. {
  501. u32 T4 = Y;
  502. u32 T5 = -X;
  503. tB = (PWM_Period - T4 - T5)/4;
  504. tC = tB + T5/2;
  505. tA = tC + T4/2;
  506. low = tA;
  507. midle = tC;
  508. high = tB;
  509. break;
  510. }
  511. default:
  512. break;
  513. }
  514. phase_out->A = tA;
  515. phase_out->B = tB;
  516. phase_out->C = tC;
  517. phase_out->low = low;
  518. phase_out->midle = midle;
  519. phase_out->high = high;
  520. *sector_out = sector;
  521. #if 0
  522. static int tet_p = 0;
  523. if (tet_p++ % 10 == 0) {
  524. printf("$%d %d %d;", tA, tB, tC);
  525. }
  526. #endif
  527. // printf("3sec %d, A:%d, B:%d, C:%d\n", sector, A_duty, B_duty, C_duty);
  528. }
  529. #if 0
  530. void XYZ_step(void)
  531. {
  532. real_T rtb_Product1;
  533. real_T rtb_Product2;
  534. real_T rtb_Product3;
  535. /* Product: '<S1>/Product' incorporates:
  536. * Inport: '<Root>/Ts'
  537. * Inport: '<Root>/Udc'
  538. * Math: '<S1>/Math Function'
  539. *
  540. * About '<S1>/Math Function':
  541. * Operator: reciprocal
  542. */
  543. rtb_Product1 = 1.0 / rtU.Udc * rtU.Ts;
  544. /* Gain: '<S1>/Gain2' incorporates:
  545. * Inport: '<Root>/Ubeta'
  546. */
  547. rtb_Product2 = 0.8660254037844386 * rtU.Ubeta;
  548. /* Gain: '<S1>/Gain' incorporates:
  549. * Inport: '<Root>/Ualpha'
  550. */
  551. rtb_Product3 = 1.5 * rtU.Ualpha;
  552. /* Outport: '<Root>/XYZ' incorporates:
  553. * Gain: '<S1>/Gain1'
  554. * Inport: '<Root>/Ubeta'
  555. * Product: '<S1>/Product1'
  556. * Product: '<S1>/Product2'
  557. * Product: '<S1>/Product3'
  558. * Sum: '<S1>/Add'
  559. * Sum: '<S1>/Add1'
  560. */
  561. rtY.XYZ_d[2] = (rtb_Product2 - rtb_Product3) * rtb_Product1;
  562. rtY.XYZ_d[1] = (rtb_Product2 + rtb_Product3) * rtb_Product1;
  563. rtY.XYZ_d[0] = 1.7320508075688772 * rtU.Ubeta * rtb_Product1;
  564. }
  565. /* Model step function */
  566. void T1T2_step(void)
  567. {
  568. real_T rtb_Subtract;
  569. real_T rtb_T1;
  570. real_T rtb_T2;
  571. /* MultiPortSwitch: '<S1>/Multiport Switch' incorporates:
  572. * Gain: '<S1>/Gain'
  573. * Gain: '<S1>/Gain1'
  574. * Gain: '<S1>/Gain2'
  575. * Inport: '<Root>/N'
  576. * Inport: '<Root>/XYZ'
  577. */
  578. switch ((int32_T)rtU.N) {
  579. case 1:
  580. rtb_T1 = rtU.XYZ[2];
  581. /* MultiPortSwitch: '<S1>/Multiport Switch1' incorporates:
  582. * Inport: '<Root>/XYZ'
  583. */
  584. rtb_T2 = rtU.XYZ[1];
  585. break;
  586. case 2:
  587. rtb_T1 = rtU.XYZ[1];
  588. /* MultiPortSwitch: '<S1>/Multiport Switch1' incorporates:
  589. * Gain: '<S1>/Gain'
  590. * Inport: '<Root>/XYZ'
  591. */
  592. rtb_T2 = -rtU.XYZ[0];
  593. break;
  594. case 3:
  595. rtb_T1 = -rtU.XYZ[2];
  596. /* MultiPortSwitch: '<S1>/Multiport Switch1' incorporates:
  597. * Gain: '<S1>/Gain2'
  598. * Inport: '<Root>/XYZ'
  599. */
  600. rtb_T2 = rtU.XYZ[0];
  601. break;
  602. case 4:
  603. rtb_T1 = -rtU.XYZ[0];
  604. /* MultiPortSwitch: '<S1>/Multiport Switch1' incorporates:
  605. * Gain: '<S1>/Gain'
  606. * Inport: '<Root>/XYZ'
  607. */
  608. rtb_T2 = rtU.XYZ[2];
  609. break;
  610. case 5:
  611. rtb_T1 = rtU.XYZ[0];
  612. /* MultiPortSwitch: '<S1>/Multiport Switch1' incorporates:
  613. * Gain: '<S1>/Gain1'
  614. * Inport: '<Root>/XYZ'
  615. */
  616. rtb_T2 = -rtU.XYZ[1];
  617. break;
  618. default:
  619. rtb_T1 = -rtU.XYZ[1];
  620. /* MultiPortSwitch: '<S1>/Multiport Switch1' incorporates:
  621. * Gain: '<S1>/Gain1'
  622. * Gain: '<S1>/Gain2'
  623. * Inport: '<Root>/XYZ'
  624. */
  625. rtb_T2 = -rtU.XYZ[2];
  626. break;
  627. }
  628. /* End of MultiPortSwitch: '<S1>/Multiport Switch' */
  629. /* Sum: '<S1>/Subtract' */
  630. rtb_Subtract = rtb_T1 + rtb_T2;
  631. /* Switch: '<S1>/Switch' incorporates:
  632. * Inport: '<Root>/Tpwm'
  633. * Sum: '<S1>/Subtract1'
  634. * Switch: '<S1>/Switch1'
  635. */
  636. if (rtU.Tpwm - rtb_Subtract > 0.0) {
  637. /* Outport: '<Root>/T1 ' */
  638. rtY.T1 = rtb_T1;
  639. /* Outport: '<Root>/T2' */
  640. rtY.T2 = rtb_T2;
  641. } else {
  642. /* Outport: '<Root>/T1 ' incorporates:
  643. * Product: '<S1>/Divide'
  644. * Product: '<S1>/Product'
  645. */
  646. rtY.T1 = rtb_T1 * rtU.Tpwm / rtb_Subtract;
  647. /* Outport: '<Root>/T2' incorporates:
  648. * Product: '<S1>/Divide1'
  649. * Product: '<S1>/Product1'
  650. */
  651. rtY.T2 = 1.0 / rtb_Subtract * (rtb_T2 * rtU.Tpwm);
  652. }
  653. /* End of Switch: '<S1>/Switch' */
  654. }
  655. #endif