crdnt.c 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. /************************************************************************
  2. Project: Welling Motor Control Paltform
  3. Filename: crdnt.c
  4. Partner Filename: crdnt.h
  5. Description: Coordinate transformation
  6. Complier: IAR Embedded Workbench for ARM 7.80, IAR Systems.
  7. CPU TYPE : GD32F3x0
  8. *************************************************************************
  9. Copyright (c) 2018 Welling Motor Technology(Shanghai) Co. Ltd.
  10. All rights reserved.
  11. *************************************************************************
  12. *************************************************************************
  13. Revising History (ECL of this file):
  14. ************************************************************************/
  15. /************************************************************************
  16. Beginning of File, do not put anything above here except notes
  17. Compiler Directives:
  18. *************************************************************************/
  19. #ifndef _CRDNT_C_
  20. #define _CRDNT_C_
  21. #endif
  22. /************************************************************************
  23. Included File:
  24. *************************************************************************/
  25. #include "user.h"
  26. /************************************************************************
  27. Constant Table:
  28. *************************************************************************/
  29. /************************************************************************
  30. Exported Functions:
  31. *************************************************************************/
  32. /***************************************************************
  33. Function: crd_voClark;
  34. Description: clark transformation
  35. Call by: functions in TBC;
  36. Input Variables: CRD_CLARK_IN
  37. Output/Return Variables: CRD_CLARK_OUT(Q format=CRD_CLARK_IN)
  38. Subroutine Call: N/A;
  39. Reference: N/A
  40. ****************************************************************/
  41. void crd_voClark(CRD_CLARK_IN *in, CRD_CLARK_OUT *out)
  42. {
  43. SLONG slClark; //(Q15)
  44. /*--------------------------------------
  45. Ialfa = 2/3 * ia - 1/3 * ib - 1/3 * ic
  46. ---------------------------------------*/
  47. slClark = ((SLONG)in->swAPu * 2 - in->swBPu - in->swCPu) * 10923 >> 15; // 10923 1/3 (Q15)
  48. if (slClark > 32767)
  49. {
  50. out->swAlphaPu = 32767;
  51. }
  52. else if (slClark < -32768)
  53. {
  54. out->swAlphaPu = -32768;
  55. }
  56. else
  57. {
  58. out->swAlphaPu = (SWORD)slClark;
  59. }
  60. /*--------------------------------------
  61. Ibeta = 1 / sqrt(3) * (ib - ic)
  62. --------------------------------------*/
  63. slClark = ((SLONG)in->swBPu - in->swCPu) * 18919 >> 15; // 18919 1/sqrt(3) (Q15)
  64. if (slClark > 32767)
  65. {
  66. out->swBetaPu = 32767;
  67. }
  68. else if (slClark < -32768)
  69. {
  70. out->swBetaPu = -32768;
  71. }
  72. else
  73. {
  74. out->swBetaPu = (SWORD)slClark;
  75. }
  76. }
  77. /***************************************************************
  78. Function: crd_voPark;
  79. Description: Park transformation
  80. Call by: functions in TBC;
  81. Input Variables: CRD_PARK_IN
  82. Output/Return Variables: CRD_PARK_OUT
  83. Subroutine Call: mth_voSinCos;
  84. Reference: N/A
  85. ****************************************************************/
  86. void crd_voPark(CRD_PARK_IN *in, CRD_PARK_OUT *out)
  87. {
  88. SLONG slPark; //(Q15)
  89. SINCOS stPark_SINCOS;
  90. mth_voSinCos(in->uwThetaPu, &stPark_SINCOS); // calculate sin and cos
  91. /*--------------------------------------
  92. id = ialfa * cos + ibeta * sin
  93. ---------------------------------------*/
  94. slPark = ((SLONG)in->swAlphaPu * stPark_SINCOS.swCosPu >> 15) + ((SLONG)in->swBetaPu * stPark_SINCOS.swSinPu >> 15);
  95. if (slPark > 32767)
  96. {
  97. out->swDPu = 32767;
  98. }
  99. else if (slPark < -32768)
  100. {
  101. out->swDPu = -32768;
  102. }
  103. else
  104. {
  105. out->swDPu = (SWORD)slPark;
  106. }
  107. /*--------------------------------------
  108. iq = -ialfa * sin + ibeta * cos
  109. ---------------------------------------*/
  110. slPark = (-(SLONG)in->swAlphaPu * stPark_SINCOS.swSinPu >> 15) + ((SLONG)in->swBetaPu * stPark_SINCOS.swCosPu >> 15);
  111. if (slPark > 32767)
  112. {
  113. out->swQPu = 32767;
  114. }
  115. else if (slPark < -32768)
  116. {
  117. out->swQPu = -32768;
  118. }
  119. else
  120. {
  121. out->swQPu = (SWORD)slPark;
  122. }
  123. }
  124. /***************************************************************
  125. Function: crd_voIpark;
  126. Description: inverse park transformation
  127. Call by: functions in TBC;
  128. Input Variables: CRD_IPARK_IN
  129. Output/Return Variables: CRD_IPARK_OUT
  130. Subroutine Call: mth_vo_SinCos;
  131. Reference: N/A
  132. ****************************************************************/
  133. void crd_voIPark(CRD_IPARK_IN *in, CRD_IPARK_OUT *out)
  134. {
  135. SLONG slIPark; //(Q15)
  136. SINCOS stIPark_SINCOS;
  137. mth_voSinCos(in->uwThetaPu, &stIPark_SINCOS); // calculate sin and cos
  138. /*--------------------------------------
  139. ialfa = id * cos - iq * sin
  140. --------------------------------------*/
  141. slIPark = ((SLONG)in->swDPu * stIPark_SINCOS.swCosPu >> 15) - ((SLONG)in->swQPu * stIPark_SINCOS.swSinPu >> 15);
  142. if (slIPark > 32767)
  143. {
  144. out->swAlphaPu = 32767;
  145. }
  146. else if (slIPark < -32768)
  147. {
  148. out->swAlphaPu = -32768;
  149. }
  150. else
  151. {
  152. out->swAlphaPu = (SWORD)slIPark;
  153. }
  154. /*--------------------------------------
  155. ibeta = id * sin + iq * cos
  156. --------------------------------------*/
  157. slIPark = ((SLONG)in->swDPu * stIPark_SINCOS.swSinPu >> 15) + ((SLONG)in->swQPu * stIPark_SINCOS.swCosPu >> 15);
  158. if (slIPark > 32767)
  159. {
  160. out->swBetaPu = 32767;
  161. }
  162. else if (slIPark < -32768)
  163. {
  164. out->swBetaPu = -32768;
  165. }
  166. else
  167. {
  168. out->swBetaPu = (SWORD)slIPark;
  169. }
  170. }
  171. /***************************************************************
  172. Function: crd_voIClark;
  173. Description: inverse clark transformation
  174. Call by: functions in TBC;
  175. Input Variables: CRD_ICLARK_IN
  176. Output/Return Variables: CRD_ICLARK_OUT
  177. Subroutine Call:
  178. Reference: N/A
  179. ****************************************************************/
  180. void crd_voIClark(CRD_ICLARK_IN *in, CRD_ICLARK_OUT *out)
  181. {
  182. SLONG slIClark;
  183. /*--------------------------------------
  184. ia = ialfa
  185. ---------------------------------------*/
  186. out->swIClarkaPu = in->swIClarkAlfaPu;
  187. /*--------------------------------------
  188. ib = -1/2 * ialfa + sqrt(3)/2 * ibeta
  189. ---------------------------------------*/
  190. slIClark = (((SLONG)in->swIClarkBetaPu * 28378 >> 14) - in->swIClarkAlfaPu) >> 1; // Tmp (Q15),28378=sqrt(3) Q(14)
  191. if (slIClark > 32767)
  192. {
  193. out->swIClarkbPu = 32767;
  194. }
  195. else if (slIClark < -32768)
  196. {
  197. out->swIClarkbPu = -32768;
  198. }
  199. else
  200. {
  201. out->swIClarkbPu = (SWORD)slIClark;
  202. }
  203. /*--------------------------------------
  204. ic = -1/2 * ialfa - sqrt(3)/2 * ibeta
  205. ---------------------------------------*/
  206. slIClark = (-((SLONG)in->swIClarkBetaPu * 28378 >> 14) - in->swIClarkAlfaPu) >> 1; // Tmp (Q15),28378=sqrt(3) Q(14)
  207. if (slIClark > 32767)
  208. {
  209. out->swIClarkcPu = 32767;
  210. }
  211. else if (slIClark < -32768)
  212. {
  213. out->swIClarkcPu = -32768;
  214. }
  215. else
  216. {
  217. out->swIClarkcPu = (SWORD)slIClark;
  218. }
  219. }
  220. /************************************************************************
  221. Local Functions: N/A
  222. *************************************************************************/
  223. /************************************************************************
  224. Copyright (c) 2018 Welling Motor Technology(Shanghai) Co., Ltd.
  225. All rights reserved.
  226. *************************************************************************/
  227. #ifdef _CRDNT_C_
  228. #undef _CRDNT_C_
  229. #endif
  230. /*************************************************************************
  231. End of this File (EOF)!
  232. Do not put anything after this part!
  233. *************************************************************************/