PMSM_Controller.c 101 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307
  1. /*
  2. * File: PMSM_Controller.c
  3. *
  4. * Code generated for Simulink model 'PMSM_Controller'.
  5. *
  6. * Model version : 1.1460
  7. * Simulink Coder version : 9.4 (R2020b) 29-Jul-2020
  8. * C/C++ source code generated on : Sat May 28 14:25:47 2022
  9. *
  10. * Target selection: ert.tlc
  11. * Embedded hardware selection: ARM Compatible->ARM Cortex-M
  12. * Code generation objectives:
  13. * 1. Execution efficiency
  14. * 2. RAM efficiency
  15. * Validation result: Not run
  16. */
  17. #include "PMSM_Controller.h"
  18. /* Named constants for Chart: '<S4>/Control_Mode_Manager' */
  19. #define IN_ACTIVE ((uint8_T)1U)
  20. #define IN_NO_ACTIVE_CHILD ((uint8_T)0U)
  21. #define IN_OPEN ((uint8_T)2U)
  22. #define IN_SPEED_MODE ((uint8_T)1U)
  23. #define IN_TORQUE_MODE ((uint8_T)2U)
  24. #define OPEN_MODE ((uint8_T)0U)
  25. #define SPD_MODE ((uint8_T)1U)
  26. #define TRQ_MODE ((uint8_T)2U)
  27. #ifndef UCHAR_MAX
  28. #include <limits.h>
  29. #endif
  30. #if ( UCHAR_MAX != (0xFFU) ) || ( SCHAR_MAX != (0x7F) )
  31. #error Code was generated for compiler with different sized uchar/char. \
  32. Consider adjusting Test hardware word size settings on the \
  33. Hardware Implementation pane to match your compiler word sizes as \
  34. defined in limits.h of the compiler. Alternatively, you can \
  35. select the Test hardware is the same as production hardware option and \
  36. select the Enable portable word sizes option on the Code Generation > \
  37. Verification pane for ERT based targets, which will disable the \
  38. preprocessor word size checks.
  39. #endif
  40. #if ( USHRT_MAX != (0xFFFFU) ) || ( SHRT_MAX != (0x7FFF) )
  41. #error Code was generated for compiler with different sized ushort/short. \
  42. Consider adjusting Test hardware word size settings on the \
  43. Hardware Implementation pane to match your compiler word sizes as \
  44. defined in limits.h of the compiler. Alternatively, you can \
  45. select the Test hardware is the same as production hardware option and \
  46. select the Enable portable word sizes option on the Code Generation > \
  47. Verification pane for ERT based targets, which will disable the \
  48. preprocessor word size checks.
  49. #endif
  50. #if ( UINT_MAX != (0xFFFFFFFFU) ) || ( INT_MAX != (0x7FFFFFFF) )
  51. #error Code was generated for compiler with different sized uint/int. \
  52. Consider adjusting Test hardware word size settings on the \
  53. Hardware Implementation pane to match your compiler word sizes as \
  54. defined in limits.h of the compiler. Alternatively, you can \
  55. select the Test hardware is the same as production hardware option and \
  56. select the Enable portable word sizes option on the Code Generation > \
  57. Verification pane for ERT based targets, which will disable the \
  58. preprocessor word size checks.
  59. #endif
  60. #if ( ULONG_MAX != (0xFFFFFFFFU) ) || ( LONG_MAX != (0x7FFFFFFF) )
  61. #error Code was generated for compiler with different sized ulong/long. \
  62. Consider adjusting Test hardware word size settings on the \
  63. Hardware Implementation pane to match your compiler word sizes as \
  64. defined in limits.h of the compiler. Alternatively, you can \
  65. select the Test hardware is the same as production hardware option and \
  66. select the Enable portable word sizes option on the Code Generation > \
  67. Verification pane for ERT based targets, which will disable the \
  68. preprocessor word size checks.
  69. #endif
  70. /* Skipping ulong_long/long_long check: insufficient preprocessor integer range. */
  71. extern int16_T rt_sqrt_Us32En6_Ys16En_1bhh77n4(int32_T u);
  72. extern int16_T rt_sqrt_Us32En10_Ys16E_7VJYwqF9(int32_T u);
  73. extern uint16_T rt_sqrt_Uu16En14_Yu16E_WMwW1mku(uint16_T u);
  74. uint16_T plook_u16s16_evencka(int16_T u, int16_T bp0, uint16_T bpSpace, uint32_T
  75. maxIndex);
  76. int32_T div_nde_s32_floor(int32_T numerator, int32_T denominator);
  77. extern void Low_Pass_Filter(const int16_T rtu_u[2], uint16_T rtu_coef, int16_T
  78. rty_y[2], DW_Low_Pass_Filter *localDW);
  79. extern void PI_backCalc_fixdt_Init(DW_PI_backCalc_fixdt *localDW);
  80. extern int32_T PI_backCalc_fixdt(int32_T rtu_err, int16_T rtu_P, int16_T rtu_I,
  81. int16_T rtu_Kb, int16_T rtu_satMax, int16_T rtu_satMin, int16_T rtu_init,
  82. uint8_T rtu_reset, DW_PI_backCalc_fixdt *localDW, ZCE_PI_backCalc_fixdt
  83. *localZCE);
  84. extern void PI_backCalc_fixdt_p_Init(DW_PI_backCalc_fixdt_i *localDW);
  85. extern int32_T PI_backCalc_fixdt_o(int16_T rtu_err, int16_T rtu_P, int16_T rtu_I,
  86. int16_T rtu_Kb, int16_T rtu_satMax, int16_T rtu_satMin, int16_T rtu_init,
  87. uint8_T rtu_reset, DW_PI_backCalc_fixdt_i *localDW, ZCE_PI_backCalc_fixdt_e
  88. *localZCE);
  89. extern void RateInit(int16_T rtu_initVal, int16_T rtu_target, int16_T rtu_step,
  90. int16_T *rty_s_step, int16_T *rty_High, int16_T *rty_Low);
  91. uint16_T plook_u16s16_evencka(int16_T u, int16_T bp0, uint16_T bpSpace, uint32_T
  92. maxIndex)
  93. {
  94. uint16_T bpIndex;
  95. /* Prelookup - Index only
  96. Index Search method: 'even'
  97. Extrapolation method: 'Clip'
  98. Use previous index: 'off'
  99. Use last breakpoint for index at or above upper limit: 'on'
  100. Remove protection against out-of-range input in generated code: 'off'
  101. */
  102. if (u <= bp0) {
  103. bpIndex = 0U;
  104. } else {
  105. bpIndex = (uint16_T)((uint32_T)(uint16_T)(u - bp0) / bpSpace);
  106. if (bpIndex < maxIndex) {
  107. } else {
  108. bpIndex = (uint16_T)maxIndex;
  109. }
  110. }
  111. return bpIndex;
  112. }
  113. int32_T div_nde_s32_floor(int32_T numerator, int32_T denominator)
  114. {
  115. return (((numerator < 0) != (denominator < 0)) && (numerator % denominator !=
  116. 0) ? -1 : 0) + numerator / denominator;
  117. }
  118. /*
  119. * Output and update for atomic system:
  120. * '<S48>/Low_Pass_Filter'
  121. * '<S76>/Low_Pass_Filter'
  122. */
  123. void Low_Pass_Filter(const int16_T rtu_u[2], uint16_T rtu_coef, int16_T rty_y[2],
  124. DW_Low_Pass_Filter *localDW)
  125. {
  126. int32_T rtb_Sum3_m;
  127. /* Sum: '<S56>/Sum2' incorporates:
  128. * UnitDelay: '<S56>/UnitDelay1'
  129. */
  130. rtb_Sum3_m = rtu_u[0] - (localDW->UnitDelay1_DSTATE[0] >> 16);
  131. if (rtb_Sum3_m > 32767) {
  132. rtb_Sum3_m = 32767;
  133. } else {
  134. if (rtb_Sum3_m < -32768) {
  135. rtb_Sum3_m = -32768;
  136. }
  137. }
  138. /* Sum: '<S56>/Sum3' incorporates:
  139. * Product: '<S56>/Divide3'
  140. * Sum: '<S56>/Sum2'
  141. * UnitDelay: '<S56>/UnitDelay1'
  142. */
  143. rtb_Sum3_m = rtu_coef * rtb_Sum3_m + localDW->UnitDelay1_DSTATE[0];
  144. /* DataTypeConversion: '<S56>/Data Type Conversion' */
  145. rty_y[0] = (int16_T)(rtb_Sum3_m >> 16);
  146. /* Update for UnitDelay: '<S56>/UnitDelay1' */
  147. localDW->UnitDelay1_DSTATE[0] = rtb_Sum3_m;
  148. /* Sum: '<S56>/Sum2' incorporates:
  149. * UnitDelay: '<S56>/UnitDelay1'
  150. */
  151. rtb_Sum3_m = rtu_u[1] - (localDW->UnitDelay1_DSTATE[1] >> 16);
  152. if (rtb_Sum3_m > 32767) {
  153. rtb_Sum3_m = 32767;
  154. } else {
  155. if (rtb_Sum3_m < -32768) {
  156. rtb_Sum3_m = -32768;
  157. }
  158. }
  159. /* Sum: '<S56>/Sum3' incorporates:
  160. * Product: '<S56>/Divide3'
  161. * Sum: '<S56>/Sum2'
  162. * UnitDelay: '<S56>/UnitDelay1'
  163. */
  164. rtb_Sum3_m = rtu_coef * rtb_Sum3_m + localDW->UnitDelay1_DSTATE[1];
  165. /* DataTypeConversion: '<S56>/Data Type Conversion' */
  166. rty_y[1] = (int16_T)(rtb_Sum3_m >> 16);
  167. /* Update for UnitDelay: '<S56>/UnitDelay1' */
  168. localDW->UnitDelay1_DSTATE[1] = rtb_Sum3_m;
  169. }
  170. /* System initialize for atomic system: '<S87>/PI_Speed' */
  171. void PI_backCalc_fixdt_Init(DW_PI_backCalc_fixdt *localDW)
  172. {
  173. /* InitializeConditions for Delay: '<S90>/Resettable Delay' */
  174. localDW->icLoad = 1U;
  175. }
  176. /* Output and update for atomic system: '<S87>/PI_Speed' */
  177. int32_T PI_backCalc_fixdt(int32_T rtu_err, int16_T rtu_P, int16_T rtu_I, int16_T
  178. rtu_Kb, int16_T rtu_satMax, int16_T rtu_satMin, int16_T rtu_init, uint8_T
  179. rtu_reset, DW_PI_backCalc_fixdt *localDW, ZCE_PI_backCalc_fixdt *localZCE)
  180. {
  181. int32_T rty_pi_out_0;
  182. int64_T tmp;
  183. int64_T tmp_0;
  184. /* Product: '<S89>/Divide4' */
  185. tmp_0 = (int64_T)rtu_err * rtu_P;
  186. if (tmp_0 > 2147483647LL) {
  187. tmp_0 = 2147483647LL;
  188. } else {
  189. if (tmp_0 < -2147483648LL) {
  190. tmp_0 = -2147483648LL;
  191. }
  192. }
  193. /* Delay: '<S90>/Resettable Delay' incorporates:
  194. * DataTypeConversion: '<S90>/Data Type Conversion2'
  195. */
  196. if ((rtu_reset > 0) && (localZCE->ResettableDelay_Reset_ZCE_f != POS_ZCSIG)) {
  197. localDW->icLoad = 1U;
  198. }
  199. localZCE->ResettableDelay_Reset_ZCE_f = (ZCSigState)(rtu_reset > 0);
  200. if (localDW->icLoad != 0) {
  201. localDW->ResettableDelay_DSTATE = rtu_init << 7;
  202. }
  203. /* Product: '<S89>/Divide1' incorporates:
  204. * Product: '<S89>/Divide4'
  205. */
  206. tmp = ((int64_T)(int32_T)tmp_0 * rtu_I) >> 14;
  207. if (tmp > 2147483647LL) {
  208. tmp = 2147483647LL;
  209. } else {
  210. if (tmp < -2147483648LL) {
  211. tmp = -2147483648LL;
  212. }
  213. }
  214. /* Sum: '<S89>/Sum2' incorporates:
  215. * Product: '<S89>/Divide1'
  216. * UnitDelay: '<S89>/UnitDelay'
  217. */
  218. tmp = (int64_T)(int32_T)tmp + localDW->UnitDelay_DSTATE;
  219. if (tmp > 2147483647LL) {
  220. tmp = 2147483647LL;
  221. } else {
  222. if (tmp < -2147483648LL) {
  223. tmp = -2147483648LL;
  224. }
  225. }
  226. /* Sum: '<S90>/Sum1' incorporates:
  227. * Delay: '<S90>/Resettable Delay'
  228. * Sum: '<S89>/Sum2'
  229. */
  230. tmp = (((int64_T)localDW->ResettableDelay_DSTATE << 2) + (int32_T)tmp) >> 2;
  231. if (tmp > 2147483647LL) {
  232. tmp = 2147483647LL;
  233. } else {
  234. if (tmp < -2147483648LL) {
  235. tmp = -2147483648LL;
  236. }
  237. }
  238. /* Sum: '<S89>/Sum6' incorporates:
  239. * DataTypeConversion: '<S90>/Data Type Conversion1'
  240. * Product: '<S89>/Divide4'
  241. * Sum: '<S90>/Sum1'
  242. */
  243. tmp_0 = (int64_T)((int32_T)tmp << 2) + (int32_T)tmp_0;
  244. if (tmp_0 > 2147483647LL) {
  245. tmp_0 = 2147483647LL;
  246. } else {
  247. if (tmp_0 < -2147483648LL) {
  248. tmp_0 = -2147483648LL;
  249. }
  250. }
  251. /* RelationalOperator: '<S91>/LowerRelop1' incorporates:
  252. * Switch: '<S91>/Switch2'
  253. */
  254. rty_pi_out_0 = rtu_satMax << 9;
  255. /* Switch: '<S91>/Switch2' incorporates:
  256. * RelationalOperator: '<S91>/LowerRelop1'
  257. * Sum: '<S89>/Sum6'
  258. */
  259. if ((int32_T)tmp_0 <= rty_pi_out_0) {
  260. /* RelationalOperator: '<S91>/UpperRelop' incorporates:
  261. * Switch: '<S91>/Switch'
  262. */
  263. rty_pi_out_0 = rtu_satMin << 9;
  264. /* Switch: '<S91>/Switch' incorporates:
  265. * RelationalOperator: '<S91>/UpperRelop'
  266. */
  267. if ((int32_T)tmp_0 >= rty_pi_out_0) {
  268. rty_pi_out_0 = (int32_T)tmp_0;
  269. }
  270. }
  271. /* Update for UnitDelay: '<S89>/UnitDelay' incorporates:
  272. * Product: '<S89>/Divide2'
  273. * Sum: '<S89>/Sum3'
  274. * Sum: '<S89>/Sum6'
  275. */
  276. localDW->UnitDelay_DSTATE = (int32_T)(((int64_T)(rty_pi_out_0 - (int32_T)tmp_0)
  277. * rtu_Kb) >> 14);
  278. /* Update for Delay: '<S90>/Resettable Delay' incorporates:
  279. * Sum: '<S90>/Sum1'
  280. */
  281. localDW->icLoad = 0U;
  282. localDW->ResettableDelay_DSTATE = (int32_T)tmp;
  283. return rty_pi_out_0;
  284. }
  285. /*
  286. * System initialize for atomic system:
  287. * '<S95>/PI_backCalc_fixdt'
  288. * '<S95>/PI_backCalc_fixdt1'
  289. */
  290. void PI_backCalc_fixdt_p_Init(DW_PI_backCalc_fixdt_i *localDW)
  291. {
  292. /* InitializeConditions for Delay: '<S102>/Resettable Delay' */
  293. localDW->icLoad = 1U;
  294. }
  295. /*
  296. * Output and update for atomic system:
  297. * '<S95>/PI_backCalc_fixdt'
  298. * '<S95>/PI_backCalc_fixdt1'
  299. */
  300. int32_T PI_backCalc_fixdt_o(int16_T rtu_err, int16_T rtu_P, int16_T rtu_I,
  301. int16_T rtu_Kb, int16_T rtu_satMax, int16_T rtu_satMin, int16_T rtu_init,
  302. uint8_T rtu_reset, DW_PI_backCalc_fixdt_i *localDW, ZCE_PI_backCalc_fixdt_e
  303. *localZCE)
  304. {
  305. int32_T rty_pi_out_0;
  306. int64_T tmp;
  307. int64_T tmp_0;
  308. int32_T rtb_Divide4_n;
  309. /* Product: '<S100>/Divide4' */
  310. rtb_Divide4_n = (rtu_err * rtu_P) >> 1;
  311. /* Delay: '<S102>/Resettable Delay' incorporates:
  312. * DataTypeConversion: '<S102>/Data Type Conversion2'
  313. */
  314. if ((rtu_reset > 0) && (localZCE->ResettableDelay_Reset_ZCE != POS_ZCSIG)) {
  315. localDW->icLoad = 1U;
  316. }
  317. localZCE->ResettableDelay_Reset_ZCE = (ZCSigState)(rtu_reset > 0);
  318. if (localDW->icLoad != 0) {
  319. localDW->ResettableDelay_DSTATE = rtu_init << 7;
  320. }
  321. /* Product: '<S100>/Divide1' incorporates:
  322. * Product: '<S100>/Divide4'
  323. */
  324. tmp_0 = ((int64_T)rtb_Divide4_n * rtu_I) >> 14;
  325. if (tmp_0 > 2147483647LL) {
  326. tmp_0 = 2147483647LL;
  327. } else {
  328. if (tmp_0 < -2147483648LL) {
  329. tmp_0 = -2147483648LL;
  330. }
  331. }
  332. /* Sum: '<S100>/Sum2' incorporates:
  333. * Product: '<S100>/Divide1'
  334. * UnitDelay: '<S100>/UnitDelay'
  335. */
  336. tmp_0 = (int64_T)(int32_T)tmp_0 + localDW->UnitDelay_DSTATE;
  337. if (tmp_0 > 2147483647LL) {
  338. tmp_0 = 2147483647LL;
  339. } else {
  340. if (tmp_0 < -2147483648LL) {
  341. tmp_0 = -2147483648LL;
  342. }
  343. }
  344. /* Sum: '<S102>/Sum1' incorporates:
  345. * Delay: '<S102>/Resettable Delay'
  346. * Sum: '<S100>/Sum2'
  347. */
  348. tmp_0 = (((int64_T)localDW->ResettableDelay_DSTATE << 2) + (int32_T)tmp_0) >>
  349. 2;
  350. if (tmp_0 > 2147483647LL) {
  351. tmp_0 = 2147483647LL;
  352. } else {
  353. if (tmp_0 < -2147483648LL) {
  354. tmp_0 = -2147483648LL;
  355. }
  356. }
  357. /* Sum: '<S100>/Sum6' incorporates:
  358. * DataTypeConversion: '<S102>/Data Type Conversion1'
  359. * Product: '<S100>/Divide4'
  360. * Sum: '<S102>/Sum1'
  361. */
  362. tmp = (int64_T)((int32_T)tmp_0 << 2) + rtb_Divide4_n;
  363. if (tmp > 2147483647LL) {
  364. tmp = 2147483647LL;
  365. } else {
  366. if (tmp < -2147483648LL) {
  367. tmp = -2147483648LL;
  368. }
  369. }
  370. /* RelationalOperator: '<S103>/LowerRelop1' incorporates:
  371. * Switch: '<S103>/Switch2'
  372. */
  373. rty_pi_out_0 = rtu_satMax << 9;
  374. /* Switch: '<S103>/Switch2' incorporates:
  375. * RelationalOperator: '<S103>/LowerRelop1'
  376. * Sum: '<S100>/Sum6'
  377. */
  378. if ((int32_T)tmp <= rty_pi_out_0) {
  379. /* RelationalOperator: '<S103>/UpperRelop' incorporates:
  380. * Switch: '<S103>/Switch'
  381. */
  382. rty_pi_out_0 = rtu_satMin << 9;
  383. /* Switch: '<S103>/Switch' incorporates:
  384. * RelationalOperator: '<S103>/UpperRelop'
  385. */
  386. if ((int32_T)tmp >= rty_pi_out_0) {
  387. rty_pi_out_0 = (int32_T)tmp;
  388. }
  389. }
  390. /* Update for UnitDelay: '<S100>/UnitDelay' incorporates:
  391. * Product: '<S100>/Divide2'
  392. * Sum: '<S100>/Sum3'
  393. * Sum: '<S100>/Sum6'
  394. */
  395. localDW->UnitDelay_DSTATE = (int32_T)(((int64_T)(rty_pi_out_0 - (int32_T)tmp) *
  396. rtu_Kb) >> 14);
  397. /* Update for Delay: '<S102>/Resettable Delay' incorporates:
  398. * Sum: '<S102>/Sum1'
  399. */
  400. localDW->icLoad = 0U;
  401. localDW->ResettableDelay_DSTATE = (int32_T)tmp_0;
  402. return rty_pi_out_0;
  403. }
  404. /*
  405. * Output and update for action system:
  406. * '<S108>/RateInit'
  407. * '<S115>/RateInit'
  408. */
  409. void RateInit(int16_T rtu_initVal, int16_T rtu_target, int16_T rtu_step, int16_T
  410. *rty_s_step, int16_T *rty_High, int16_T *rty_Low)
  411. {
  412. int16_T rtb_Add_b;
  413. /* Sum: '<S109>/Add' */
  414. rtb_Add_b = (int16_T)((rtu_target - rtu_initVal) >> 1);
  415. /* Signum: '<S109>/Sign' incorporates:
  416. * Sum: '<S109>/Add'
  417. */
  418. if (rtb_Add_b < 0) {
  419. rtb_Add_b = -1;
  420. } else {
  421. rtb_Add_b = (int16_T)(rtb_Add_b > 0);
  422. }
  423. /* End of Signum: '<S109>/Sign' */
  424. /* Product: '<S109>/Divide' */
  425. *rty_s_step = (int16_T)(rtu_step * rtb_Add_b);
  426. /* MinMax: '<S109>/Max' */
  427. if (rtu_target > rtu_initVal) {
  428. *rty_High = rtu_target;
  429. } else {
  430. *rty_High = rtu_initVal;
  431. }
  432. /* End of MinMax: '<S109>/Max' */
  433. /* MinMax: '<S109>/Max1' */
  434. if (rtu_initVal < rtu_target) {
  435. *rty_Low = rtu_initVal;
  436. } else {
  437. *rty_Low = rtu_target;
  438. }
  439. /* End of MinMax: '<S109>/Max1' */
  440. }
  441. int16_T rt_sqrt_Us32En6_Ys16En_1bhh77n4(int32_T u)
  442. {
  443. int64_T tmp03_u;
  444. int32_T iBit;
  445. int16_T shiftMask;
  446. int16_T tmp01_y;
  447. int16_T y;
  448. /* Fixed-Point Sqrt Computation by the bisection method. */
  449. if (u > 0) {
  450. y = 0;
  451. shiftMask = 16384;
  452. tmp03_u = (int64_T)u << 4;
  453. for (iBit = 0; iBit < 15; iBit++) {
  454. tmp01_y = (int16_T)(y | shiftMask);
  455. if (tmp01_y * tmp01_y <= tmp03_u) {
  456. y = tmp01_y;
  457. }
  458. shiftMask = (int16_T)((uint32_T)shiftMask >> 1U);
  459. }
  460. } else {
  461. y = 0;
  462. }
  463. return y;
  464. }
  465. int16_T rt_sqrt_Us32En10_Ys16E_7VJYwqF9(int32_T u)
  466. {
  467. int32_T iBit;
  468. int16_T shiftMask;
  469. int16_T tmp01_y;
  470. int16_T y;
  471. /* Fixed-Point Sqrt Computation by the bisection method. */
  472. if (u > 0) {
  473. y = 0;
  474. shiftMask = 16384;
  475. for (iBit = 0; iBit < 15; iBit++) {
  476. tmp01_y = (int16_T)(y | shiftMask);
  477. if (tmp01_y * tmp01_y <= u) {
  478. y = tmp01_y;
  479. }
  480. shiftMask = (int16_T)((uint32_T)shiftMask >> 1U);
  481. }
  482. } else {
  483. y = 0;
  484. }
  485. return y;
  486. }
  487. uint16_T rt_sqrt_Uu16En14_Yu16E_WMwW1mku(uint16_T u)
  488. {
  489. int32_T iBit;
  490. uint32_T tmp03_u;
  491. uint16_T shiftMask;
  492. uint16_T tmp01_y;
  493. uint16_T y;
  494. /* Fixed-Point Sqrt Computation by the bisection method. */
  495. if (u > 0) {
  496. y = 0U;
  497. shiftMask = 32768U;
  498. tmp03_u = (uint32_T)u << 14;
  499. for (iBit = 0; iBit < 16; iBit++) {
  500. tmp01_y = (uint16_T)(y | shiftMask);
  501. if ((uint32_T)tmp01_y * tmp01_y <= tmp03_u) {
  502. y = tmp01_y;
  503. }
  504. shiftMask = (uint16_T)((uint32_T)shiftMask >> 1U);
  505. }
  506. } else {
  507. y = 0U;
  508. }
  509. return y;
  510. }
  511. /* Model step function */
  512. void PMSM_Controller_step(RT_MODEL *const rtM)
  513. {
  514. DW *rtDW = rtM->dwork;
  515. PrevZCX *rtPrevZCX = rtM->prevZCSigState;
  516. ExtU *rtU = (ExtU *) rtM->inputs;
  517. ExtY *rtY = (ExtY *) rtM->outputs;
  518. int64_T tmp_1;
  519. int64_T tmp_2;
  520. uint64_T tmp_3;
  521. int32_T rtb_Divide_idx_0;
  522. int32_T rtb_Divide_idx_1;
  523. int32_T rtb_Gain_b0;
  524. int32_T rtb_Gain_p2;
  525. int32_T rtb_MathFunction2_p;
  526. int32_T rtb_Sum1_f;
  527. int32_T rtb_Switch3;
  528. int32_T rtb_Switch_np;
  529. int32_T tmp;
  530. int32_T tmp_0;
  531. uint32_T qY;
  532. uint32_T rtb_Switch2;
  533. int16_T rtb_TmpSignalConversionAtLow_Pa[2];
  534. int16_T rtb_UnitDelay1_m[2];
  535. int16_T rtb_Divide1_m;
  536. int16_T rtb_Divide3_k;
  537. int16_T rtb_Min;
  538. int16_T rtb_Sum1_a;
  539. int16_T rtb_Sum3_jm;
  540. int16_T rtb_Sum6_k;
  541. int16_T rtb_Sum6_p;
  542. int16_T rtb_Switch_f2_idx_0;
  543. int16_T rtb_Switch_f2_idx_1;
  544. int16_T rtb_r_cos_M1;
  545. uint16_T rtb_BitwiseOperator2;
  546. uint16_T rtb_LogicalOperator3;
  547. int8_T UnitDelay3;
  548. int8_T rtb_Sum2;
  549. int8_T rtb_Sum2_tmp;
  550. uint8_T rtb_Add_gf;
  551. uint8_T rtb_DataTypeConversion_j;
  552. uint8_T rtb_Sum_i;
  553. uint8_T rtb_UnitDelay;
  554. uint8_T rtb_z_ctrlMod;
  555. boolean_T rtb_Equal_k;
  556. boolean_T rtb_LogicalOperator12;
  557. boolean_T rtb_LogicalOperator2_h;
  558. boolean_T rtb_LogicalOperator4_e;
  559. boolean_T rtb_RelationalOperator4_f;
  560. boolean_T rtb_n_commDeacv;
  561. /* Outputs for Atomic SubSystem: '<Root>/PMSM_Controller' */
  562. /* UnitDelay: '<S6>/UnitDelay1' */
  563. rtb_UnitDelay1_m[0] = rtDW->UnitDelay1_DSTATE_f[0];
  564. rtb_UnitDelay1_m[1] = rtDW->UnitDelay1_DSTATE_f[1];
  565. /* S-Function (sfix_bitop): '<S4>/Bitwise Operator2' incorporates:
  566. * Inport: '<Root>/FOC_Flags'
  567. */
  568. rtb_BitwiseOperator2 = (uint16_T)(rtU->FOC_Flags & 1);
  569. /* UnitDelay: '<S37>/UnitDelay' */
  570. rtb_UnitDelay = rtDW->UnitDelay_DSTATE_j;
  571. /* Logic: '<S9>/Edge_Detect' incorporates:
  572. * Delay: '<S9>/Delay'
  573. * Delay: '<S9>/Delay1'
  574. * Delay: '<S9>/Delay2'
  575. * Inport: '<Root>/hall_A'
  576. * Inport: '<Root>/hall_B'
  577. * Inport: '<Root>/hall_C'
  578. */
  579. rtb_Equal_k = (boolean_T)((rtU->hall_A != 0) ^ (rtDW->Delay_DSTATE_d != 0) ^
  580. (rtU->hall_B != 0) ^ (rtDW->Delay1_DSTATE != 0) ^ (rtU->hall_C != 0)) ^
  581. (rtDW->Delay2_DSTATE != 0);
  582. /* Sum: '<S11>/Add' incorporates:
  583. * Gain: '<S11>/Gain'
  584. * Gain: '<S11>/Gain1'
  585. * Inport: '<Root>/hall_A'
  586. * Inport: '<Root>/hall_B'
  587. * Inport: '<Root>/hall_C'
  588. */
  589. rtb_Add_gf = (uint8_T)((uint32_T)(uint8_T)((uint32_T)(uint8_T)(rtU->hall_C <<
  590. 2) + (uint8_T)(rtU->hall_B << 1)) + rtU->hall_A);
  591. /* If: '<S3>/If2' incorporates:
  592. * If: '<S14>/If2'
  593. * Inport: '<S20>/z_counterRawPrev'
  594. * UnitDelay: '<S14>/UnitDelay3'
  595. */
  596. if (rtb_Equal_k) {
  597. /* Outputs for IfAction SubSystem: '<S3>/Direction_Detection' incorporates:
  598. * ActionPort: '<S8>/Action Port'
  599. */
  600. /* UnitDelay: '<S8>/UnitDelay3' */
  601. UnitDelay3 = rtDW->Switch2_i;
  602. /* End of Outputs for SubSystem: '<S3>/Direction_Detection' */
  603. /* Selector: '<S11>/Selector' incorporates:
  604. * Constant: '<S11>/vec_hallToPos'
  605. */
  606. rtb_Sum2_tmp = rtConstP.vec_hallToPos_Value[rtb_Add_gf];
  607. /* Outputs for IfAction SubSystem: '<S3>/Direction_Detection' incorporates:
  608. * ActionPort: '<S8>/Action Port'
  609. */
  610. /* Sum: '<S8>/Sum2' incorporates:
  611. * Constant: '<S11>/vec_hallToPos'
  612. * Selector: '<S11>/Selector'
  613. * UnitDelay: '<S8>/UnitDelay2'
  614. */
  615. rtb_Sum2 = (int8_T)(rtb_Sum2_tmp - rtDW->UnitDelay2_DSTATE_j);
  616. /* Switch: '<S8>/Switch2' incorporates:
  617. * Constant: '<S8>/Constant20'
  618. * Constant: '<S8>/Constant8'
  619. * Logic: '<S8>/Logical Operator3'
  620. * RelationalOperator: '<S8>/Relational Operator1'
  621. * RelationalOperator: '<S8>/Relational Operator6'
  622. */
  623. if ((rtb_Sum2 == 1) || (rtb_Sum2 == -5)) {
  624. /* Switch: '<S8>/Switch2' incorporates:
  625. * Constant: '<S8>/Constant24'
  626. */
  627. rtDW->Switch2_i = 1;
  628. } else {
  629. /* Switch: '<S8>/Switch2' incorporates:
  630. * Constant: '<S8>/Constant23'
  631. */
  632. rtDW->Switch2_i = -1;
  633. }
  634. /* End of Switch: '<S8>/Switch2' */
  635. /* Update for UnitDelay: '<S8>/UnitDelay2' */
  636. rtDW->UnitDelay2_DSTATE_j = rtb_Sum2_tmp;
  637. /* End of Outputs for SubSystem: '<S3>/Direction_Detection' */
  638. /* Outputs for IfAction SubSystem: '<S14>/Raw_Motor_Speed_Estimation' incorporates:
  639. * ActionPort: '<S20>/Action Port'
  640. */
  641. /* RelationalOperator: '<S20>/Relational Operator4' */
  642. rtb_RelationalOperator4_f = (rtDW->Switch2_i != UnitDelay3);
  643. rtDW->z_counterRawPrev = rtDW->UnitDelay3_DSTATE;
  644. /* Switch: '<S20>/Switch3' incorporates:
  645. * Constant: '<S20>/Constant4'
  646. * Inport: '<S20>/z_counterRawPrev'
  647. * Logic: '<S20>/Logical Operator1'
  648. * Switch: '<S20>/Switch2'
  649. * UnitDelay: '<S14>/UnitDelay3'
  650. * UnitDelay: '<S20>/UnitDelay1'
  651. */
  652. if (rtb_RelationalOperator4_f && rtDW->UnitDelay1_DSTATE_iv) {
  653. rtb_Switch3 = 0;
  654. } else {
  655. if (rtb_RelationalOperator4_f) {
  656. /* Switch: '<S20>/Switch2' incorporates:
  657. * UnitDelay: '<S14>/UnitDelay4'
  658. */
  659. rtb_Switch2 = rtDW->UnitDelay4_DSTATE;
  660. } else {
  661. /* Sum: '<S20>/Sum13' incorporates:
  662. * Switch: '<S20>/Switch2'
  663. * UnitDelay: '<S20>/UnitDelay2'
  664. * UnitDelay: '<S20>/UnitDelay3'
  665. * UnitDelay: '<S20>/UnitDelay5'
  666. */
  667. tmp_3 = (((uint64_T)rtDW->UnitDelay2_DSTATE + rtDW->UnitDelay3_DSTATE_l)
  668. + rtDW->UnitDelay5_DSTATE) + rtDW->z_counterRawPrev;
  669. if (tmp_3 > 4294967295ULL) {
  670. tmp_3 = 4294967295ULL;
  671. }
  672. /* Product: '<S20>/Divide13' incorporates:
  673. * Constant: '<S20>/cf_speedCoef'
  674. * Constant: '<S20>/cf_speedCoef1'
  675. * Gain: '<S20>/g_Ha'
  676. * Product: '<S20>/Divide'
  677. * Sum: '<S20>/Sum13'
  678. * Switch: '<S20>/Switch2'
  679. */
  680. tmp_3 = ((uint64_T)((10000000U / rtP.n_polePairs) << 2) << 4) /
  681. (uint32_T)tmp_3;
  682. if (tmp_3 > 4294967295ULL) {
  683. tmp_3 = 4294967295ULL;
  684. }
  685. /* Switch: '<S20>/Switch2' incorporates:
  686. * Product: '<S20>/Divide13'
  687. */
  688. rtb_Switch2 = (uint32_T)tmp_3;
  689. }
  690. rtb_Switch3 = (int32_T)rtb_Switch2;
  691. }
  692. /* End of Switch: '<S20>/Switch3' */
  693. /* Product: '<S20>/Divide11' incorporates:
  694. * Switch: '<S20>/Switch3'
  695. */
  696. rtDW->Divide11 = rtb_Switch3 * rtDW->Switch2_i;
  697. /* Update for UnitDelay: '<S20>/UnitDelay1' */
  698. rtDW->UnitDelay1_DSTATE_iv = rtb_RelationalOperator4_f;
  699. /* Update for UnitDelay: '<S20>/UnitDelay2' incorporates:
  700. * UnitDelay: '<S20>/UnitDelay3'
  701. */
  702. rtDW->UnitDelay2_DSTATE = rtDW->UnitDelay3_DSTATE_l;
  703. /* Update for UnitDelay: '<S20>/UnitDelay3' incorporates:
  704. * UnitDelay: '<S20>/UnitDelay5'
  705. */
  706. rtDW->UnitDelay3_DSTATE_l = rtDW->UnitDelay5_DSTATE;
  707. /* Update for UnitDelay: '<S20>/UnitDelay5' */
  708. rtDW->UnitDelay5_DSTATE = rtDW->z_counterRawPrev;
  709. /* End of Outputs for SubSystem: '<S14>/Raw_Motor_Speed_Estimation' */
  710. }
  711. /* End of If: '<S3>/If2' */
  712. /* Switch: '<S14>/Switch2' incorporates:
  713. * Constant: '<S14>/Constant4'
  714. * Constant: '<S14>/z_maxCntRst'
  715. * Gain: '<S14>/Gain'
  716. * Inport: '<Root>/us_Count'
  717. * Product: '<S20>/Divide11'
  718. * RelationalOperator: '<S14>/Relational Operator2'
  719. */
  720. if (rtU->us_Count >= (rtP.n_hall_count_ps << 1)) {
  721. rtb_Switch3 = 0;
  722. } else {
  723. rtb_Switch3 = rtDW->Divide11;
  724. }
  725. /* End of Switch: '<S14>/Switch2' */
  726. /* Abs: '<S14>/Abs5' incorporates:
  727. * Switch: '<S14>/Switch2'
  728. */
  729. if (rtb_Switch3 < 0) {
  730. rtb_Switch2 = (uint32_T)-rtb_Switch3;
  731. } else {
  732. rtb_Switch2 = (uint32_T)rtb_Switch3;
  733. }
  734. /* End of Abs: '<S14>/Abs5' */
  735. /* If: '<S14>/If1' */
  736. if (rtb_Equal_k) {
  737. /* Outputs for IfAction SubSystem: '<S14>/AdvCtrlDetect' incorporates:
  738. * ActionPort: '<S19>/Action Port'
  739. */
  740. /* Relay: '<S19>/n_commDeacv' incorporates:
  741. * Abs: '<S14>/Abs5'
  742. */
  743. rtDW->n_commDeacv_Mode = ((rtb_Switch2 >= 480U) || ((rtb_Switch2 > 240U) &&
  744. rtDW->n_commDeacv_Mode));
  745. /* RelationalOperator: '<S21>/Compare' incorporates:
  746. * Constant: '<S21>/Constant'
  747. * Relay: '<S19>/n_commDeacv'
  748. * Sum: '<S19>/Sum13'
  749. * UnitDelay: '<S19>/UnitDelay2'
  750. * UnitDelay: '<S19>/UnitDelay3'
  751. * UnitDelay: '<S19>/UnitDelay5'
  752. */
  753. rtDW->Compare = ((uint16_T)((uint32_T)(uint16_T)((uint32_T)(uint16_T)
  754. ((uint32_T)rtDW->UnitDelay2_DSTATE_f + rtDW->UnitDelay3_DSTATE_lh) +
  755. rtDW->UnitDelay5_DSTATE_f) + rtDW->n_commDeacv_Mode) >= 4);
  756. /* Update for UnitDelay: '<S19>/UnitDelay2' incorporates:
  757. * UnitDelay: '<S19>/UnitDelay3'
  758. */
  759. rtDW->UnitDelay2_DSTATE_f = rtDW->UnitDelay3_DSTATE_lh;
  760. /* Update for UnitDelay: '<S19>/UnitDelay3' incorporates:
  761. * UnitDelay: '<S19>/UnitDelay5'
  762. */
  763. rtDW->UnitDelay3_DSTATE_lh = rtDW->UnitDelay5_DSTATE_f;
  764. /* Update for UnitDelay: '<S19>/UnitDelay5' incorporates:
  765. * Logic: '<S19>/Logical Operator3'
  766. * Relay: '<S19>/n_commDeacv'
  767. */
  768. rtDW->UnitDelay5_DSTATE_f = rtDW->n_commDeacv_Mode;
  769. /* End of Outputs for SubSystem: '<S14>/AdvCtrlDetect' */
  770. }
  771. /* End of If: '<S14>/If1' */
  772. /* Switch: '<S37>/Switch3' incorporates:
  773. * Abs: '<S14>/Abs5'
  774. * Abs: '<S37>/Abs4'
  775. * Constant: '<S37>/CTRL_COMM4'
  776. * Inport: '<Root>/b_motEna'
  777. * Logic: '<S37>/Logical Operator1'
  778. * RelationalOperator: '<S14>/Relational Operator9'
  779. * RelationalOperator: '<S37>/Relational Operator7'
  780. * S-Function (sfix_bitop): '<S37>/Bitwise Operator1'
  781. * UnitDelay: '<S6>/UnitDelay1'
  782. */
  783. if ((rtb_UnitDelay & 4U) != 0U) {
  784. rtb_Equal_k = true;
  785. } else {
  786. if (rtDW->UnitDelay1_DSTATE_f[1] < 0) {
  787. /* Abs: '<S37>/Abs4' incorporates:
  788. * UnitDelay: '<S6>/UnitDelay1'
  789. */
  790. rtb_Switch_f2_idx_1 = (int16_T)-rtDW->UnitDelay1_DSTATE_f[1];
  791. } else {
  792. /* Abs: '<S37>/Abs4' incorporates:
  793. * UnitDelay: '<S6>/UnitDelay1'
  794. */
  795. rtb_Switch_f2_idx_1 = rtDW->UnitDelay1_DSTATE_f[1];
  796. }
  797. rtb_Equal_k = (rtU->b_motEna && (rtb_Switch2 < 48U) && (rtb_Switch_f2_idx_1 >
  798. 9920));
  799. }
  800. /* End of Switch: '<S37>/Switch3' */
  801. /* Sum: '<S37>/Sum' incorporates:
  802. * Constant: '<S37>/CTRL_COMM'
  803. * Constant: '<S37>/CTRL_COMM1'
  804. * DataTypeConversion: '<S37>/Data Type Conversion3'
  805. * Gain: '<S37>/g_Hb'
  806. * Gain: '<S37>/g_Hb1'
  807. * RelationalOperator: '<S37>/Relational Operator1'
  808. * RelationalOperator: '<S37>/Relational Operator3'
  809. */
  810. rtb_Sum_i = (uint8_T)(((uint32_T)((rtb_Add_gf == 7) << 1) + (rtb_Add_gf == 0))
  811. + (rtb_Equal_k << 2));
  812. /* RelationalOperator: '<S37>/Relational Operator2' incorporates:
  813. * Constant: '<S37>/CTRL_COMM2'
  814. */
  815. rtb_RelationalOperator4_f = (rtb_Sum_i != 0);
  816. /* RelationalOperator: '<S42>/Relational Operator' incorporates:
  817. * UnitDelay: '<S42>/UnitDelay'
  818. */
  819. rtb_n_commDeacv = (rtb_RelationalOperator4_f != rtDW->UnitDelay_DSTATE_nx);
  820. /* If: '<S38>/If2' incorporates:
  821. * Inport: '<S40>/yPrev'
  822. * Logic: '<S38>/Logical Operator1'
  823. * Logic: '<S38>/Logical Operator2'
  824. * Logic: '<S38>/Logical Operator3'
  825. * Logic: '<S38>/Logical Operator4'
  826. * UnitDelay: '<S38>/UnitDelay'
  827. */
  828. if (rtb_RelationalOperator4_f && (!rtDW->UnitDelay_DSTATE_k)) {
  829. /* Outputs for IfAction SubSystem: '<S38>/Qualification' incorporates:
  830. * ActionPort: '<S43>/Action Port'
  831. */
  832. /* Switch: '<S47>/Switch1' incorporates:
  833. * Constant: '<S47>/Constant23'
  834. * UnitDelay: '<S47>/UnitDelay'
  835. */
  836. if (rtb_n_commDeacv) {
  837. rtb_LogicalOperator3 = 0U;
  838. } else {
  839. rtb_LogicalOperator3 = rtDW->UnitDelay_DSTATE_p;
  840. }
  841. /* End of Switch: '<S47>/Switch1' */
  842. /* Switch: '<S43>/Switch2' incorporates:
  843. * Constant: '<S37>/t_errQual'
  844. * Constant: '<S43>/Constant6'
  845. * RelationalOperator: '<S43>/Relational Operator2'
  846. * Sum: '<S46>/Sum1'
  847. */
  848. rtb_n_commDeacv = (((uint16_T)(rtb_LogicalOperator3 + 1U) > 1600) ||
  849. rtDW->UnitDelay_DSTATE_k);
  850. /* MinMax: '<S46>/MinMax' incorporates:
  851. * Constant: '<S43>/Constant6'
  852. * Sum: '<S46>/Sum1'
  853. */
  854. if ((uint16_T)(rtb_LogicalOperator3 + 1U) < 1600) {
  855. /* Update for UnitDelay: '<S47>/UnitDelay' */
  856. rtDW->UnitDelay_DSTATE_p = (uint16_T)(rtb_LogicalOperator3 + 1U);
  857. } else {
  858. /* Update for UnitDelay: '<S47>/UnitDelay' */
  859. rtDW->UnitDelay_DSTATE_p = 1600U;
  860. }
  861. /* End of MinMax: '<S46>/MinMax' */
  862. /* End of Outputs for SubSystem: '<S38>/Qualification' */
  863. } else if ((!rtb_RelationalOperator4_f) && rtDW->UnitDelay_DSTATE_k) {
  864. /* Outputs for IfAction SubSystem: '<S38>/Dequalification' incorporates:
  865. * ActionPort: '<S41>/Action Port'
  866. */
  867. /* Switch: '<S45>/Switch1' incorporates:
  868. * Constant: '<S45>/Constant23'
  869. * UnitDelay: '<S45>/UnitDelay'
  870. */
  871. if (rtb_n_commDeacv) {
  872. rtb_LogicalOperator3 = 0U;
  873. } else {
  874. rtb_LogicalOperator3 = rtDW->UnitDelay_DSTATE_f;
  875. }
  876. /* End of Switch: '<S45>/Switch1' */
  877. /* Switch: '<S41>/Switch2' incorporates:
  878. * Constant: '<S37>/t_errDequal'
  879. * Constant: '<S41>/Constant6'
  880. * RelationalOperator: '<S41>/Relational Operator2'
  881. * Sum: '<S44>/Sum1'
  882. */
  883. rtb_n_commDeacv = (((uint16_T)(rtb_LogicalOperator3 + 1U) <= 12000) &&
  884. rtDW->UnitDelay_DSTATE_k);
  885. /* MinMax: '<S44>/MinMax' incorporates:
  886. * Constant: '<S41>/Constant6'
  887. * Sum: '<S44>/Sum1'
  888. */
  889. if ((uint16_T)(rtb_LogicalOperator3 + 1U) < 12000) {
  890. /* Update for UnitDelay: '<S45>/UnitDelay' */
  891. rtDW->UnitDelay_DSTATE_f = (uint16_T)(rtb_LogicalOperator3 + 1U);
  892. } else {
  893. /* Update for UnitDelay: '<S45>/UnitDelay' */
  894. rtDW->UnitDelay_DSTATE_f = 12000U;
  895. }
  896. /* End of MinMax: '<S44>/MinMax' */
  897. /* End of Outputs for SubSystem: '<S38>/Dequalification' */
  898. } else {
  899. /* Outputs for IfAction SubSystem: '<S38>/Default' incorporates:
  900. * ActionPort: '<S40>/Action Port'
  901. */
  902. rtb_n_commDeacv = rtDW->UnitDelay_DSTATE_k;
  903. /* End of Outputs for SubSystem: '<S38>/Default' */
  904. }
  905. /* End of If: '<S38>/If2' */
  906. /* Logic: '<S25>/Logical Operator12' incorporates:
  907. * Inport: '<Root>/b_motEna'
  908. * Logic: '<S25>/Logical Operator7'
  909. */
  910. rtb_LogicalOperator12 = ((!rtb_n_commDeacv) && rtU->b_motEna);
  911. /* Logic: '<S25>/Logical Operator4' incorporates:
  912. * Constant: '<S25>/constant8'
  913. * Inport: '<Root>/n_ctrlModReq'
  914. * Logic: '<S25>/Logical Operator11'
  915. * Logic: '<S25>/Logical Operator8'
  916. * RelationalOperator: '<S25>/Relational Operator10'
  917. */
  918. rtb_LogicalOperator4_e = ((rtb_BitwiseOperator2 != 0) || (!rtDW->Compare) || (
  919. !rtb_LogicalOperator12) || (rtU->n_ctrlModReq == 0));
  920. /* Abs: '<S4>/Abs2' incorporates:
  921. * Switch: '<S14>/Switch2'
  922. */
  923. if (rtb_Switch3 < 0) {
  924. rtb_LogicalOperator3 = (uint16_T)((uint32_T)-rtb_Switch3 >> 4);
  925. } else {
  926. rtb_LogicalOperator3 = (uint16_T)((uint32_T)rtb_Switch3 >> 4);
  927. }
  928. /* End of Abs: '<S4>/Abs2' */
  929. /* Relay: '<S25>/n_SpeedCtrl' */
  930. rtDW->n_SpeedCtrl_Mode = ((rtb_LogicalOperator3 >= 300) ||
  931. ((rtb_LogicalOperator3 > 200) && rtDW->n_SpeedCtrl_Mode));
  932. /* Logic: '<S25>/Logical Operator10' incorporates:
  933. * Inport: '<Root>/b_cruiseEna'
  934. * Relay: '<S25>/n_SpeedCtrl'
  935. */
  936. rtb_Equal_k = (rtDW->n_SpeedCtrl_Mode && rtU->b_cruiseEna);
  937. /* Logic: '<S25>/Logical Operator2' incorporates:
  938. * Constant: '<S25>/constant'
  939. * Inport: '<Root>/n_ctrlModReq'
  940. * Logic: '<S25>/Logical Operator5'
  941. * RelationalOperator: '<S25>/Relational Operator4'
  942. */
  943. rtb_LogicalOperator2_h = ((rtU->n_ctrlModReq == 2) && (!rtb_Equal_k));
  944. /* Logic: '<S25>/Logical Operator1' incorporates:
  945. * Constant: '<S25>/constant1'
  946. * Inport: '<Root>/n_ctrlModReq'
  947. * RelationalOperator: '<S25>/Relational Operator1'
  948. */
  949. rtb_Equal_k = ((rtU->n_ctrlModReq == 1) || rtb_Equal_k);
  950. /* Chart: '<S4>/Control_Mode_Manager' incorporates:
  951. * Logic: '<S25>/Logical Operator3'
  952. * Logic: '<S25>/Logical Operator6'
  953. * Logic: '<S25>/Logical Operator9'
  954. */
  955. if (rtDW->is_active_c5_PMSM_Controller == 0U) {
  956. rtDW->is_active_c5_PMSM_Controller = 1U;
  957. rtDW->is_c5_PMSM_Controller = IN_OPEN;
  958. rtb_z_ctrlMod = OPEN_MODE;
  959. } else if (rtDW->is_c5_PMSM_Controller == 1) {
  960. if (rtb_LogicalOperator4_e) {
  961. rtDW->is_ACTIVE = IN_NO_ACTIVE_CHILD;
  962. rtDW->is_c5_PMSM_Controller = IN_OPEN;
  963. rtb_z_ctrlMod = OPEN_MODE;
  964. } else if (rtDW->is_ACTIVE == 1) {
  965. rtb_z_ctrlMod = SPD_MODE;
  966. if (!rtb_Equal_k) {
  967. if (rtb_LogicalOperator2_h) {
  968. rtDW->is_ACTIVE = IN_TORQUE_MODE;
  969. rtb_z_ctrlMod = TRQ_MODE;
  970. } else {
  971. rtDW->is_ACTIVE = IN_SPEED_MODE;
  972. }
  973. }
  974. } else {
  975. /* case IN_TORQUE_MODE: */
  976. rtb_z_ctrlMod = TRQ_MODE;
  977. if (!rtb_LogicalOperator2_h) {
  978. rtDW->is_ACTIVE = IN_SPEED_MODE;
  979. rtb_z_ctrlMod = SPD_MODE;
  980. }
  981. }
  982. } else {
  983. /* case IN_OPEN: */
  984. rtb_z_ctrlMod = OPEN_MODE;
  985. if ((!rtb_LogicalOperator4_e) && (rtb_LogicalOperator2_h || rtb_Equal_k)) {
  986. rtDW->is_c5_PMSM_Controller = IN_ACTIVE;
  987. if (rtb_LogicalOperator2_h) {
  988. rtDW->is_ACTIVE = IN_TORQUE_MODE;
  989. rtb_z_ctrlMod = TRQ_MODE;
  990. } else {
  991. rtDW->is_ACTIVE = IN_SPEED_MODE;
  992. rtb_z_ctrlMod = SPD_MODE;
  993. }
  994. }
  995. }
  996. /* End of Chart: '<S4>/Control_Mode_Manager' */
  997. /* Product: '<S52>/Divide' incorporates:
  998. * Constant: '<S52>/Constant'
  999. * Inport: '<Root>/adc_Pha'
  1000. * Inport: '<Root>/adc_Phb'
  1001. */
  1002. rtb_Divide_idx_0 = rtU->adc_Pha * rtP.f_adc_curr_ceof;
  1003. rtb_Divide_idx_1 = rtU->adc_Phb * rtP.f_adc_curr_ceof;
  1004. /* Sum: '<S48>/Add' */
  1005. tmp_2 = (int64_T)rtb_Divide_idx_0 + rtb_Divide_idx_1;
  1006. if (tmp_2 > 2147483647LL) {
  1007. tmp_2 = 2147483647LL;
  1008. } else {
  1009. if (tmp_2 < -2147483648LL) {
  1010. tmp_2 = -2147483648LL;
  1011. }
  1012. }
  1013. /* Sum: '<S48>/Add1' incorporates:
  1014. * Sum: '<S48>/Add'
  1015. */
  1016. tmp_2 = -(int64_T)(int32_T)tmp_2 >> 9;
  1017. if (tmp_2 > 32767LL) {
  1018. tmp_2 = 32767LL;
  1019. } else {
  1020. if (tmp_2 < -32768LL) {
  1021. tmp_2 = -32768LL;
  1022. }
  1023. }
  1024. /* Gain: '<S55>/Gain' */
  1025. rtb_Divide_idx_0 >>= 8;
  1026. if (rtb_Divide_idx_0 > 32767) {
  1027. rtb_Divide_idx_0 = 32767;
  1028. } else {
  1029. if (rtb_Divide_idx_0 < -32768) {
  1030. rtb_Divide_idx_0 = -32768;
  1031. }
  1032. }
  1033. /* Sum: '<S55>/Add3' incorporates:
  1034. * Sum: '<S48>/Add1'
  1035. * Sum: '<S55>/Add2'
  1036. */
  1037. tmp_2 = (int64_T)(int16_T)tmp_2 << 9;
  1038. tmp_1 = (tmp_2 + rtb_Divide_idx_1) >> 8;
  1039. if (tmp_1 > 32767LL) {
  1040. tmp_1 = 32767LL;
  1041. } else {
  1042. if (tmp_1 < -32768LL) {
  1043. tmp_1 = -32768LL;
  1044. }
  1045. }
  1046. /* Sum: '<S55>/Add' incorporates:
  1047. * Gain: '<S55>/Gain'
  1048. * Sum: '<S55>/Add3'
  1049. */
  1050. rtb_Divide_idx_0 = ((rtb_Divide_idx_0 << 1) - (int16_T)tmp_1) >> 1;
  1051. if (rtb_Divide_idx_0 > 32767) {
  1052. rtb_Divide_idx_0 = 32767;
  1053. } else {
  1054. if (rtb_Divide_idx_0 < -32768) {
  1055. rtb_Divide_idx_0 = -32768;
  1056. }
  1057. }
  1058. /* Gain: '<S55>/Gain1' incorporates:
  1059. * Product: '<S57>/Divide1'
  1060. * Sum: '<S55>/Add'
  1061. */
  1062. rtb_Divide1_m = (int16_T)((21845 * rtb_Divide_idx_0) >> 16);
  1063. /* Switch: '<S10>/Switch3' incorporates:
  1064. * Constant: '<S10>/Constant16'
  1065. * Constant: '<S10>/Constant2'
  1066. * Constant: '<S11>/vec_hallToPos'
  1067. * RelationalOperator: '<S10>/Relational Operator7'
  1068. * Selector: '<S11>/Selector'
  1069. * Sum: '<S10>/Sum1'
  1070. */
  1071. if (rtDW->Switch2_i == 1) {
  1072. rtb_Sum2 = rtConstP.vec_hallToPos_Value[rtb_Add_gf];
  1073. } else {
  1074. rtb_Sum2 = (int8_T)(rtConstP.vec_hallToPos_Value[rtb_Add_gf] + 1);
  1075. }
  1076. /* End of Switch: '<S10>/Switch3' */
  1077. /* MinMax: '<S10>/MinMax' incorporates:
  1078. * Inport: '<Root>/us_Count'
  1079. */
  1080. if (rtU->us_Count < rtDW->z_counterRawPrev) {
  1081. qY = rtU->us_Count;
  1082. } else {
  1083. qY = rtDW->z_counterRawPrev;
  1084. }
  1085. /* End of MinMax: '<S10>/MinMax' */
  1086. /* Sum: '<S10>/Sum3' incorporates:
  1087. * Product: '<S10>/Divide1'
  1088. * Product: '<S10>/Divide3'
  1089. */
  1090. rtb_Sum3_jm = (int16_T)(((int16_T)((int16_T)(((uint64_T)qY << 14) /
  1091. rtDW->z_counterRawPrev) * rtDW->Switch2_i) + (rtb_Sum2 << 14)) >> 2);
  1092. /* MinMax: '<S10>/MinMax1' incorporates:
  1093. * Constant: '<S10>/Constant1'
  1094. * Sum: '<S10>/Sum3'
  1095. * Switch: '<S10>/Switch2'
  1096. */
  1097. if (rtb_Sum3_jm <= 0) {
  1098. rtb_Sum3_jm = 0;
  1099. }
  1100. /* End of MinMax: '<S10>/MinMax1' */
  1101. /* Sum: '<S15>/Add2' incorporates:
  1102. * Constant: '<S15>/Constant2'
  1103. * Product: '<S10>/Divide2'
  1104. */
  1105. rtb_Sum3_jm = (int16_T)((((15 * rtb_Sum3_jm) >> 4) + (rtP.i_hall_offset << 2))
  1106. >> 2);
  1107. /* DataTypeConversion: '<S15>/Data Type Conversion' incorporates:
  1108. * Sum: '<S15>/Add2'
  1109. */
  1110. rtb_r_cos_M1 = (int16_T)(rtb_Sum3_jm >> 4);
  1111. /* If: '<S15>/If' incorporates:
  1112. * Constant: '<S15>/Constant1'
  1113. * Constant: '<S15>/Constant3'
  1114. * Inport: '<S16>/In1'
  1115. * Inport: '<S18>/In1'
  1116. * Merge: '<S15>/Merge'
  1117. * Sum: '<S15>/Add'
  1118. * Sum: '<S15>/Add1'
  1119. * Sum: '<S15>/Add2'
  1120. */
  1121. if (rtb_r_cos_M1 >= 360) {
  1122. /* Outputs for IfAction SubSystem: '<S15>/If Action Subsystem' incorporates:
  1123. * ActionPort: '<S16>/Action Port'
  1124. */
  1125. rtb_Sum3_jm = (int16_T)(rtb_Sum3_jm - 5760);
  1126. /* End of Outputs for SubSystem: '<S15>/If Action Subsystem' */
  1127. } else {
  1128. if (rtb_r_cos_M1 < 0) {
  1129. /* Outputs for IfAction SubSystem: '<S15>/If Action Subsystem2' incorporates:
  1130. * ActionPort: '<S18>/Action Port'
  1131. */
  1132. rtb_Sum3_jm = (int16_T)(rtb_Sum3_jm + 5760);
  1133. /* End of Outputs for SubSystem: '<S15>/If Action Subsystem2' */
  1134. }
  1135. }
  1136. /* End of If: '<S15>/If' */
  1137. /* If: '<S3>/If' incorporates:
  1138. * Inport: '<Root>/FOC_Flags'
  1139. */
  1140. if ((rtU->FOC_Flags == 0) || (rtU->FOC_Flags == 2)) {
  1141. /* Outputs for IfAction SubSystem: '<S3>/If Action Subsystem' incorporates:
  1142. * ActionPort: '<S12>/Action Port'
  1143. */
  1144. /* Merge: '<S3>/Merge' incorporates:
  1145. * Inport: '<S12>/In1'
  1146. * Merge: '<S15>/Merge'
  1147. */
  1148. rtDW->Merge_i = rtb_Sum3_jm;
  1149. /* End of Outputs for SubSystem: '<S3>/If Action Subsystem' */
  1150. } else {
  1151. if (rtU->FOC_Flags == 1) {
  1152. /* Outputs for IfAction SubSystem: '<S3>/If Action Subsystem1' incorporates:
  1153. * ActionPort: '<S13>/Action Port'
  1154. */
  1155. /* Merge: '<S3>/Merge' incorporates:
  1156. * Inport: '<Root>/theta_Open'
  1157. * Inport: '<S13>/In1'
  1158. */
  1159. rtDW->Merge_i = rtU->theta_Open;
  1160. /* End of Outputs for SubSystem: '<S3>/If Action Subsystem1' */
  1161. }
  1162. }
  1163. /* End of If: '<S3>/If' */
  1164. /* PreLookup: '<S58>/a_elecAngle_XA' incorporates:
  1165. * Merge: '<S3>/Merge'
  1166. */
  1167. rtb_LogicalOperator3 = plook_u16s16_evencka(rtDW->Merge_i, 0, 16U, 360U);
  1168. /* Sum: '<S55>/Add2' */
  1169. tmp_2 = (rtb_Divide_idx_1 - tmp_2) >> 9;
  1170. if (tmp_2 > 32767LL) {
  1171. tmp_2 = 32767LL;
  1172. } else {
  1173. if (tmp_2 < -32768LL) {
  1174. tmp_2 = -32768LL;
  1175. }
  1176. }
  1177. /* Gain: '<S55>/Gain2' incorporates:
  1178. * Sum: '<S55>/Add2'
  1179. * Sum: '<S57>/Sum6'
  1180. */
  1181. rtb_Sum6_p = (int16_T)((18919 * (int16_T)tmp_2) >> 15);
  1182. /* Sum: '<S57>/Sum1' incorporates:
  1183. * Interpolation_n-D: '<S58>/r_cos_M1'
  1184. * Interpolation_n-D: '<S58>/r_sin_M1'
  1185. * Product: '<S57>/Divide1'
  1186. * Product: '<S57>/Divide2'
  1187. * Product: '<S57>/Divide3'
  1188. * Sum: '<S57>/Sum6'
  1189. */
  1190. rtb_Divide_idx_0 = ((rtb_Divide1_m * rtConstP.pooled9[rtb_LogicalOperator3]) >>
  1191. 14) + (int16_T)((rtb_Sum6_p *
  1192. rtConstP.pooled8[rtb_LogicalOperator3]) >> 14);
  1193. if (rtb_Divide_idx_0 > 32767) {
  1194. rtb_Divide_idx_0 = 32767;
  1195. } else {
  1196. if (rtb_Divide_idx_0 < -32768) {
  1197. rtb_Divide_idx_0 = -32768;
  1198. }
  1199. }
  1200. /* SignalConversion generated from: '<S48>/Low_Pass_Filter' incorporates:
  1201. * Sum: '<S57>/Sum1'
  1202. */
  1203. rtb_TmpSignalConversionAtLow_Pa[0] = (int16_T)rtb_Divide_idx_0;
  1204. /* Sum: '<S57>/Sum6' incorporates:
  1205. * Interpolation_n-D: '<S58>/r_cos_M1'
  1206. * Interpolation_n-D: '<S58>/r_sin_M1'
  1207. * Product: '<S57>/Divide1'
  1208. * Product: '<S57>/Divide4'
  1209. */
  1210. rtb_Divide_idx_0 = (int16_T)((rtb_Sum6_p *
  1211. rtConstP.pooled9[rtb_LogicalOperator3]) >> 14) - ((rtb_Divide1_m *
  1212. rtConstP.pooled8[rtb_LogicalOperator3]) >> 14);
  1213. if (rtb_Divide_idx_0 > 32767) {
  1214. rtb_Divide_idx_0 = 32767;
  1215. } else {
  1216. if (rtb_Divide_idx_0 < -32768) {
  1217. rtb_Divide_idx_0 = -32768;
  1218. }
  1219. }
  1220. /* SignalConversion generated from: '<S48>/Low_Pass_Filter' incorporates:
  1221. * Sum: '<S57>/Sum6'
  1222. */
  1223. rtb_TmpSignalConversionAtLow_Pa[1] = (int16_T)rtb_Divide_idx_0;
  1224. /* Outputs for Atomic SubSystem: '<S48>/Low_Pass_Filter' */
  1225. /* Constant: '<S48>/Constant' incorporates:
  1226. * Outport: '<Root>/f_Idq'
  1227. */
  1228. Low_Pass_Filter(rtb_TmpSignalConversionAtLow_Pa, rtP.f_lpf_idq, rtY->f_Idq,
  1229. &rtDW->Low_Pass_Filter_d);
  1230. /* End of Outputs for SubSystem: '<S48>/Low_Pass_Filter' */
  1231. /* Switch: '<S24>/Switch' incorporates:
  1232. * Constant: '<S24>/Constant3'
  1233. * Inport: '<Root>/spd_Target'
  1234. */
  1235. if (rtU->spd_Target > 240) {
  1236. /* Switch: '<S24>/Switch1' incorporates:
  1237. * Constant: '<S24>/Constant1'
  1238. * DataTypeConversion: '<S24>/Data Type Conversion'
  1239. * Switch: '<S24>/Switch'
  1240. */
  1241. if (rtb_LogicalOperator12) {
  1242. rtb_Switch_np = rtU->spd_Target;
  1243. } else {
  1244. rtb_Switch_np = 0;
  1245. }
  1246. /* End of Switch: '<S24>/Switch1' */
  1247. } else {
  1248. rtb_Switch_np = 0;
  1249. }
  1250. /* End of Switch: '<S24>/Switch' */
  1251. /* Switch: '<S24>/Switch3' incorporates:
  1252. * Constant: '<S24>/Constant4'
  1253. * DataTypeConversion: '<S24>/Data Type Conversion2'
  1254. * Inport: '<Root>/vdq_Open'
  1255. */
  1256. if (rtb_LogicalOperator12) {
  1257. rtb_Sum6_p = rtU->vdq_Open[1];
  1258. } else {
  1259. rtb_Sum6_p = 0;
  1260. }
  1261. /* End of Switch: '<S24>/Switch3' */
  1262. /* Sum: '<S7>/Sum3' incorporates:
  1263. * UnitDelay: '<S7>/UnitDelay1'
  1264. */
  1265. qY = rtDW->UnitDelay1_DSTATE + /*MW:OvSatOk*/ 1U;
  1266. if (rtDW->UnitDelay1_DSTATE + 1U < 1U) {
  1267. qY = MAX_uint32_T;
  1268. }
  1269. /* RelationalOperator: '<S2>/Equal' incorporates:
  1270. * Constant: '<S2>/Constant1'
  1271. * Math: '<S2>/Rem'
  1272. * Sum: '<S7>/Sum3'
  1273. */
  1274. rtb_Equal_k = (qY % 40U == 0U);
  1275. /* If: '<S26>/If' incorporates:
  1276. * DataTypeConversion: '<S26>/Data Type Conversion1'
  1277. * DataTypeConversion: '<S26>/Data Type Conversion2'
  1278. * Inport: '<Root>/idq_Target'
  1279. * Inport: '<S27>/vq_in'
  1280. * Inport: '<S30>/r_currTgt'
  1281. * Switch: '<S24>/Switch3'
  1282. */
  1283. if (rtb_BitwiseOperator2 == 1) {
  1284. /* Switch: '<S24>/Switch2' incorporates:
  1285. * Constant: '<S24>/Constant2'
  1286. * DataTypeConversion: '<S24>/Data Type Conversion1'
  1287. * Inport: '<Root>/vdq_Open'
  1288. * Inport: '<S27>/vd_in'
  1289. */
  1290. if (rtb_LogicalOperator12) {
  1291. /* Outputs for IfAction SubSystem: '<S26>/If Action Subsystem' incorporates:
  1292. * ActionPort: '<S27>/Action Port'
  1293. */
  1294. rtDW->Merge[0] = rtU->vdq_Open[0];
  1295. /* End of Outputs for SubSystem: '<S26>/If Action Subsystem' */
  1296. } else {
  1297. /* Outputs for IfAction SubSystem: '<S26>/If Action Subsystem' incorporates:
  1298. * ActionPort: '<S27>/Action Port'
  1299. */
  1300. rtDW->Merge[0] = 0;
  1301. /* End of Outputs for SubSystem: '<S26>/If Action Subsystem' */
  1302. }
  1303. /* End of Switch: '<S24>/Switch2' */
  1304. /* Outputs for IfAction SubSystem: '<S26>/If Action Subsystem' incorporates:
  1305. * ActionPort: '<S27>/Action Port'
  1306. */
  1307. rtDW->Merge[1] = rtb_Sum6_p;
  1308. /* End of Outputs for SubSystem: '<S26>/If Action Subsystem' */
  1309. } else if ((rtb_z_ctrlMod == 0) && rtb_Equal_k) {
  1310. /* Outputs for IfAction SubSystem: '<S26>/open_mode' incorporates:
  1311. * ActionPort: '<S29>/Action Port'
  1312. */
  1313. /* RelationalOperator: '<S31>/Relational Operator' incorporates:
  1314. * Switch: '<S24>/Switch3'
  1315. * UnitDelay: '<S31>/UnitDelay'
  1316. */
  1317. rtb_LogicalOperator12 = (rtb_Sum6_p != rtDW->UnitDelay_DSTATE_e);
  1318. /* If: '<S32>/If' */
  1319. if (rtb_LogicalOperator12) {
  1320. /* Outputs for IfAction SubSystem: '<S32>/RateInit' incorporates:
  1321. * ActionPort: '<S33>/Action Port'
  1322. */
  1323. /* Sum: '<S33>/Add' incorporates:
  1324. * Switch: '<S24>/Switch3'
  1325. * UnitDelay: '<S6>/UnitDelay1'
  1326. */
  1327. rtb_Divide1_m = (int16_T)((rtb_Sum6_p - rtDW->UnitDelay1_DSTATE_f[1]) >> 1);
  1328. /* Signum: '<S33>/Sign' incorporates:
  1329. * Sum: '<S33>/Add'
  1330. */
  1331. if (rtb_Divide1_m < 0) {
  1332. rtb_Divide1_m = -1;
  1333. } else {
  1334. rtb_Divide1_m = (int16_T)(rtb_Divide1_m > 0);
  1335. }
  1336. /* End of Signum: '<S33>/Sign' */
  1337. /* Product: '<S33>/Divide' incorporates:
  1338. * Constant: '<S29>/Constant5'
  1339. */
  1340. rtDW->Divide = (int16_T)(rtP.dz_OpenStepVol * rtb_Divide1_m);
  1341. /* MinMax: '<S33>/Max' incorporates:
  1342. * Switch: '<S24>/Switch3'
  1343. * UnitDelay: '<S6>/UnitDelay1'
  1344. */
  1345. if (rtb_Sum6_p > rtDW->UnitDelay1_DSTATE_f[1]) {
  1346. /* MinMax: '<S33>/Max' */
  1347. rtDW->Max_p = rtb_Sum6_p;
  1348. } else {
  1349. /* MinMax: '<S33>/Max' */
  1350. rtDW->Max_p = rtDW->UnitDelay1_DSTATE_f[1];
  1351. }
  1352. /* End of MinMax: '<S33>/Max' */
  1353. /* MinMax: '<S33>/Max1' incorporates:
  1354. * Switch: '<S24>/Switch3'
  1355. * UnitDelay: '<S6>/UnitDelay1'
  1356. */
  1357. if (rtDW->UnitDelay1_DSTATE_f[1] < rtb_Sum6_p) {
  1358. /* MinMax: '<S33>/Max1' */
  1359. rtDW->Max1_g = rtDW->UnitDelay1_DSTATE_f[1];
  1360. } else {
  1361. /* MinMax: '<S33>/Max1' */
  1362. rtDW->Max1_g = rtb_Sum6_p;
  1363. }
  1364. /* End of MinMax: '<S33>/Max1' */
  1365. /* End of Outputs for SubSystem: '<S32>/RateInit' */
  1366. /* Switch: '<S36>/Switch1' incorporates:
  1367. * UnitDelay: '<S6>/UnitDelay1'
  1368. */
  1369. rtb_r_cos_M1 = rtDW->UnitDelay1_DSTATE_f[1];
  1370. } else {
  1371. /* Switch: '<S36>/Switch1' incorporates:
  1372. * UnitDelay: '<S36>/UnitDelay'
  1373. */
  1374. rtb_r_cos_M1 = rtDW->UnitDelay_DSTATE_fv;
  1375. }
  1376. /* End of If: '<S32>/If' */
  1377. /* Switch: '<S32>/Switch' incorporates:
  1378. * Constant: '<S32>/Constant'
  1379. * Product: '<S33>/Divide'
  1380. * RelationalOperator: '<S32>/Equal'
  1381. * Switch: '<S24>/Switch3'
  1382. * UnitDelay: '<S32>/Unit Delay'
  1383. */
  1384. if (rtb_Sum6_p != rtDW->UnitDelay_DSTATE_i) {
  1385. rtb_Divide1_m = rtDW->Divide;
  1386. } else {
  1387. rtb_Divide1_m = 0;
  1388. }
  1389. /* End of Switch: '<S32>/Switch' */
  1390. /* Sum: '<S35>/Add2' */
  1391. rtb_Divide_idx_0 = ((rtb_r_cos_M1 << 2) + rtb_Divide1_m) >> 2;
  1392. if (rtb_Divide_idx_0 > 32767) {
  1393. rtb_Divide_idx_0 = 32767;
  1394. } else {
  1395. if (rtb_Divide_idx_0 < -32768) {
  1396. rtb_Divide_idx_0 = -32768;
  1397. }
  1398. }
  1399. /* Switch: '<S34>/Switch2' incorporates:
  1400. * MinMax: '<S33>/Max'
  1401. * MinMax: '<S33>/Max1'
  1402. * RelationalOperator: '<S34>/LowerRelop1'
  1403. * RelationalOperator: '<S34>/UpperRelop'
  1404. * Sum: '<S35>/Add2'
  1405. * Switch: '<S34>/Switch'
  1406. */
  1407. if ((int16_T)rtb_Divide_idx_0 > rtDW->Max_p) {
  1408. rtb_r_cos_M1 = rtDW->Max_p;
  1409. } else if ((int16_T)rtb_Divide_idx_0 < rtDW->Max1_g) {
  1410. /* Switch: '<S34>/Switch' incorporates:
  1411. * MinMax: '<S33>/Max1'
  1412. * Switch: '<S34>/Switch2'
  1413. */
  1414. rtb_r_cos_M1 = rtDW->Max1_g;
  1415. } else {
  1416. rtb_r_cos_M1 = (int16_T)rtb_Divide_idx_0;
  1417. }
  1418. /* End of Switch: '<S34>/Switch2' */
  1419. /* Merge: '<S26>/Merge' incorporates:
  1420. * Constant: '<S29>/Constant3'
  1421. * SignalConversion generated from: '<S29>/open_voltage'
  1422. */
  1423. rtDW->Merge[0] = 0;
  1424. /* Switch: '<S29>/Switch' incorporates:
  1425. * Switch: '<S24>/Switch'
  1426. */
  1427. if (rtb_Switch_np > 0) {
  1428. /* Merge: '<S26>/Merge' incorporates:
  1429. * SignalConversion generated from: '<S29>/open_voltage'
  1430. * Switch: '<S34>/Switch2'
  1431. */
  1432. rtDW->Merge[1] = rtb_r_cos_M1;
  1433. } else {
  1434. /* Merge: '<S26>/Merge' incorporates:
  1435. * Constant: '<S29>/Constant1'
  1436. * SignalConversion generated from: '<S29>/open_voltage'
  1437. */
  1438. rtDW->Merge[1] = 0;
  1439. }
  1440. /* End of Switch: '<S29>/Switch' */
  1441. /* Update for UnitDelay: '<S31>/UnitDelay' incorporates:
  1442. * Switch: '<S24>/Switch3'
  1443. */
  1444. rtDW->UnitDelay_DSTATE_e = rtb_Sum6_p;
  1445. /* Switch: '<S36>/Switch2' */
  1446. if (rtb_LogicalOperator12) {
  1447. /* Update for UnitDelay: '<S36>/UnitDelay' incorporates:
  1448. * UnitDelay: '<S6>/UnitDelay1'
  1449. */
  1450. rtDW->UnitDelay_DSTATE_fv = rtDW->UnitDelay1_DSTATE_f[1];
  1451. } else {
  1452. /* Update for UnitDelay: '<S36>/UnitDelay' incorporates:
  1453. * Sum: '<S35>/Add2'
  1454. */
  1455. rtDW->UnitDelay_DSTATE_fv = (int16_T)rtb_Divide_idx_0;
  1456. }
  1457. /* End of Switch: '<S36>/Switch2' */
  1458. /* Update for UnitDelay: '<S32>/Unit Delay' incorporates:
  1459. * Switch: '<S34>/Switch2'
  1460. */
  1461. rtDW->UnitDelay_DSTATE_i = rtb_r_cos_M1;
  1462. /* End of Outputs for SubSystem: '<S26>/open_mode' */
  1463. } else if (rtb_z_ctrlMod == 2) {
  1464. /* Outputs for IfAction SubSystem: '<S26>/torque_mode' incorporates:
  1465. * ActionPort: '<S30>/Action Port'
  1466. */
  1467. rtDW->r_currTgt = rtU->idq_Target;
  1468. /* Merge: '<S26>/Merge1' incorporates:
  1469. * Inport: '<Root>/idq_Target'
  1470. * Inport: '<S30>/r_currTgt'
  1471. * Inport: '<S30>/r_spdTgt'
  1472. * Switch: '<S24>/Switch'
  1473. */
  1474. rtDW->Merge1 = rtb_Switch_np;
  1475. /* End of Outputs for SubSystem: '<S26>/torque_mode' */
  1476. } else {
  1477. /* Outputs for IfAction SubSystem: '<S26>/If Action Subsystem1' incorporates:
  1478. * ActionPort: '<S28>/Action Port'
  1479. */
  1480. /* Merge: '<S26>/Merge1' incorporates:
  1481. * Inport: '<S28>/In1'
  1482. * Switch: '<S24>/Switch'
  1483. */
  1484. rtDW->Merge1 = rtb_Switch_np;
  1485. /* End of Outputs for SubSystem: '<S26>/If Action Subsystem1' */
  1486. }
  1487. /* End of If: '<S26>/If' */
  1488. /* Switch: '<S59>/Switch2' incorporates:
  1489. * Inport: '<Root>/spd_Limit'
  1490. * Merge: '<S26>/Merge1'
  1491. * RelationalOperator: '<S59>/LowerRelop1'
  1492. * RelationalOperator: '<S59>/UpperRelop'
  1493. * Switch: '<S59>/Switch'
  1494. */
  1495. if (rtDW->Merge1 > rtU->spd_Limit) {
  1496. rtb_Switch_np = rtU->spd_Limit;
  1497. } else if (rtDW->Merge1 < 0) {
  1498. /* Switch: '<S59>/Switch' incorporates:
  1499. * Constant: '<S49>/Constant'
  1500. * Switch: '<S59>/Switch2'
  1501. */
  1502. rtb_Switch_np = 0;
  1503. } else {
  1504. rtb_Switch_np = rtDW->Merge1;
  1505. }
  1506. /* End of Switch: '<S59>/Switch2' */
  1507. /* If: '<S53>/If' incorporates:
  1508. * Constant: '<S76>/Constant'
  1509. * Logic: '<S71>/Logical Operator'
  1510. * Switch: '<S71>/Switch2'
  1511. */
  1512. rtb_Sum2 = -1;
  1513. if ((rtb_z_ctrlMod != 0) && rtb_Equal_k) {
  1514. rtb_Sum2 = 0;
  1515. /* Outputs for IfAction SubSystem: '<S53>/Do_Calc' incorporates:
  1516. * ActionPort: '<S70>/Action Port'
  1517. */
  1518. /* Outputs for Atomic SubSystem: '<S76>/Low_Pass_Filter' */
  1519. Low_Pass_Filter(rtb_UnitDelay1_m, rtP.f_lpf_vdq,
  1520. rtb_TmpSignalConversionAtLow_Pa, &rtDW->Low_Pass_Filter_h);
  1521. /* End of Outputs for SubSystem: '<S76>/Low_Pass_Filter' */
  1522. /* DataTypeConversion: '<S70>/Data Type Conversion' incorporates:
  1523. * Constant: '<S76>/Constant'
  1524. * RelationalOperator: '<S70>/Equal'
  1525. * UnitDelay: '<S70>/Unit Delay'
  1526. */
  1527. rtb_DataTypeConversion_j = (uint8_T)(rtDW->UnitDelay_DSTATE_p2 !=
  1528. rtb_z_ctrlMod);
  1529. /* If: '<S73>/If' incorporates:
  1530. * Constant: '<S87>/Constant1'
  1531. * Constant: '<S87>/Constant11'
  1532. * Constant: '<S87>/Constant4'
  1533. * Gain: '<S70>/Gain'
  1534. * Sum: '<S87>/Sum1'
  1535. * Switch: '<S14>/Switch2'
  1536. * Switch: '<S59>/Switch2'
  1537. * UnitDelay: '<S70>/Unit Delay1'
  1538. */
  1539. if (rtb_z_ctrlMod == 1) {
  1540. rtDW->If_ActiveSubsystem_h = 0;
  1541. /* Outputs for IfAction SubSystem: '<S73>/speed_mode' incorporates:
  1542. * ActionPort: '<S87>/Action Port'
  1543. */
  1544. /* MinMax: '<S87>/Min' incorporates:
  1545. * Constant: '<S87>/Constant6'
  1546. * UnitDelay: '<S87>/Unit Delay'
  1547. */
  1548. if (rtP.i_dqMax < rtDW->UnitDelay_DSTATE_l) {
  1549. rtb_Switch_f2_idx_1 = rtP.i_dqMax;
  1550. } else {
  1551. rtb_Switch_f2_idx_1 = rtDW->UnitDelay_DSTATE_l;
  1552. }
  1553. /* End of MinMax: '<S87>/Min' */
  1554. /* MinMax: '<S87>/Min1' incorporates:
  1555. * Constant: '<S87>/Constant6'
  1556. * Gain: '<S87>/Gain'
  1557. * Gain: '<S87>/Gain1'
  1558. * UnitDelay: '<S87>/Unit Delay'
  1559. */
  1560. if ((int16_T)-rtDW->UnitDelay_DSTATE_l > (int16_T)-rtP.i_dqMax) {
  1561. rtb_Min = (int16_T)-rtDW->UnitDelay_DSTATE_l;
  1562. } else {
  1563. rtb_Min = (int16_T)-rtP.i_dqMax;
  1564. }
  1565. /* End of MinMax: '<S87>/Min1' */
  1566. /* Outputs for Atomic SubSystem: '<S87>/PI_Speed' */
  1567. rtb_Sum1_f = PI_backCalc_fixdt(rtb_Switch_np - rtb_Switch3, rtP.cf_nKp,
  1568. rtP.cf_nKi, rtP.cf_nKb, rtb_Switch_f2_idx_1, rtb_Min, (int16_T)
  1569. ((rtP.cf_lastIqGain * rtDW->UnitDelay1_DSTATE_g) >> 15),
  1570. rtb_DataTypeConversion_j, &rtDW->PI_Speed, &rtPrevZCX->PI_Speed);
  1571. /* End of Outputs for SubSystem: '<S87>/PI_Speed' */
  1572. /* Merge: '<S73>/Merge' incorporates:
  1573. * Constant: '<S87>/Constant1'
  1574. * Constant: '<S87>/Constant11'
  1575. * Constant: '<S87>/Constant4'
  1576. * DataTypeConversion: '<S87>/Data Type Conversion'
  1577. * Gain: '<S70>/Gain'
  1578. * Sum: '<S87>/Sum1'
  1579. * Switch: '<S14>/Switch2'
  1580. * Switch: '<S59>/Switch2'
  1581. * Switch: '<S91>/Switch2'
  1582. * UnitDelay: '<S70>/Unit Delay1'
  1583. */
  1584. rtDW->Merge_f = (int16_T)(rtb_Sum1_f >> 9);
  1585. /* End of Outputs for SubSystem: '<S73>/speed_mode' */
  1586. } else {
  1587. rtDW->If_ActiveSubsystem_h = 1;
  1588. /* Outputs for IfAction SubSystem: '<S73>/torque_mode' incorporates:
  1589. * ActionPort: '<S88>/Action Port'
  1590. */
  1591. /* Sum: '<S88>/Sum1' incorporates:
  1592. * Switch: '<S14>/Switch2'
  1593. * Switch: '<S59>/Switch2'
  1594. */
  1595. rtb_Switch_np -= rtb_Switch3;
  1596. /* Delay: '<S88>/Delay' incorporates:
  1597. * Inport: '<S30>/r_currTgt'
  1598. */
  1599. if (rtDW->icLoad_p != 0) {
  1600. rtDW->Delay_DSTATE = rtDW->r_currTgt;
  1601. }
  1602. /* MinMax: '<S88>/Min' incorporates:
  1603. * Delay: '<S88>/Delay'
  1604. * Inport: '<S30>/r_currTgt'
  1605. */
  1606. if (rtDW->r_currTgt < rtDW->Delay_DSTATE) {
  1607. rtb_Min = rtDW->r_currTgt;
  1608. } else {
  1609. rtb_Min = rtDW->Delay_DSTATE;
  1610. }
  1611. /* End of MinMax: '<S88>/Min' */
  1612. /* Outputs for Atomic SubSystem: '<S88>/PI_TrqSpdLim' */
  1613. /* Delay: '<S93>/Resettable Delay' incorporates:
  1614. * DataTypeConversion: '<S93>/Data Type Conversion2'
  1615. * Inport: '<S30>/r_currTgt'
  1616. */
  1617. if ((rtb_DataTypeConversion_j > 0) &&
  1618. (rtPrevZCX->ResettableDelay_Reset_ZCE_a != 1)) {
  1619. rtDW->icLoad_k = 1U;
  1620. }
  1621. rtPrevZCX->ResettableDelay_Reset_ZCE_a = (ZCSigState)
  1622. (rtb_DataTypeConversion_j > 0);
  1623. if (rtDW->icLoad_k != 0) {
  1624. rtDW->ResettableDelay_DSTATE_c = rtDW->r_currTgt << 7;
  1625. }
  1626. /* Product: '<S92>/Divide1' incorporates:
  1627. * Constant: '<S88>/Constant1'
  1628. * Sum: '<S88>/Sum1'
  1629. */
  1630. tmp_2 = (int64_T)rtb_Switch_np * rtP.cf_TrqLimKi;
  1631. if (tmp_2 > 2147483647LL) {
  1632. tmp_2 = 2147483647LL;
  1633. } else {
  1634. if (tmp_2 < -2147483648LL) {
  1635. tmp_2 = -2147483648LL;
  1636. }
  1637. }
  1638. /* Sum: '<S92>/Sum2' incorporates:
  1639. * Product: '<S92>/Divide1'
  1640. * UnitDelay: '<S92>/Unit Delay'
  1641. */
  1642. if (((int32_T)tmp_2 < 0) && (rtDW->UnitDelay_DSTATE_n < MIN_int32_T
  1643. - (int32_T)tmp_2)) {
  1644. rtb_Divide_idx_0 = MIN_int32_T;
  1645. } else if (((int32_T)tmp_2 > 0) && (rtDW->UnitDelay_DSTATE_n > MAX_int32_T
  1646. - (int32_T)tmp_2)) {
  1647. rtb_Divide_idx_0 = MAX_int32_T;
  1648. } else {
  1649. rtb_Divide_idx_0 = (int32_T)tmp_2 + rtDW->UnitDelay_DSTATE_n;
  1650. }
  1651. /* End of Sum: '<S92>/Sum2' */
  1652. /* Sum: '<S93>/Sum1' incorporates:
  1653. * Delay: '<S93>/Resettable Delay'
  1654. */
  1655. tmp_2 = (((int64_T)rtDW->ResettableDelay_DSTATE_c << 2) + rtb_Divide_idx_0)
  1656. >> 2;
  1657. if (tmp_2 > 2147483647LL) {
  1658. tmp_2 = 2147483647LL;
  1659. } else {
  1660. if (tmp_2 < -2147483648LL) {
  1661. tmp_2 = -2147483648LL;
  1662. }
  1663. }
  1664. rtb_Sum1_f = (int32_T)tmp_2;
  1665. /* End of Sum: '<S93>/Sum1' */
  1666. /* Product: '<S92>/Divide4' incorporates:
  1667. * Constant: '<S88>/Constant4'
  1668. * Sum: '<S88>/Sum1'
  1669. */
  1670. tmp_2 = (int64_T)rtb_Switch_np * rtP.cf_TrqLimKp;
  1671. if (tmp_2 > 2147483647LL) {
  1672. tmp_2 = 2147483647LL;
  1673. } else {
  1674. if (tmp_2 < -2147483648LL) {
  1675. tmp_2 = -2147483648LL;
  1676. }
  1677. }
  1678. /* Sum: '<S92>/Sum6' incorporates:
  1679. * DataTypeConversion: '<S93>/Data Type Conversion1'
  1680. * Product: '<S92>/Divide4'
  1681. * Sum: '<S93>/Sum1'
  1682. */
  1683. tmp_2 = (int64_T)(rtb_Sum1_f << 2) + (int32_T)tmp_2;
  1684. if (tmp_2 > 2147483647LL) {
  1685. tmp_2 = 2147483647LL;
  1686. } else {
  1687. if (tmp_2 < -2147483648LL) {
  1688. tmp_2 = -2147483648LL;
  1689. }
  1690. }
  1691. rtb_Switch_np = (int32_T)tmp_2;
  1692. /* End of Sum: '<S92>/Sum6' */
  1693. /* RelationalOperator: '<S94>/LowerRelop1' incorporates:
  1694. * MinMax: '<S88>/Min'
  1695. * Switch: '<S94>/Switch2'
  1696. */
  1697. rtb_Divide_idx_0 = rtb_Min << 9;
  1698. /* Switch: '<S94>/Switch2' incorporates:
  1699. * RelationalOperator: '<S94>/LowerRelop1'
  1700. * Sum: '<S92>/Sum6'
  1701. */
  1702. if (rtb_Switch_np > rtb_Divide_idx_0) {
  1703. rtb_Gain_b0 = rtb_Divide_idx_0;
  1704. } else {
  1705. /* Gain: '<S92>/Gain' incorporates:
  1706. * MinMax: '<S88>/Min'
  1707. */
  1708. rtb_Gain_b0 = -32768 * rtb_Min;
  1709. /* Switch: '<S94>/Switch' incorporates:
  1710. * Gain: '<S92>/Gain'
  1711. * RelationalOperator: '<S94>/UpperRelop'
  1712. * Switch: '<S94>/Switch2'
  1713. */
  1714. if (((int64_T)rtb_Switch_np << 6) < rtb_Gain_b0) {
  1715. rtb_Gain_b0 >>= 6;
  1716. } else {
  1717. rtb_Gain_b0 = rtb_Switch_np;
  1718. }
  1719. /* End of Switch: '<S94>/Switch' */
  1720. }
  1721. /* Update for UnitDelay: '<S92>/Unit Delay' incorporates:
  1722. * Constant: '<S88>/Constant2'
  1723. * Product: '<S92>/Divide2'
  1724. * Sum: '<S92>/Sum3'
  1725. * Sum: '<S92>/Sum6'
  1726. * Switch: '<S94>/Switch2'
  1727. */
  1728. rtDW->UnitDelay_DSTATE_n = (int32_T)(((int64_T)(rtb_Gain_b0 -
  1729. rtb_Switch_np) * rtP.cf_TrqLimKb) >> 10);
  1730. /* Update for Delay: '<S93>/Resettable Delay' incorporates:
  1731. * Sum: '<S93>/Sum1'
  1732. */
  1733. rtDW->icLoad_k = 0U;
  1734. rtDW->ResettableDelay_DSTATE_c = rtb_Sum1_f;
  1735. /* End of Outputs for SubSystem: '<S88>/PI_TrqSpdLim' */
  1736. /* Merge: '<S73>/Merge' incorporates:
  1737. * DataTypeConversion: '<S88>/Data Type Conversion'
  1738. * ManualSwitch: '<S88>/Manual Switch'
  1739. * Switch: '<S94>/Switch2'
  1740. */
  1741. rtDW->Merge_f = (int16_T)(rtb_Gain_b0 >> 9);
  1742. /* End of Outputs for SubSystem: '<S73>/torque_mode' */
  1743. }
  1744. /* End of If: '<S73>/If' */
  1745. /* Outputs for IfAction SubSystem: '<S75>/MTPA_Calc' incorporates:
  1746. * ActionPort: '<S80>/Action Port'
  1747. */
  1748. /* If: '<S75>/If' incorporates:
  1749. * Constant: '<S80>/Constant3'
  1750. * Merge: '<S75>/Merge'
  1751. * Switch: '<S80>/Switch'
  1752. */
  1753. rtDW->Merge_c[0] = 0;
  1754. rtDW->Merge_c[1] = rtDW->Merge_f;
  1755. /* End of Outputs for SubSystem: '<S75>/MTPA_Calc' */
  1756. /* Sum: '<S74>/Sum' incorporates:
  1757. * Constant: '<S74>/Constant3'
  1758. * UnitDelay: '<S74>/Unit Delay1'
  1759. */
  1760. rtb_Divide_idx_0 = (rtP.V_modulation - rtDW->UnitDelay1_DSTATE_c) >> 1;
  1761. if (rtb_Divide_idx_0 < -32768) {
  1762. rtb_Divide_idx_0 = -32768;
  1763. }
  1764. /* Delay: '<S78>/Resettable Delay' incorporates:
  1765. * Constant: '<S74>/Constant4'
  1766. * DataTypeConversion: '<S78>/Data Type Conversion2'
  1767. */
  1768. if ((rtb_DataTypeConversion_j > 0) &&
  1769. (rtPrevZCX->ResettableDelay_Reset_ZCE_o != 1)) {
  1770. rtDW->icLoad = 1U;
  1771. }
  1772. rtPrevZCX->ResettableDelay_Reset_ZCE_o = (ZCSigState)
  1773. (rtb_DataTypeConversion_j > 0);
  1774. if (rtDW->icLoad != 0) {
  1775. rtDW->ResettableDelay_DSTATE = 0;
  1776. }
  1777. /* Signum: '<S74>/Sign' incorporates:
  1778. * Sum: '<S74>/Sum'
  1779. */
  1780. if ((int16_T)rtb_Divide_idx_0 < 0) {
  1781. rtb_Switch_f2_idx_1 = -1;
  1782. } else {
  1783. rtb_Switch_f2_idx_1 = (int16_T)((int16_T)rtb_Divide_idx_0 > 0);
  1784. }
  1785. /* End of Signum: '<S74>/Sign' */
  1786. /* Sum: '<S78>/Sum1' incorporates:
  1787. * Constant: '<S74>/Constant2'
  1788. * Constant: '<S74>/Constant5'
  1789. * Delay: '<S78>/Resettable Delay'
  1790. * Product: '<S77>/Divide'
  1791. * Product: '<S77>/Divide1'
  1792. * Sum: '<S77>/Add'
  1793. * UnitDelay: '<S77>/Unit Delay'
  1794. */
  1795. rtb_Sum1_f = (((((rtP.cf_Fw_Kb * rtDW->UnitDelay_DSTATE) << 6) >> 12) +
  1796. rtb_Switch_f2_idx_1 * rtP.cf_Fw_Ki) >> 4) +
  1797. rtDW->ResettableDelay_DSTATE;
  1798. /* Switch: '<S79>/Switch2' incorporates:
  1799. * Constant: '<S77>/Constant6'
  1800. * RelationalOperator: '<S79>/LowerRelop1'
  1801. * Sum: '<S78>/Sum1'
  1802. */
  1803. if (rtb_Sum1_f > 0) {
  1804. rtb_Divide_idx_1 = 0;
  1805. } else {
  1806. /* Gain: '<S74>/Gain1' */
  1807. rtb_Switch_np = -32768 * rtDW->Merge_c[1];
  1808. /* MinMax: '<S74>/Max' incorporates:
  1809. * Constant: '<S74>/Constant6'
  1810. * Gain: '<S74>/Gain1'
  1811. */
  1812. rtb_Divide_idx_0 = rtP.id_fieldWeakMax << 15;
  1813. if (rtb_Switch_np <= rtb_Divide_idx_0) {
  1814. rtb_Switch_np = rtb_Divide_idx_0;
  1815. }
  1816. /* End of MinMax: '<S74>/Max' */
  1817. /* Switch: '<S79>/Switch' incorporates:
  1818. * MinMax: '<S74>/Max'
  1819. * RelationalOperator: '<S79>/UpperRelop'
  1820. * Switch: '<S79>/Switch2'
  1821. */
  1822. if (((int64_T)rtb_Sum1_f << 14) < rtb_Switch_np) {
  1823. rtb_Divide_idx_1 = rtb_Switch_np >> 14;
  1824. } else {
  1825. rtb_Divide_idx_1 = rtb_Sum1_f;
  1826. }
  1827. /* End of Switch: '<S79>/Switch' */
  1828. }
  1829. /* End of Switch: '<S79>/Switch2' */
  1830. /* Sum: '<S74>/Sum1' incorporates:
  1831. * Product: '<S76>/Divide1'
  1832. * Switch: '<S79>/Switch2'
  1833. */
  1834. rtb_Min = (int16_T)((rtb_Divide_idx_1 >> 1) + rtDW->Merge_c[0]);
  1835. /* Sum: '<S74>/Sum of Elements' */
  1836. rtb_Switch_np = 1;
  1837. rtb_Gain_b0 = 0;
  1838. /* Sqrt: '<S74>/Sqrt' incorporates:
  1839. * Math: '<S74>/Math Function1'
  1840. * Math: '<S74>/Math Function2'
  1841. * Merge: '<S75>/Merge'
  1842. * Product: '<S76>/Divide1'
  1843. * Sum: '<S74>/Sum of Elements'
  1844. * Sum: '<S74>/Sum2'
  1845. */
  1846. rtb_Switch_f2_idx_1 = rt_sqrt_Us32En6_Ys16En_1bhh77n4((((rtDW->Merge_c[0] *
  1847. rtDW->Merge_c[0] + rtDW->Merge_c[1] * rtDW->Merge_c[1]) >> 1) - ((rtb_Min *
  1848. rtb_Min) >> 1)) >> 3);
  1849. /* Sum: '<S76>/Add' incorporates:
  1850. * Inport: '<Root>/iDC_Limit'
  1851. * Inport: '<Root>/vDC'
  1852. * Math: '<S86>/Math Function2'
  1853. * Product: '<S49>/Divide'
  1854. * Product: '<S76>/Divide'
  1855. * Switch: '<S74>/Switch'
  1856. */
  1857. rtb_MathFunction2_p = rtU->iDC_Limit * rtU->vDC - rtb_Min *
  1858. rtb_TmpSignalConversionAtLow_Pa[0];
  1859. /* Product: '<S76>/Divide3' incorporates:
  1860. * Constant: '<S76>/Constant5'
  1861. * Gain: '<S76>/Gain'
  1862. * Math: '<S86>/Math Function2'
  1863. */
  1864. rtb_Divide_idx_0 = rtb_MathFunction2_p / (rtP.i_dqMax << 1);
  1865. if (rtb_Divide_idx_0 > 32767) {
  1866. rtb_Divide_idx_0 = 32767;
  1867. } else {
  1868. if (rtb_Divide_idx_0 < -32768) {
  1869. rtb_Divide_idx_0 = -32768;
  1870. }
  1871. }
  1872. /* MinMax: '<S76>/Min2' incorporates:
  1873. * Product: '<S76>/Divide3'
  1874. */
  1875. if (rtb_TmpSignalConversionAtLow_Pa[1] > (int16_T)rtb_Divide_idx_0) {
  1876. rtb_Divide1_m = rtb_TmpSignalConversionAtLow_Pa[1];
  1877. } else {
  1878. rtb_Divide1_m = (int16_T)rtb_Divide_idx_0;
  1879. }
  1880. /* End of MinMax: '<S76>/Min2' */
  1881. /* Product: '<S76>/Divide1' incorporates:
  1882. * Math: '<S86>/Math Function2'
  1883. */
  1884. rtb_Divide_idx_0 = rtb_MathFunction2_p / rtb_Divide1_m;
  1885. if (rtb_Divide_idx_0 > 32767) {
  1886. rtb_Divide_idx_0 = 32767;
  1887. } else {
  1888. if (rtb_Divide_idx_0 < -32768) {
  1889. rtb_Divide_idx_0 = -32768;
  1890. }
  1891. }
  1892. /* Signum: '<S76>/Sign' incorporates:
  1893. * Sqrt: '<S74>/Sqrt'
  1894. */
  1895. if (rtb_Switch_f2_idx_1 < 0) {
  1896. rtb_Sum6_p = -1;
  1897. } else {
  1898. rtb_Sum6_p = (int16_T)(rtb_Switch_f2_idx_1 > 0);
  1899. }
  1900. /* End of Signum: '<S76>/Sign' */
  1901. /* Product: '<S76>/Divide2' incorporates:
  1902. * Product: '<S76>/Divide1'
  1903. */
  1904. rtb_r_cos_M1 = (int16_T)((int16_T)rtb_Divide_idx_0 * rtb_Sum6_p);
  1905. /* Switch: '<S85>/Switch2' incorporates:
  1906. * Constant: '<S76>/Constant2'
  1907. * Constant: '<S76>/Constant3'
  1908. * Gain: '<S76>/Gain1'
  1909. * Product: '<S76>/Divide2'
  1910. * RelationalOperator: '<S85>/LowerRelop1'
  1911. * RelationalOperator: '<S85>/UpperRelop'
  1912. * Switch: '<S85>/Switch'
  1913. */
  1914. if (rtb_r_cos_M1 > rtP.i_dqMax) {
  1915. rtb_r_cos_M1 = rtP.i_dqMax;
  1916. } else {
  1917. if (rtb_r_cos_M1 < (int16_T)-rtP.i_dqMax) {
  1918. /* Switch: '<S85>/Switch' incorporates:
  1919. * Constant: '<S76>/Constant2'
  1920. * Gain: '<S76>/Gain1'
  1921. * Switch: '<S85>/Switch2'
  1922. */
  1923. rtb_r_cos_M1 = (int16_T)-rtP.i_dqMax;
  1924. }
  1925. }
  1926. /* End of Switch: '<S85>/Switch2' */
  1927. /* Switch: '<S76>/Switch' incorporates:
  1928. * MinMax: '<S76>/Min1'
  1929. * Sqrt: '<S74>/Sqrt'
  1930. * Switch: '<S85>/Switch2'
  1931. */
  1932. if (rtb_Sum6_p > 0) {
  1933. /* MinMax: '<S76>/Min' incorporates:
  1934. * Sqrt: '<S74>/Sqrt'
  1935. * Switch: '<S85>/Switch2'
  1936. */
  1937. if (rtb_r_cos_M1 < rtb_Switch_f2_idx_1) {
  1938. /* Switch: '<S76>/Switch' */
  1939. rtDW->Switch = rtb_r_cos_M1;
  1940. } else {
  1941. /* Switch: '<S76>/Switch' */
  1942. rtDW->Switch = rtb_Switch_f2_idx_1;
  1943. }
  1944. /* End of MinMax: '<S76>/Min' */
  1945. } else if (rtb_r_cos_M1 > rtb_Switch_f2_idx_1) {
  1946. /* MinMax: '<S76>/Min1' incorporates:
  1947. * Switch: '<S76>/Switch'
  1948. * Switch: '<S85>/Switch2'
  1949. */
  1950. rtDW->Switch = rtb_r_cos_M1;
  1951. } else {
  1952. /* Switch: '<S76>/Switch' incorporates:
  1953. * Sqrt: '<S74>/Sqrt'
  1954. */
  1955. rtDW->Switch = rtb_Switch_f2_idx_1;
  1956. }
  1957. /* End of Switch: '<S76>/Switch' */
  1958. /* Switch: '<S84>/Switch2' incorporates:
  1959. * Constant: '<S76>/Constant1'
  1960. * Constant: '<S76>/Constant2'
  1961. * Gain: '<S76>/Gain1'
  1962. * RelationalOperator: '<S84>/LowerRelop1'
  1963. * RelationalOperator: '<S84>/UpperRelop'
  1964. * Switch: '<S74>/Switch'
  1965. * Switch: '<S84>/Switch'
  1966. */
  1967. if (rtb_Min > rtP.i_dqMax) {
  1968. /* Switch: '<S84>/Switch2' */
  1969. rtDW->Switch2 = rtP.i_dqMax;
  1970. } else if (rtb_Min < (int16_T)-rtP.i_dqMax) {
  1971. /* Switch: '<S84>/Switch' incorporates:
  1972. * Constant: '<S76>/Constant2'
  1973. * Gain: '<S76>/Gain1'
  1974. * Switch: '<S84>/Switch2'
  1975. */
  1976. rtDW->Switch2 = (int16_T)-rtP.i_dqMax;
  1977. } else {
  1978. /* Switch: '<S84>/Switch2' */
  1979. rtDW->Switch2 = rtb_Min;
  1980. }
  1981. /* End of Switch: '<S84>/Switch2' */
  1982. /* Sqrt: '<S86>/Sqrt1' incorporates:
  1983. * Math: '<S86>/Math Function2'
  1984. * Math: '<S86>/Math Function3'
  1985. * Product: '<S76>/Divide1'
  1986. * Sum: '<S86>/Add'
  1987. * Switch: '<S74>/Switch'
  1988. */
  1989. rtb_Min = rt_sqrt_Us32En10_Ys16E_7VJYwqF9(rtb_Min * rtb_Min + (int16_T)
  1990. rtb_Divide_idx_0 * (int16_T)rtb_Divide_idx_0);
  1991. /* Sum: '<S77>/Sum' incorporates:
  1992. * Sum: '<S78>/Sum1'
  1993. * Switch: '<S79>/Switch2'
  1994. */
  1995. rtb_MathFunction2_p = rtb_Divide_idx_1 - rtb_Sum1_f;
  1996. /* End of Outputs for SubSystem: '<S53>/Do_Calc' */
  1997. }
  1998. /* RelationalOperator: '<S106>/Relational Operator' incorporates:
  1999. * Switch: '<S84>/Switch2'
  2000. * UnitDelay: '<S106>/UnitDelay'
  2001. */
  2002. rtb_Equal_k = (rtDW->Switch2 != rtDW->UnitDelay_DSTATE_h);
  2003. /* Sum: '<S97>/Add' incorporates:
  2004. * Product: '<S60>/Divide1'
  2005. * Switch: '<S84>/Switch2'
  2006. * UnitDelay: '<S97>/Unit Delay1'
  2007. */
  2008. rtb_Sum6_p = (int16_T)(rtDW->Switch2 - rtDW->UnitDelay1_DSTATE_i);
  2009. /* Abs: '<S97>/Abs' incorporates:
  2010. * Product: '<S60>/Divide1'
  2011. */
  2012. if (rtb_Sum6_p < 0) {
  2013. rtb_Sum6_p = (int16_T)-rtb_Sum6_p;
  2014. }
  2015. /* End of Abs: '<S97>/Abs' */
  2016. /* Outputs for Enabled SubSystem: '<S97>/Enabled Subsystem' incorporates:
  2017. * EnablePort: '<S107>/Enable'
  2018. */
  2019. /* If: '<S108>/If' incorporates:
  2020. * Gain: '<S97>/Gain'
  2021. * Product: '<S60>/Divide1'
  2022. * UnitDelay: '<S97>/Unit Delay1'
  2023. */
  2024. if (rtb_Equal_k) {
  2025. /* Outputs for IfAction SubSystem: '<S108>/RateInit' incorporates:
  2026. * ActionPort: '<S109>/Action Port'
  2027. */
  2028. RateInit(rtDW->UnitDelay1_DSTATE_i, rtDW->Switch2, (int16_T)((13107 *
  2029. rtb_Sum6_p) >> 13), &rtDW->Divide_n, &rtDW->Max_g, &rtDW->Max1_j);
  2030. /* End of Outputs for SubSystem: '<S108>/RateInit' */
  2031. /* Switch: '<S112>/Switch1' incorporates:
  2032. * Gain: '<S97>/Gain'
  2033. * Product: '<S60>/Divide1'
  2034. * UnitDelay: '<S97>/Unit Delay1'
  2035. */
  2036. rtb_Divide1_m = rtDW->UnitDelay1_DSTATE_i;
  2037. } else {
  2038. /* Switch: '<S112>/Switch1' incorporates:
  2039. * UnitDelay: '<S112>/UnitDelay'
  2040. */
  2041. rtb_Divide1_m = rtDW->UnitDelay_DSTATE_b;
  2042. }
  2043. /* End of If: '<S108>/If' */
  2044. /* End of Outputs for SubSystem: '<S97>/Enabled Subsystem' */
  2045. /* Switch: '<S108>/Switch' incorporates:
  2046. * Constant: '<S108>/Constant'
  2047. * Product: '<S109>/Divide'
  2048. * RelationalOperator: '<S108>/Equal'
  2049. * Switch: '<S84>/Switch2'
  2050. * UnitDelay: '<S108>/Unit Delay'
  2051. */
  2052. if (rtDW->Switch2 != rtDW->UnitDelay_DSTATE_g) {
  2053. rtb_Switch_f2_idx_1 = rtDW->Divide_n;
  2054. } else {
  2055. rtb_Switch_f2_idx_1 = 0;
  2056. }
  2057. /* End of Switch: '<S108>/Switch' */
  2058. /* Sum: '<S111>/Add2' */
  2059. rtb_Divide_idx_0 = ((rtb_Divide1_m << 5) + rtb_Switch_f2_idx_1) >> 5;
  2060. if (rtb_Divide_idx_0 > 32767) {
  2061. rtb_Divide_idx_0 = 32767;
  2062. } else {
  2063. if (rtb_Divide_idx_0 < -32768) {
  2064. rtb_Divide_idx_0 = -32768;
  2065. }
  2066. }
  2067. /* Switch: '<S110>/Switch2' incorporates:
  2068. * MinMax: '<S109>/Max'
  2069. * MinMax: '<S109>/Max1'
  2070. * RelationalOperator: '<S110>/LowerRelop1'
  2071. * RelationalOperator: '<S110>/UpperRelop'
  2072. * Sum: '<S111>/Add2'
  2073. * Switch: '<S110>/Switch'
  2074. */
  2075. if ((int16_T)rtb_Divide_idx_0 > rtDW->Max_g) {
  2076. rtb_Divide1_m = rtDW->Max_g;
  2077. } else if ((int16_T)rtb_Divide_idx_0 < rtDW->Max1_j) {
  2078. /* Switch: '<S110>/Switch' incorporates:
  2079. * MinMax: '<S109>/Max1'
  2080. * Switch: '<S110>/Switch2'
  2081. */
  2082. rtb_Divide1_m = rtDW->Max1_j;
  2083. } else {
  2084. rtb_Divide1_m = (int16_T)rtb_Divide_idx_0;
  2085. }
  2086. /* End of Switch: '<S110>/Switch2' */
  2087. /* RelationalOperator: '<S113>/Relational Operator' incorporates:
  2088. * Switch: '<S76>/Switch'
  2089. * UnitDelay: '<S113>/UnitDelay'
  2090. */
  2091. rtb_LogicalOperator12 = (rtDW->Switch != rtDW->UnitDelay_DSTATE_o);
  2092. /* Sum: '<S98>/Add' incorporates:
  2093. * Product: '<S60>/Divide1'
  2094. * Switch: '<S76>/Switch'
  2095. * UnitDelay: '<S98>/Unit Delay1'
  2096. */
  2097. rtb_Sum6_p = (int16_T)(rtDW->Switch - rtDW->UnitDelay1_DSTATE_b);
  2098. /* Abs: '<S98>/Abs' incorporates:
  2099. * Product: '<S60>/Divide1'
  2100. */
  2101. if (rtb_Sum6_p < 0) {
  2102. rtb_Sum6_p = (int16_T)-rtb_Sum6_p;
  2103. }
  2104. /* End of Abs: '<S98>/Abs' */
  2105. /* Outputs for Enabled SubSystem: '<S98>/Enabled Subsystem' incorporates:
  2106. * EnablePort: '<S114>/Enable'
  2107. */
  2108. /* If: '<S115>/If' incorporates:
  2109. * Gain: '<S98>/Gain'
  2110. * Product: '<S60>/Divide1'
  2111. * UnitDelay: '<S98>/Unit Delay1'
  2112. */
  2113. if (rtb_LogicalOperator12) {
  2114. /* Outputs for IfAction SubSystem: '<S115>/RateInit' incorporates:
  2115. * ActionPort: '<S116>/Action Port'
  2116. */
  2117. RateInit(rtDW->UnitDelay1_DSTATE_b, rtDW->Switch, (int16_T)((13107 *
  2118. rtb_Sum6_p) >> 13), &rtDW->Divide_l, &rtDW->Max, &rtDW->Max1);
  2119. /* End of Outputs for SubSystem: '<S115>/RateInit' */
  2120. /* Switch: '<S119>/Switch1' incorporates:
  2121. * Gain: '<S98>/Gain'
  2122. * Product: '<S60>/Divide1'
  2123. * UnitDelay: '<S98>/Unit Delay1'
  2124. */
  2125. rtb_r_cos_M1 = rtDW->UnitDelay1_DSTATE_b;
  2126. } else {
  2127. /* Switch: '<S119>/Switch1' incorporates:
  2128. * UnitDelay: '<S119>/UnitDelay'
  2129. */
  2130. rtb_r_cos_M1 = rtDW->UnitDelay_DSTATE_d;
  2131. }
  2132. /* End of If: '<S115>/If' */
  2133. /* End of Outputs for SubSystem: '<S98>/Enabled Subsystem' */
  2134. /* Switch: '<S115>/Switch' incorporates:
  2135. * Constant: '<S115>/Constant'
  2136. * Product: '<S116>/Divide'
  2137. * RelationalOperator: '<S115>/Equal'
  2138. * Switch: '<S76>/Switch'
  2139. * UnitDelay: '<S115>/Unit Delay'
  2140. */
  2141. if (rtDW->Switch != rtDW->UnitDelay_DSTATE_a) {
  2142. rtb_Switch_f2_idx_1 = rtDW->Divide_l;
  2143. } else {
  2144. rtb_Switch_f2_idx_1 = 0;
  2145. }
  2146. /* End of Switch: '<S115>/Switch' */
  2147. /* Sum: '<S118>/Add2' */
  2148. rtb_Divide_idx_1 = ((rtb_r_cos_M1 << 5) + rtb_Switch_f2_idx_1) >> 5;
  2149. if (rtb_Divide_idx_1 > 32767) {
  2150. rtb_Divide_idx_1 = 32767;
  2151. } else {
  2152. if (rtb_Divide_idx_1 < -32768) {
  2153. rtb_Divide_idx_1 = -32768;
  2154. }
  2155. }
  2156. /* Switch: '<S117>/Switch2' incorporates:
  2157. * MinMax: '<S116>/Max'
  2158. * MinMax: '<S116>/Max1'
  2159. * RelationalOperator: '<S117>/LowerRelop1'
  2160. * RelationalOperator: '<S117>/UpperRelop'
  2161. * Sum: '<S118>/Add2'
  2162. * Switch: '<S117>/Switch'
  2163. */
  2164. if ((int16_T)rtb_Divide_idx_1 > rtDW->Max) {
  2165. rtb_r_cos_M1 = rtDW->Max;
  2166. } else if ((int16_T)rtb_Divide_idx_1 < rtDW->Max1) {
  2167. /* Switch: '<S117>/Switch' incorporates:
  2168. * MinMax: '<S116>/Max1'
  2169. * Switch: '<S117>/Switch2'
  2170. */
  2171. rtb_r_cos_M1 = rtDW->Max1;
  2172. } else {
  2173. rtb_r_cos_M1 = (int16_T)rtb_Divide_idx_1;
  2174. }
  2175. /* End of Switch: '<S117>/Switch2' */
  2176. /* DataTypeConversion: '<S54>/Data Type Conversion' incorporates:
  2177. * Logic: '<S54>/Logical Operator'
  2178. * RelationalOperator: '<S54>/Equal'
  2179. * UnitDelay: '<S54>/Unit Delay'
  2180. */
  2181. rtb_DataTypeConversion_j = (uint8_T)((rtb_z_ctrlMod != 0) &&
  2182. (rtDW->UnitDelay_DSTATE_bm != rtb_z_ctrlMod));
  2183. /* If: '<S54>/If1' incorporates:
  2184. * Constant: '<S95>/Constant1'
  2185. * Constant: '<S95>/Constant3'
  2186. * Constant: '<S95>/Constant4'
  2187. * Constant: '<S95>/Constant6'
  2188. * Constant: '<S95>/Constant7'
  2189. * Constant: '<S95>/Constant8'
  2190. * Gain: '<S95>/Gain1'
  2191. * Gain: '<S95>/Gain2'
  2192. * Inport: '<S96>/In1'
  2193. * Merge: '<S26>/Merge'
  2194. * Merge: '<S54>/Merge'
  2195. * Outport: '<Root>/f_Idq'
  2196. * Product: '<S95>/Divide'
  2197. * Sum: '<S95>/Sum'
  2198. * Sum: '<S95>/Sum1'
  2199. * Switch: '<S110>/Switch2'
  2200. * Switch: '<S117>/Switch2'
  2201. * UnitDelay: '<S6>/UnitDelay1'
  2202. */
  2203. if (rtb_z_ctrlMod != 0) {
  2204. /* Outputs for IfAction SubSystem: '<S54>/CurrentLoop' incorporates:
  2205. * ActionPort: '<S95>/Action Port'
  2206. */
  2207. /* Product: '<S95>/Divide' incorporates:
  2208. * Constant: '<S95>/Constant2'
  2209. * Inport: '<Root>/vDC'
  2210. */
  2211. rtb_Sum6_p = (int16_T)((rtU->vDC * rtP.V_modulation) >> 14);
  2212. /* Outputs for Atomic SubSystem: '<S95>/PI_backCalc_fixdt' */
  2213. rtb_Switch_np = PI_backCalc_fixdt_o((int16_T)(rtb_Divide1_m - rtY->f_Idq[0]),
  2214. rtP.cf_idKp, rtP.cf_idKi, rtP.cf_idKb, rtb_Sum6_p, (int16_T)-rtb_Sum6_p,
  2215. rtDW->UnitDelay1_DSTATE_f[0], rtb_DataTypeConversion_j,
  2216. &rtDW->PI_backCalc_fixdt_o3, &rtPrevZCX->PI_backCalc_fixdt_o3);
  2217. /* End of Outputs for SubSystem: '<S95>/PI_backCalc_fixdt' */
  2218. /* Outputs for Atomic SubSystem: '<S95>/PI_backCalc_fixdt1' */
  2219. rtb_Gain_b0 = PI_backCalc_fixdt_o((int16_T)(rtb_r_cos_M1 - rtY->f_Idq[1]),
  2220. rtP.cf_iqKp, rtP.cf_iqKi, rtP.cf_iqKb, rtb_Sum6_p, (int16_T)-rtb_Sum6_p,
  2221. rtDW->UnitDelay1_DSTATE_f[1], rtb_DataTypeConversion_j,
  2222. &rtDW->PI_backCalc_fixdt1, &rtPrevZCX->PI_backCalc_fixdt1);
  2223. /* End of Outputs for SubSystem: '<S95>/PI_backCalc_fixdt1' */
  2224. /* Sum: '<S95>/Sum2' incorporates:
  2225. * Constant: '<S95>/Constant1'
  2226. * Constant: '<S95>/Constant3'
  2227. * Constant: '<S95>/Constant4'
  2228. * Constant: '<S95>/Constant6'
  2229. * Constant: '<S95>/Constant7'
  2230. * Constant: '<S95>/Constant8'
  2231. * DataTypeConversion: '<S95>/Data Type Conversion'
  2232. * DataTypeConversion: '<S95>/Data Type Conversion1'
  2233. * Gain: '<S95>/Gain1'
  2234. * Gain: '<S95>/Gain2'
  2235. * Merge: '<S54>/Merge'
  2236. * Outport: '<Root>/f_Idq'
  2237. * Product: '<S95>/Divide'
  2238. * Sum: '<S95>/Sum'
  2239. * Sum: '<S95>/Sum1'
  2240. * Switch: '<S103>/Switch2'
  2241. * Switch: '<S105>/Switch2'
  2242. * Switch: '<S110>/Switch2'
  2243. * Switch: '<S117>/Switch2'
  2244. * UnitDelay: '<S6>/UnitDelay1'
  2245. */
  2246. rtb_TmpSignalConversionAtLow_Pa[0] = (int16_T)(rtb_Switch_np >> 9);
  2247. rtb_TmpSignalConversionAtLow_Pa[1] = (int16_T)(rtb_Gain_b0 >> 9);
  2248. /* End of Outputs for SubSystem: '<S54>/CurrentLoop' */
  2249. } else {
  2250. /* Outputs for IfAction SubSystem: '<S54>/OpenLoop' incorporates:
  2251. * ActionPort: '<S96>/Action Port'
  2252. */
  2253. rtb_TmpSignalConversionAtLow_Pa[0] = rtDW->Merge[0];
  2254. rtb_TmpSignalConversionAtLow_Pa[1] = rtDW->Merge[1];
  2255. /* End of Outputs for SubSystem: '<S54>/OpenLoop' */
  2256. }
  2257. /* End of If: '<S54>/If1' */
  2258. /* Product: '<S51>/Divide2' incorporates:
  2259. * Constant: '<S51>/Constant'
  2260. * Inport: '<Root>/vDC'
  2261. * Product: '<S60>/Divide1'
  2262. */
  2263. rtb_Sum6_p = (int16_T)div_nde_s32_floor(rtU->vDC << 14, rtP.V_modulation);
  2264. /* Sum: '<S51>/Sum of Elements' incorporates:
  2265. * Math: '<S51>/Math Function'
  2266. * Merge: '<S54>/Merge'
  2267. */
  2268. tmp_2 = (int64_T)((rtb_TmpSignalConversionAtLow_Pa[0] *
  2269. rtb_TmpSignalConversionAtLow_Pa[0]) >> 4) +
  2270. ((rtb_TmpSignalConversionAtLow_Pa[1] * rtb_TmpSignalConversionAtLow_Pa[1]) >>
  2271. 4);
  2272. if (tmp_2 > 2147483647LL) {
  2273. tmp_2 = 2147483647LL;
  2274. } else {
  2275. if (tmp_2 < -2147483648LL) {
  2276. tmp_2 = -2147483648LL;
  2277. }
  2278. }
  2279. /* Product: '<S51>/Divide' incorporates:
  2280. * Math: '<S51>/Math Function1'
  2281. * Product: '<S60>/Divide1'
  2282. * Sum: '<S51>/Sum of Elements'
  2283. */
  2284. tmp_2 = ((int64_T)(int32_T)tmp_2 << 14) / ((rtb_Sum6_p * rtb_Sum6_p) >> 4);
  2285. if (tmp_2 < 0LL) {
  2286. tmp_2 = 0LL;
  2287. } else {
  2288. if (tmp_2 > 65535LL) {
  2289. tmp_2 = 65535LL;
  2290. }
  2291. }
  2292. /* Sqrt: '<S51>/Sqrt' incorporates:
  2293. * Product: '<S51>/Divide'
  2294. */
  2295. rtb_BitwiseOperator2 = rt_sqrt_Uu16En14_Yu16E_WMwW1mku((uint16_T)tmp_2);
  2296. /* Switch: '<S51>/Switch' incorporates:
  2297. * Merge: '<S54>/Merge'
  2298. * Sqrt: '<S51>/Sqrt'
  2299. */
  2300. if (rtb_BitwiseOperator2 > 16384) {
  2301. /* Switch: '<S51>/Switch' incorporates:
  2302. * Merge: '<S54>/Merge'
  2303. * MultiPortSwitch: '<S51>/Multiport Switch'
  2304. * Product: '<S51>/Divide1'
  2305. */
  2306. rtb_Switch_f2_idx_0 = (int16_T)((rtb_TmpSignalConversionAtLow_Pa[0] << 14) /
  2307. rtb_BitwiseOperator2);
  2308. rtb_Switch_f2_idx_1 = (int16_T)((rtb_TmpSignalConversionAtLow_Pa[1] << 14) /
  2309. rtb_BitwiseOperator2);
  2310. } else {
  2311. rtb_Switch_f2_idx_0 = rtb_TmpSignalConversionAtLow_Pa[0];
  2312. rtb_Switch_f2_idx_1 = rtb_TmpSignalConversionAtLow_Pa[1];
  2313. }
  2314. /* End of Switch: '<S51>/Switch' */
  2315. /* Sum: '<S60>/Sum1' incorporates:
  2316. * Interpolation_n-D: '<S58>/r_cos_M1'
  2317. * Interpolation_n-D: '<S58>/r_sin_M1'
  2318. * Product: '<S60>/Divide2'
  2319. * Product: '<S60>/Divide3'
  2320. */
  2321. tmp_0 = (int16_T)((rtb_Switch_f2_idx_0 * rtConstP.pooled8[rtb_LogicalOperator3])
  2322. >> 14) + (int16_T)((rtb_Switch_f2_idx_1 *
  2323. rtConstP.pooled9[rtb_LogicalOperator3]) >> 14);
  2324. if (tmp_0 > 32767) {
  2325. tmp_0 = 32767;
  2326. } else {
  2327. if (tmp_0 < -32768) {
  2328. tmp_0 = -32768;
  2329. }
  2330. }
  2331. /* Sum: '<S60>/Sum6' incorporates:
  2332. * Interpolation_n-D: '<S58>/r_cos_M1'
  2333. * Interpolation_n-D: '<S58>/r_sin_M1'
  2334. * Product: '<S60>/Divide1'
  2335. * Product: '<S60>/Divide4'
  2336. */
  2337. tmp = (int16_T)((rtb_Switch_f2_idx_0 * rtConstP.pooled9[rtb_LogicalOperator3])
  2338. >> 14) - (int16_T)((rtb_Switch_f2_idx_1 *
  2339. rtConstP.pooled8[rtb_LogicalOperator3]) >> 14);
  2340. if (tmp > 32767) {
  2341. tmp = 32767;
  2342. } else {
  2343. if (tmp < -32768) {
  2344. tmp = -32768;
  2345. }
  2346. }
  2347. /* Product: '<S61>/Divide7' incorporates:
  2348. * Constant: '<S61>/Constant3'
  2349. * Sum: '<S60>/Sum1'
  2350. */
  2351. rtb_Sum6_p = (int16_T)((2365 * (int16_T)tmp_0) >> 11);
  2352. /* MATLAB Function: '<S61>/sector_select' incorporates:
  2353. * Product: '<S61>/Divide7'
  2354. * Sum: '<S60>/Sum1'
  2355. * Sum: '<S60>/Sum6'
  2356. */
  2357. if ((int16_T)tmp_0 >= 0) {
  2358. if ((int16_T)tmp >= 0) {
  2359. if (rtb_Sum6_p > ((int16_T)tmp << 1)) {
  2360. /* DataTypeConversion: '<S61>/Data Type Conversion' */
  2361. rtb_DataTypeConversion_j = 2U;
  2362. } else {
  2363. /* DataTypeConversion: '<S61>/Data Type Conversion' */
  2364. rtb_DataTypeConversion_j = 1U;
  2365. }
  2366. } else {
  2367. rtb_Gain_p2 = -rtb_Sum6_p;
  2368. if (-rtb_Sum6_p > 32767) {
  2369. rtb_Gain_p2 = 32767;
  2370. }
  2371. if (rtb_Gain_p2 > ((int16_T)tmp << 1)) {
  2372. /* DataTypeConversion: '<S61>/Data Type Conversion' */
  2373. rtb_DataTypeConversion_j = 3U;
  2374. } else {
  2375. /* DataTypeConversion: '<S61>/Data Type Conversion' */
  2376. rtb_DataTypeConversion_j = 2U;
  2377. }
  2378. }
  2379. } else if ((int16_T)tmp >= 0) {
  2380. rtb_Gain_p2 = -rtb_Sum6_p;
  2381. if (-rtb_Sum6_p > 32767) {
  2382. rtb_Gain_p2 = 32767;
  2383. }
  2384. if (rtb_Gain_p2 > ((int16_T)tmp << 1)) {
  2385. /* DataTypeConversion: '<S61>/Data Type Conversion' */
  2386. rtb_DataTypeConversion_j = 5U;
  2387. } else {
  2388. /* DataTypeConversion: '<S61>/Data Type Conversion' */
  2389. rtb_DataTypeConversion_j = 6U;
  2390. }
  2391. } else if (rtb_Sum6_p > ((int16_T)tmp << 1)) {
  2392. /* DataTypeConversion: '<S61>/Data Type Conversion' */
  2393. rtb_DataTypeConversion_j = 4U;
  2394. } else {
  2395. /* DataTypeConversion: '<S61>/Data Type Conversion' */
  2396. rtb_DataTypeConversion_j = 5U;
  2397. }
  2398. /* End of MATLAB Function: '<S61>/sector_select' */
  2399. /* Gain: '<S61>/Gain' incorporates:
  2400. * Inport: '<Root>/vDC'
  2401. */
  2402. rtb_Gain_p2 = 18919 * rtU->vDC;
  2403. /* Product: '<S61>/Divide' incorporates:
  2404. * Gain: '<S61>/Gain'
  2405. * Sum: '<S60>/Sum6'
  2406. */
  2407. rtb_Sum6_k = (int16_T)(((int64_T)(int16_T)tmp << 26) / rtb_Gain_p2);
  2408. /* Product: '<S61>/Divide1' incorporates:
  2409. * Gain: '<S61>/Gain'
  2410. * Sum: '<S60>/Sum1'
  2411. */
  2412. rtb_Sum1_a = (int16_T)(((int64_T)(int16_T)tmp_0 << 26) / rtb_Gain_p2);
  2413. /* MultiPortSwitch: '<S62>/Multiport Switch' incorporates:
  2414. * DataTypeConversion: '<S61>/Data Type Conversion1'
  2415. */
  2416. switch (rtb_DataTypeConversion_j) {
  2417. case 1:
  2418. /* Product: '<S64>/Divide3' incorporates:
  2419. * Constant: '<S61>/Constant1'
  2420. * DataTypeConversion: '<S61>/Data Type Conversion2'
  2421. * Product: '<S61>/Divide1'
  2422. * Product: '<S64>/Divide2'
  2423. */
  2424. rtb_Divide3_k = (int16_T)(((int16_T)((rtb_Sum1_a * 9459) >> 13) * (int16_T)
  2425. rtP.i_pwm_count) >> 12);
  2426. /* Product: '<S64>/Divide1' incorporates:
  2427. * Constant: '<S61>/Constant1'
  2428. * Constant: '<S64>/Constant'
  2429. * DataTypeConversion: '<S61>/Data Type Conversion2'
  2430. * Product: '<S61>/Divide'
  2431. * Product: '<S61>/Divide1'
  2432. * Product: '<S64>/Divide'
  2433. * Sum: '<S64>/Add'
  2434. */
  2435. rtb_Sum1_a = (int16_T)(((int16_T)(rtb_Sum6_k - ((rtb_Sum1_a * 9459) >> 14)) *
  2436. (int16_T)rtP.i_pwm_count) >> 12);
  2437. /* Product: '<S64>/Divide4' incorporates:
  2438. * Constant: '<S61>/Constant1'
  2439. * DataTypeConversion: '<S61>/Data Type Conversion2'
  2440. * Sum: '<S64>/Add1'
  2441. * Sum: '<S64>/Add2'
  2442. */
  2443. rtb_Sum6_p = (int16_T)((int16_T)((int16_T)((int16_T)rtP.i_pwm_count -
  2444. rtb_Sum1_a) - rtb_Divide3_k) >> 1);
  2445. /* Sum: '<S64>/Add3' */
  2446. rtb_Sum6_k = (int16_T)(rtb_Sum6_p + rtb_Divide3_k);
  2447. /* Outport: '<Root>/pwm_Duty' incorporates:
  2448. * Sum: '<S64>/Add4'
  2449. */
  2450. rtY->pwm_Duty[0] = (int16_T)(rtb_Sum6_k + rtb_Sum1_a);
  2451. rtY->pwm_Duty[1] = rtb_Sum6_k;
  2452. rtY->pwm_Duty[2] = rtb_Sum6_p;
  2453. break;
  2454. case 2:
  2455. /* Product: '<S65>/Divide1' incorporates:
  2456. * Constant: '<S61>/Constant1'
  2457. * Constant: '<S65>/Constant'
  2458. * DataTypeConversion: '<S61>/Data Type Conversion2'
  2459. * Product: '<S61>/Divide'
  2460. * Product: '<S61>/Divide1'
  2461. * Product: '<S65>/Divide'
  2462. * Sum: '<S65>/Add'
  2463. */
  2464. rtb_Divide3_k = (int16_T)(((int16_T)(((rtb_Sum1_a * 9459) >> 14) +
  2465. rtb_Sum6_k) * (int16_T)rtP.i_pwm_count) >> 12);
  2466. /* Product: '<S65>/Divide3' incorporates:
  2467. * Constant: '<S61>/Constant1'
  2468. * Constant: '<S65>/Constant'
  2469. * DataTypeConversion: '<S61>/Data Type Conversion2'
  2470. * Product: '<S61>/Divide'
  2471. * Product: '<S61>/Divide1'
  2472. * Product: '<S65>/Divide2'
  2473. * Sum: '<S65>/Add5'
  2474. */
  2475. rtb_Sum1_a = (int16_T)(((int16_T)(((rtb_Sum1_a * 9459) >> 14) - rtb_Sum6_k) *
  2476. (int16_T)rtP.i_pwm_count) >> 12);
  2477. /* Product: '<S65>/Divide4' incorporates:
  2478. * Constant: '<S61>/Constant1'
  2479. * DataTypeConversion: '<S61>/Data Type Conversion2'
  2480. * Sum: '<S65>/Add1'
  2481. * Sum: '<S65>/Add2'
  2482. */
  2483. rtb_Sum6_p = (int16_T)((int16_T)((int16_T)((int16_T)rtP.i_pwm_count -
  2484. rtb_Sum1_a) - rtb_Divide3_k) >> 1);
  2485. /* Sum: '<S65>/Add3' */
  2486. rtb_Sum6_k = (int16_T)(rtb_Sum6_p + rtb_Divide3_k);
  2487. /* Outport: '<Root>/pwm_Duty' incorporates:
  2488. * Sum: '<S65>/Add4'
  2489. */
  2490. rtY->pwm_Duty[0] = rtb_Sum6_k;
  2491. rtY->pwm_Duty[1] = (int16_T)(rtb_Sum6_k + rtb_Sum1_a);
  2492. rtY->pwm_Duty[2] = rtb_Sum6_p;
  2493. break;
  2494. case 3:
  2495. /* Product: '<S66>/Divide1' incorporates:
  2496. * Constant: '<S61>/Constant1'
  2497. * Constant: '<S66>/Constant'
  2498. * DataTypeConversion: '<S61>/Data Type Conversion2'
  2499. * Product: '<S61>/Divide'
  2500. * Product: '<S61>/Divide1'
  2501. * Product: '<S66>/Divide'
  2502. * Sum: '<S66>/Add'
  2503. */
  2504. rtb_Sum6_k = (int16_T)(((int16_T)(-rtb_Sum6_k - ((rtb_Sum1_a * 9459) >> 14))
  2505. * (int16_T)rtP.i_pwm_count) >> 12);
  2506. /* Product: '<S66>/Divide3' incorporates:
  2507. * Constant: '<S61>/Constant1'
  2508. * DataTypeConversion: '<S61>/Data Type Conversion2'
  2509. * Product: '<S61>/Divide1'
  2510. * Product: '<S66>/Divide2'
  2511. */
  2512. rtb_Sum1_a = (int16_T)(((int16_T)((rtb_Sum1_a * 9459) >> 13) * (int16_T)
  2513. rtP.i_pwm_count) >> 12);
  2514. /* Product: '<S66>/Divide4' incorporates:
  2515. * Constant: '<S61>/Constant1'
  2516. * DataTypeConversion: '<S61>/Data Type Conversion2'
  2517. * Sum: '<S66>/Add1'
  2518. * Sum: '<S66>/Add2'
  2519. */
  2520. rtb_Sum6_p = (int16_T)((int16_T)((int16_T)((int16_T)rtP.i_pwm_count -
  2521. rtb_Sum1_a) - rtb_Sum6_k) >> 1);
  2522. /* Sum: '<S66>/Add3' */
  2523. rtb_Sum6_k += rtb_Sum6_p;
  2524. /* Outport: '<Root>/pwm_Duty' incorporates:
  2525. * Sum: '<S66>/Add4'
  2526. */
  2527. rtY->pwm_Duty[0] = rtb_Sum6_p;
  2528. rtY->pwm_Duty[1] = (int16_T)(rtb_Sum6_k + rtb_Sum1_a);
  2529. rtY->pwm_Duty[2] = rtb_Sum6_k;
  2530. break;
  2531. case 4:
  2532. /* Product: '<S67>/Divide1' incorporates:
  2533. * Constant: '<S61>/Constant1'
  2534. * Constant: '<S67>/Constant'
  2535. * DataTypeConversion: '<S61>/Data Type Conversion2'
  2536. * Product: '<S61>/Divide'
  2537. * Product: '<S61>/Divide1'
  2538. * Product: '<S67>/Divide'
  2539. * Sum: '<S67>/Add'
  2540. */
  2541. rtb_Sum6_k = (int16_T)(((int16_T)(((rtb_Sum1_a * 9459) >> 14) - rtb_Sum6_k) *
  2542. (int16_T)rtP.i_pwm_count) >> 12);
  2543. /* Product: '<S67>/Divide3' incorporates:
  2544. * Constant: '<S61>/Constant1'
  2545. * DataTypeConversion: '<S61>/Data Type Conversion2'
  2546. * Product: '<S61>/Divide1'
  2547. * Product: '<S67>/Divide2'
  2548. * Sum: '<S67>/Add5'
  2549. */
  2550. rtb_Sum1_a = (int16_T)(((int16_T)(-((int16_T)((rtb_Sum1_a * 9459) >> 13) <<
  2551. 2) >> 2) * (int16_T)rtP.i_pwm_count) >> 12);
  2552. /* Product: '<S67>/Divide4' incorporates:
  2553. * Constant: '<S61>/Constant1'
  2554. * DataTypeConversion: '<S61>/Data Type Conversion2'
  2555. * Sum: '<S67>/Add1'
  2556. * Sum: '<S67>/Add2'
  2557. */
  2558. rtb_Sum6_p = (int16_T)((int16_T)((int16_T)((int16_T)rtP.i_pwm_count -
  2559. rtb_Sum1_a) - rtb_Sum6_k) >> 1);
  2560. /* Sum: '<S67>/Add3' */
  2561. rtb_Sum6_k += rtb_Sum6_p;
  2562. /* Outport: '<Root>/pwm_Duty' incorporates:
  2563. * Sum: '<S67>/Add4'
  2564. */
  2565. rtY->pwm_Duty[0] = rtb_Sum6_p;
  2566. rtY->pwm_Duty[1] = rtb_Sum6_k;
  2567. rtY->pwm_Duty[2] = (int16_T)(rtb_Sum6_k + rtb_Sum1_a);
  2568. break;
  2569. case 5:
  2570. /* Product: '<S68>/Divide3' incorporates:
  2571. * Constant: '<S61>/Constant1'
  2572. * Constant: '<S68>/Constant'
  2573. * DataTypeConversion: '<S61>/Data Type Conversion2'
  2574. * Product: '<S61>/Divide'
  2575. * Product: '<S61>/Divide1'
  2576. * Product: '<S68>/Divide2'
  2577. * Sum: '<S68>/Add5'
  2578. */
  2579. rtb_Divide3_k = (int16_T)(((int16_T)(rtb_Sum6_k - ((rtb_Sum1_a * 9459) >> 14))
  2580. * (int16_T)rtP.i_pwm_count) >> 12);
  2581. /* Product: '<S68>/Divide1' incorporates:
  2582. * Constant: '<S61>/Constant1'
  2583. * Constant: '<S68>/Constant'
  2584. * DataTypeConversion: '<S61>/Data Type Conversion2'
  2585. * Product: '<S61>/Divide'
  2586. * Product: '<S61>/Divide1'
  2587. * Product: '<S68>/Divide'
  2588. * Sum: '<S68>/Add'
  2589. */
  2590. rtb_Sum1_a = (int16_T)(((int16_T)(-rtb_Sum6_k - ((rtb_Sum1_a * 9459) >> 14))
  2591. * (int16_T)rtP.i_pwm_count) >> 12);
  2592. /* Product: '<S68>/Divide4' incorporates:
  2593. * Constant: '<S61>/Constant1'
  2594. * DataTypeConversion: '<S61>/Data Type Conversion2'
  2595. * Sum: '<S68>/Add1'
  2596. * Sum: '<S68>/Add2'
  2597. */
  2598. rtb_Sum6_p = (int16_T)((int16_T)((int16_T)((int16_T)rtP.i_pwm_count -
  2599. rtb_Sum1_a) - rtb_Divide3_k) >> 1);
  2600. /* Sum: '<S68>/Add3' */
  2601. rtb_Sum6_k = (int16_T)(rtb_Sum6_p + rtb_Divide3_k);
  2602. /* Outport: '<Root>/pwm_Duty' incorporates:
  2603. * Sum: '<S68>/Add4'
  2604. */
  2605. rtY->pwm_Duty[0] = rtb_Sum6_k;
  2606. rtY->pwm_Duty[1] = rtb_Sum6_p;
  2607. rtY->pwm_Duty[2] = (int16_T)(rtb_Sum6_k + rtb_Sum1_a);
  2608. break;
  2609. default:
  2610. /* Product: '<S69>/Divide3' incorporates:
  2611. * Constant: '<S61>/Constant1'
  2612. * DataTypeConversion: '<S61>/Data Type Conversion2'
  2613. * Product: '<S61>/Divide1'
  2614. * Product: '<S69>/Divide2'
  2615. * Sum: '<S69>/Add5'
  2616. */
  2617. rtb_Divide3_k = (int16_T)(((int16_T)(-((int16_T)((rtb_Sum1_a * 9459) >> 13) <<
  2618. 2) >> 2) * (int16_T)rtP.i_pwm_count) >> 12);
  2619. /* Product: '<S69>/Divide1' incorporates:
  2620. * Constant: '<S61>/Constant1'
  2621. * Constant: '<S69>/Constant'
  2622. * DataTypeConversion: '<S61>/Data Type Conversion2'
  2623. * Product: '<S61>/Divide'
  2624. * Product: '<S61>/Divide1'
  2625. * Product: '<S69>/Divide'
  2626. * Sum: '<S69>/Add'
  2627. */
  2628. rtb_Sum1_a = (int16_T)(((int16_T)(((rtb_Sum1_a * 9459) >> 14) + rtb_Sum6_k) *
  2629. (int16_T)rtP.i_pwm_count) >> 12);
  2630. /* Product: '<S69>/Divide4' incorporates:
  2631. * Constant: '<S61>/Constant1'
  2632. * DataTypeConversion: '<S61>/Data Type Conversion2'
  2633. * Sum: '<S69>/Add1'
  2634. * Sum: '<S69>/Add2'
  2635. */
  2636. rtb_Sum6_p = (int16_T)((int16_T)((int16_T)((int16_T)rtP.i_pwm_count -
  2637. rtb_Sum1_a) - rtb_Divide3_k) >> 1);
  2638. /* Sum: '<S69>/Add3' */
  2639. rtb_Sum6_k = (int16_T)(rtb_Sum6_p + rtb_Divide3_k);
  2640. /* Outport: '<Root>/pwm_Duty' incorporates:
  2641. * Sum: '<S69>/Add4'
  2642. */
  2643. rtY->pwm_Duty[0] = (int16_T)(rtb_Sum6_k + rtb_Sum1_a);
  2644. rtY->pwm_Duty[1] = rtb_Sum6_p;
  2645. rtY->pwm_Duty[2] = rtb_Sum6_k;
  2646. break;
  2647. }
  2648. /* End of MultiPortSwitch: '<S62>/Multiport Switch' */
  2649. /* Switch: '<S119>/Switch2' */
  2650. if (rtb_LogicalOperator12) {
  2651. /* Update for UnitDelay: '<S119>/UnitDelay' incorporates:
  2652. * UnitDelay: '<S98>/Unit Delay1'
  2653. */
  2654. rtDW->UnitDelay_DSTATE_d = rtDW->UnitDelay1_DSTATE_b;
  2655. } else {
  2656. /* Update for UnitDelay: '<S119>/UnitDelay' incorporates:
  2657. * Sum: '<S118>/Add2'
  2658. */
  2659. rtDW->UnitDelay_DSTATE_d = (int16_T)rtb_Divide_idx_1;
  2660. }
  2661. /* End of Switch: '<S119>/Switch2' */
  2662. /* Switch: '<S112>/Switch2' */
  2663. if (rtb_Equal_k) {
  2664. /* Update for UnitDelay: '<S112>/UnitDelay' incorporates:
  2665. * UnitDelay: '<S97>/Unit Delay1'
  2666. */
  2667. rtDW->UnitDelay_DSTATE_b = rtDW->UnitDelay1_DSTATE_i;
  2668. } else {
  2669. /* Update for UnitDelay: '<S112>/UnitDelay' incorporates:
  2670. * Sum: '<S111>/Add2'
  2671. */
  2672. rtDW->UnitDelay_DSTATE_b = (int16_T)rtb_Divide_idx_0;
  2673. }
  2674. /* End of Switch: '<S112>/Switch2' */
  2675. /* Switch: '<S37>/Switch1' incorporates:
  2676. * RelationalOperator: '<S39>/Relational Operator'
  2677. * UnitDelay: '<S39>/UnitDelay'
  2678. */
  2679. if (rtb_n_commDeacv != rtDW->UnitDelay_DSTATE_bv) {
  2680. rtb_UnitDelay = rtb_Sum_i;
  2681. }
  2682. /* End of Switch: '<S37>/Switch1' */
  2683. /* Update for UnitDelay: '<S6>/UnitDelay1' incorporates:
  2684. * Switch: '<S51>/Switch'
  2685. */
  2686. rtDW->UnitDelay1_DSTATE_f[0] = rtb_Switch_f2_idx_0;
  2687. rtDW->UnitDelay1_DSTATE_f[1] = rtb_Switch_f2_idx_1;
  2688. /* Update for UnitDelay: '<S37>/UnitDelay' */
  2689. rtDW->UnitDelay_DSTATE_j = rtb_UnitDelay;
  2690. /* Update for Delay: '<S9>/Delay' incorporates:
  2691. * Inport: '<Root>/hall_A'
  2692. */
  2693. rtDW->Delay_DSTATE_d = rtU->hall_A;
  2694. /* Update for Delay: '<S9>/Delay1' incorporates:
  2695. * Inport: '<Root>/hall_B'
  2696. */
  2697. rtDW->Delay1_DSTATE = rtU->hall_B;
  2698. /* Update for Delay: '<S9>/Delay2' incorporates:
  2699. * Inport: '<Root>/hall_C'
  2700. */
  2701. rtDW->Delay2_DSTATE = rtU->hall_C;
  2702. /* Update for UnitDelay: '<S14>/UnitDelay3' incorporates:
  2703. * Inport: '<Root>/us_Count'
  2704. */
  2705. rtDW->UnitDelay3_DSTATE = rtU->us_Count;
  2706. /* Update for UnitDelay: '<S14>/UnitDelay4' incorporates:
  2707. * Abs: '<S14>/Abs5'
  2708. */
  2709. rtDW->UnitDelay4_DSTATE = rtb_Switch2;
  2710. /* Update for UnitDelay: '<S38>/UnitDelay' */
  2711. rtDW->UnitDelay_DSTATE_k = rtb_n_commDeacv;
  2712. /* Update for UnitDelay: '<S42>/UnitDelay' */
  2713. rtDW->UnitDelay_DSTATE_nx = rtb_RelationalOperator4_f;
  2714. /* Update for UnitDelay: '<S7>/UnitDelay1' incorporates:
  2715. * Sum: '<S7>/Sum3'
  2716. */
  2717. rtDW->UnitDelay1_DSTATE = qY;
  2718. /* If: '<S53>/If' */
  2719. if (rtb_Sum2 == 0) {
  2720. /* Update for IfAction SubSystem: '<S53>/Do_Calc' incorporates:
  2721. * ActionPort: '<S70>/Action Port'
  2722. */
  2723. /* Update for UnitDelay: '<S70>/Unit Delay' */
  2724. rtDW->UnitDelay_DSTATE_p2 = rtb_z_ctrlMod;
  2725. /* Update for UnitDelay: '<S70>/Unit Delay1' incorporates:
  2726. * Merge: '<S73>/Merge'
  2727. */
  2728. rtDW->UnitDelay1_DSTATE_g = rtDW->Merge_f;
  2729. /* Update for If: '<S73>/If' */
  2730. switch (rtDW->If_ActiveSubsystem_h) {
  2731. case 0:
  2732. /* Update for IfAction SubSystem: '<S73>/speed_mode' incorporates:
  2733. * ActionPort: '<S87>/Action Port'
  2734. */
  2735. /* Update for UnitDelay: '<S87>/Unit Delay' incorporates:
  2736. * Sqrt: '<S86>/Sqrt1'
  2737. */
  2738. rtDW->UnitDelay_DSTATE_l = rtb_Min;
  2739. /* End of Update for SubSystem: '<S73>/speed_mode' */
  2740. break;
  2741. case 1:
  2742. /* Update for IfAction SubSystem: '<S73>/torque_mode' incorporates:
  2743. * ActionPort: '<S88>/Action Port'
  2744. */
  2745. /* Update for Delay: '<S88>/Delay' incorporates:
  2746. * Sqrt: '<S86>/Sqrt1'
  2747. */
  2748. rtDW->icLoad_p = 0U;
  2749. rtDW->Delay_DSTATE = rtb_Min;
  2750. /* End of Update for SubSystem: '<S73>/torque_mode' */
  2751. break;
  2752. }
  2753. /* End of Update for If: '<S73>/If' */
  2754. /* Update for UnitDelay: '<S74>/Unit Delay1' incorporates:
  2755. * Sqrt: '<S51>/Sqrt'
  2756. */
  2757. rtDW->UnitDelay1_DSTATE_c = rtb_BitwiseOperator2;
  2758. /* Update for UnitDelay: '<S77>/Unit Delay' incorporates:
  2759. * Sum: '<S77>/Sum'
  2760. */
  2761. rtDW->UnitDelay_DSTATE = rtb_MathFunction2_p;
  2762. /* Update for Delay: '<S78>/Resettable Delay' incorporates:
  2763. * Sum: '<S78>/Sum1'
  2764. */
  2765. rtDW->icLoad = 0U;
  2766. rtDW->ResettableDelay_DSTATE = rtb_Sum1_f;
  2767. /* End of Update for SubSystem: '<S53>/Do_Calc' */
  2768. }
  2769. /* Update for UnitDelay: '<S106>/UnitDelay' incorporates:
  2770. * Switch: '<S84>/Switch2'
  2771. */
  2772. rtDW->UnitDelay_DSTATE_h = rtDW->Switch2;
  2773. /* Update for UnitDelay: '<S97>/Unit Delay1' incorporates:
  2774. * Switch: '<S110>/Switch2'
  2775. */
  2776. rtDW->UnitDelay1_DSTATE_i = rtb_Divide1_m;
  2777. /* Update for UnitDelay: '<S108>/Unit Delay' incorporates:
  2778. * Switch: '<S110>/Switch2'
  2779. */
  2780. rtDW->UnitDelay_DSTATE_g = rtb_Divide1_m;
  2781. /* Update for UnitDelay: '<S113>/UnitDelay' incorporates:
  2782. * Switch: '<S76>/Switch'
  2783. */
  2784. rtDW->UnitDelay_DSTATE_o = rtDW->Switch;
  2785. /* Update for UnitDelay: '<S98>/Unit Delay1' incorporates:
  2786. * Switch: '<S117>/Switch2'
  2787. */
  2788. rtDW->UnitDelay1_DSTATE_b = rtb_r_cos_M1;
  2789. /* Update for UnitDelay: '<S115>/Unit Delay' incorporates:
  2790. * Switch: '<S117>/Switch2'
  2791. */
  2792. rtDW->UnitDelay_DSTATE_a = rtb_r_cos_M1;
  2793. /* Update for UnitDelay: '<S54>/Unit Delay' */
  2794. rtDW->UnitDelay_DSTATE_bm = rtb_z_ctrlMod;
  2795. /* Update for UnitDelay: '<S39>/UnitDelay' */
  2796. rtDW->UnitDelay_DSTATE_bv = rtb_n_commDeacv;
  2797. /* End of Outputs for SubSystem: '<Root>/PMSM_Controller' */
  2798. /* Outport: '<Root>/f_Vdq' incorporates:
  2799. * UnitDelay: '<S6>/UnitDelay1'
  2800. */
  2801. rtY->f_Vdq[0] = rtb_UnitDelay1_m[0];
  2802. rtY->f_Vdq[1] = rtb_UnitDelay1_m[1];
  2803. /* Outport: '<Root>/n_Sector' */
  2804. rtY->n_Sector = rtb_DataTypeConversion_j;
  2805. /* Outport: '<Root>/n_MotError' */
  2806. rtY->n_MotError = rtb_UnitDelay;
  2807. /* Outport: '<Root>/f_MotAngle' incorporates:
  2808. * Merge: '<S3>/Merge'
  2809. */
  2810. rtY->f_MotAngle = rtDW->Merge_i;
  2811. /* Outport: '<Root>/f_MotRPM' incorporates:
  2812. * Switch: '<S14>/Switch2'
  2813. */
  2814. rtY->f_MotRPM = rtb_Switch3;
  2815. /* Outport: '<Root>/f_hallAngle' incorporates:
  2816. * Merge: '<S15>/Merge'
  2817. */
  2818. rtY->f_hallAngle = rtb_Sum3_jm;
  2819. /* Outport: '<Root>/n_hallStat' */
  2820. rtY->n_hallStat = rtb_Add_gf;
  2821. /* Outport: '<Root>/n_runingMode' */
  2822. rtY->n_runingMode = rtb_z_ctrlMod;
  2823. }
  2824. /* Model initialize function */
  2825. void PMSM_Controller_initialize(RT_MODEL *const rtM)
  2826. {
  2827. DW *rtDW = rtM->dwork;
  2828. PrevZCX *rtPrevZCX = rtM->prevZCSigState;
  2829. ExtY *rtY = (ExtY *) rtM->outputs;
  2830. rtPrevZCX->ResettableDelay_Reset_ZCE_a = POS_ZCSIG;
  2831. rtPrevZCX->ResettableDelay_Reset_ZCE_o = POS_ZCSIG;
  2832. rtPrevZCX->PI_backCalc_fixdt1.ResettableDelay_Reset_ZCE = POS_ZCSIG;
  2833. rtPrevZCX->PI_backCalc_fixdt_o3.ResettableDelay_Reset_ZCE = POS_ZCSIG;
  2834. rtPrevZCX->PI_Speed.ResettableDelay_Reset_ZCE_f = POS_ZCSIG;
  2835. /* SystemInitialize for Atomic SubSystem: '<Root>/PMSM_Controller' */
  2836. /* SystemInitialize for IfAction SubSystem: '<S14>/Raw_Motor_Speed_Estimation' */
  2837. /* InitializeConditions for UnitDelay: '<S20>/UnitDelay2' */
  2838. rtDW->UnitDelay2_DSTATE = rtP.n_hall_count_ps;
  2839. /* SystemInitialize for Outport: '<S20>/z_counter' incorporates:
  2840. * Inport: '<S20>/z_counterRawPrev'
  2841. */
  2842. rtDW->z_counterRawPrev = rtP.n_hall_count_ps;
  2843. /* End of SystemInitialize for SubSystem: '<S14>/Raw_Motor_Speed_Estimation' */
  2844. /* SystemInitialize for IfAction SubSystem: '<S53>/Do_Calc' */
  2845. /* Start for If: '<S73>/If' */
  2846. rtDW->If_ActiveSubsystem_h = -1;
  2847. /* InitializeConditions for Delay: '<S78>/Resettable Delay' */
  2848. rtDW->icLoad = 1U;
  2849. /* SystemInitialize for IfAction SubSystem: '<S73>/speed_mode' */
  2850. /* SystemInitialize for Atomic SubSystem: '<S87>/PI_Speed' */
  2851. PI_backCalc_fixdt_Init(&rtDW->PI_Speed);
  2852. /* End of SystemInitialize for SubSystem: '<S87>/PI_Speed' */
  2853. /* End of SystemInitialize for SubSystem: '<S73>/speed_mode' */
  2854. /* SystemInitialize for IfAction SubSystem: '<S73>/torque_mode' */
  2855. /* InitializeConditions for Delay: '<S88>/Delay' */
  2856. rtDW->icLoad_p = 1U;
  2857. /* SystemInitialize for Atomic SubSystem: '<S88>/PI_TrqSpdLim' */
  2858. /* InitializeConditions for Delay: '<S93>/Resettable Delay' */
  2859. rtDW->icLoad_k = 1U;
  2860. /* End of SystemInitialize for SubSystem: '<S88>/PI_TrqSpdLim' */
  2861. /* End of SystemInitialize for SubSystem: '<S73>/torque_mode' */
  2862. /* End of SystemInitialize for SubSystem: '<S53>/Do_Calc' */
  2863. /* SystemInitialize for IfAction SubSystem: '<S54>/CurrentLoop' */
  2864. /* SystemInitialize for Atomic SubSystem: '<S95>/PI_backCalc_fixdt' */
  2865. PI_backCalc_fixdt_p_Init(&rtDW->PI_backCalc_fixdt_o3);
  2866. /* End of SystemInitialize for SubSystem: '<S95>/PI_backCalc_fixdt' */
  2867. /* SystemInitialize for Atomic SubSystem: '<S95>/PI_backCalc_fixdt1' */
  2868. PI_backCalc_fixdt_p_Init(&rtDW->PI_backCalc_fixdt1);
  2869. /* End of SystemInitialize for SubSystem: '<S95>/PI_backCalc_fixdt1' */
  2870. /* End of SystemInitialize for SubSystem: '<S54>/CurrentLoop' */
  2871. /* End of SystemInitialize for SubSystem: '<Root>/PMSM_Controller' */
  2872. /* SystemInitialize for Outport: '<Root>/f_MotAngle' incorporates:
  2873. * Merge: '<S3>/Merge'
  2874. */
  2875. rtY->f_MotAngle = rtDW->Merge_i;
  2876. }
  2877. /*
  2878. * File trailer for generated code.
  2879. *
  2880. * [EOF]
  2881. */