MOTOR_STEP_ATY.c 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. /**
  2. * @file MOTOR_STEP_ATY.c
  3. *
  4. * @param Project DEVICE_GENERAL_ATY_LIB
  5. *
  6. * @author ATY
  7. *
  8. * @copyright
  9. * - Copyright 2017 - 2023 MZ-ATY
  10. * - This code follows:
  11. * - MZ-ATY Various Contents Joint Statement -
  12. * <a href="https://mengze.top/MZ-ATY_VCJS">
  13. * https://mengze.top/MZ-ATY_VCJS</a>
  14. * - CC 4.0 BY-NC-SA -
  15. * <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">
  16. * https://creativecommons.org/licenses/by-nc-sa/4.0/</a>
  17. * - Your use will be deemed to have accepted the terms of this statement.
  18. *
  19. * @brief Familiar functions of SteppingMotor control
  20. *
  21. * @version
  22. * - 1_01_221231 > ATY
  23. * -# Preliminary version, first Release
  24. * - 1_02_230408 > ATY
  25. * -# Add State Machine and so
  26. * - 1_03_230426 > ATY
  27. * -# Change name "SteppingMotor_ATY" to "MOTOR_STEP_ATY"
  28. ********************************************************************************
  29. */
  30. #ifndef __MOTOR_STEP_ATY_C
  31. #define __MOTOR_STEP_ATY_C
  32. #include "MOTOR_STEP_ATY.h"
  33. /******************************* For user *************************************/
  34. /******************************************************************************/
  35. uint8_t motorEn = 0;
  36. uint8_t motorDir = MOTOR_DIR_OUT;
  37. uint32_t motorSoftSpeed = 0;
  38. uint32_t motorSpeed = 0;
  39. uint32_t motorSoftTime = 0;
  40. uint32_t motorTime = 0;
  41. uint32_t motorStartCounter = 0;
  42. uint32_t motorStopCounter = 0; // for stall detection or driver error(TMC2209)
  43. uint8_t motorSetState = 0; // 0: stop, 1: start hold, 2: start soft, 3: run speed, 4: change dir, 5: stop state, soft set 0 after use, 10: scram motor
  44. float speedIncreaseStep = 0.0f;
  45. float S_paramA = 0.0f;
  46. #ifdef S_PARAM_C
  47. float S_paramC = S_PARAM_C;
  48. #else
  49. float S_paramC = 0.0f;
  50. #endif
  51. /**
  52. * @brief start motor with direction set
  53. * @param dir direction to move
  54. * @param speed direction to move
  55. */
  56. void MotorStart(uint8_t dir, uint32_t speed)
  57. {
  58. if(dir == MOTOR_DIR_IN)
  59. MOTOR_DIR_SET_IN;
  60. else if(dir == MOTOR_DIR_OUT)
  61. MOTOR_DIR_SET_OUT;
  62. MOTOR_EN_SET_ENABLE;
  63. PwmFreqSet(speed, Motor_Channel);
  64. #ifdef __DEBUG_MOTOR_STEP_ATY
  65. printf("\r\nMotor Start: %d - %d", dir, speed);
  66. #endif /* __DEBUG_MOTOR_STEP_ATY */
  67. }
  68. /**
  69. * @brief start motor with only speed
  70. * @param speed direction to move
  71. */
  72. void MotorStartSpeed(uint32_t speed)
  73. {
  74. MOTOR_EN_SET_ENABLE;
  75. PwmFreqSet(speed, Motor_Channel);
  76. #ifdef __DEBUG_MOTOR_STEP_ATY
  77. printf("\r\nMotor Start: %d", speed);
  78. #endif /* __DEBUG_MOTOR_STEP_ATY */
  79. }
  80. /**
  81. * @brief stop motor
  82. */
  83. void MotorStop(void)
  84. {
  85. // MOTOR_PARAM_SET(MOTOR_DIR_OUT, 0, 0, 0, 0, motorSetState);
  86. if(motorEn == 0)
  87. return;
  88. else{
  89. PWM_Stop(0, Motor_Channel);
  90. MOTOR_EN_SET_DISABLE;
  91. motorStartCounter = 0;
  92. motorStopCounter = 0;
  93. #ifdef __DEBUG_MOTOR_STEP_ATY
  94. printf("\r\nMotor Stop");
  95. #endif /* __DEBUG_MOTOR_STEP_ATY */
  96. }
  97. }
  98. /**
  99. * @brief process motor error
  100. * @note put at 1ms cycle
  101. */
  102. void MotorSelfCycle(void)
  103. {
  104. if(MOTOR_DIAG_GET_H)
  105. {
  106. if(motorEn == 1)
  107. MOTOR_EN_SET_DISABLE;
  108. if(motorStopCounter >= 100)
  109. MOTOR_EN_SET_ENABLE;
  110. }
  111. }
  112. /**
  113. * @brief deal step motor state
  114. * @note put at 1ms cycle;
  115. * set motorSetState = 4 to change motor dir with speed no change
  116. * set motorSetState = 3 to start motor directly, motorSoftTime need to be 0
  117. * set motorSetState = 2 to strat motor with soft, motorDir/motorSoftSpeed/motorSpeed/motorSoftTime/motorTime need to be set
  118. * set motorSetState = 0 to stop motor
  119. * set motorSetState = 10 to scram motor
  120. * when motorSetState = 5 means last cycle finished, set others to start a new cycle
  121. * when motorSetState = 1 means motor running and state not changing
  122. */
  123. void MotorStateMachine_Step(void)
  124. {
  125. if(motorSoftSpeed < motorSpeed)
  126. motorSoftSpeed = motorSpeed;
  127. if(motorSetState == 4){
  128. motorStartCounter = 0;
  129. motorStopCounter = 0;
  130. motorSetState = 2;
  131. motorDir = !motorDir;
  132. }
  133. else if(motorSetState == 3){
  134. motorStartCounter = motorSoftTime;
  135. motorSetState = 1;
  136. MotorStart(motorDir, motorSpeed);
  137. }
  138. else if(motorSetState == 2){
  139. motorStartCounter = 0;
  140. motorSetState = 1;
  141. MotorStart(motorDir, motorSoftSpeed);
  142. }
  143. else if(motorSetState == 1){
  144. if(motorStartCounter < motorSoftTime){
  145. #if defined (Motor_StartLine_T)
  146. speedIncreaseStep = ((float)(motorSoftSpeed - motorSpeed) / (float)motorSoftTime); // at 1ms cycle
  147. MotorStart(motorDir,
  148. motorSpeed < (motorSoftSpeed - (speedIncreaseStep * motorStartCounter)) ?
  149. (motorSoftSpeed - (speedIncreaseStep * motorStartCounter)) : motorSpeed);
  150. #elif defined (Motor_StartLine_S)
  151. // S line: y = ax^3 + cx, a in 0-1, c >= 0, lower c cause lower increase at start or end, c for users
  152. S_paramA = (((float)(motorSoftSpeed - motorSpeed) / 2)
  153. - (S_paramC * (float)((float)motorSoftTime / 2) * (float)((float)motorSoftTime / 2) / 2))
  154. / ((float)((float)motorSoftTime / 2) * (float)((float)motorSoftTime / 2)
  155. * (float)((float)motorSoftTime / 2) * (float)((float)motorSoftTime / 2)) * 4;
  156. // mbG[27] = S_paramA * 10000000;
  157. if(motorStartCounter < (motorSoftTime / 2))
  158. speedIncreaseStep =
  159. ((float)(S_paramA * motorStartCounter * motorStartCounter * motorStartCounter * motorStartCounter) / 4)
  160. + ((float)(S_paramC * motorStartCounter * motorStartCounter) / 2);
  161. // (S_paramA * motorStartCounter * motorStartCounter * motorStartCounter)
  162. // + (S_paramC * motorStartCounter);
  163. else
  164. speedIncreaseStep =
  165. (float)((float)(motorSoftSpeed - motorSpeed) / 2)
  166. + ((float)(S_paramA * motorSoftTime * motorSoftTime * motorSoftTime * motorSoftTime) / 64)
  167. + ((float)(S_paramC * motorSoftTime * motorSoftTime) / 8)
  168. - ((float)(S_paramA * (motorSoftTime - motorStartCounter) * (motorSoftTime - motorStartCounter)
  169. * (motorSoftTime - motorStartCounter) * (motorSoftTime - motorStartCounter)) / 4)
  170. - ((float)(S_paramC * (motorSoftTime - motorStartCounter) * (motorSoftTime - motorStartCounter)) / 2);
  171. // 0
  172. // - (S_paramA * (float)((float)motorStartCounter - (float)motorSoftTime)
  173. // * (float)((float)motorStartCounter - (float)motorSoftTime)
  174. // * (float)((float)motorStartCounter - (float)motorSoftTime))
  175. // - (S_paramC * (float)((float)motorStartCounter - (float)motorSoftTime));
  176. MotorStart(motorDir,
  177. motorSpeed < (motorSoftSpeed - speedIncreaseStep) ?
  178. (motorSoftSpeed - speedIncreaseStep) : motorSpeed);
  179. #else
  180. #endif
  181. }
  182. if(motorStartCounter == motorSoftTime)
  183. motorSetState = 3;
  184. else if(motorStartCounter == (motorSoftTime + motorTime))
  185. motorSetState = 5;
  186. }
  187. else if(motorSetState == 10){
  188. motorSetState = 0;
  189. MotorStop();
  190. }
  191. else{ MotorStop(); } // 5 0
  192. if(motorEn == 0){
  193. motorStartCounter = 0;
  194. motorStopCounter++;
  195. }
  196. else{
  197. motorStartCounter++;
  198. motorStopCounter = 0;
  199. }
  200. }
  201. #endif /* __MOTOR_STEP_ATY_C */
  202. /******************************** End Of File *********************************/