MOTOR_DC_ATY.c 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. /**
  2. * @file MOTOR_DC_ATY.c
  3. *
  4. * @param Project DEVICE_GENERAL_ATY_LIB
  5. *
  6. * @author ATY
  7. *
  8. * @copyright
  9. * - Copyright 2017 - 2026 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 functions of DCMotor control
  20. *
  21. * @version
  22. * - 1_01_230426 > ATY
  23. * -# Preliminary version, first Release
  24. * - 1_01_240112 > ATY
  25. * -# add multy addr and channel
  26. * -# add lock
  27. ********************************************************************************
  28. */
  29. #ifndef __MOTOR_DC_ATY_C
  30. #define __MOTOR_DC_ATY_C
  31. #include "MOTOR_DC_ATY.h"
  32. /******************************* For user *************************************/
  33. /******************************************************************************/
  34. /**
  35. * @brief start motor with direction set
  36. *
  37. * @param dir direction to move
  38. * @param speed direction to move
  39. * @param dev
  40. * @return uint8_t
  41. */
  42. uint8_t MOTOR_DC_Start(uint8_t dir, uint32_t speed, struct MOTOR_DC_ATY_Dev* dev)
  43. {
  44. __ATY_LOCK(dev);
  45. dev->motorEn = 1;
  46. dev->motorDir = dir;
  47. if(dir){
  48. dev->signalSet('A', 0);
  49. dev->signalSet('B', speed);
  50. }
  51. else{
  52. dev->signalSet('A', speed);
  53. dev->signalSet('B', 0);
  54. }
  55. __ATY_UNLOCK(dev);
  56. return 0;
  57. }
  58. /**
  59. * @brief stop motor
  60. *
  61. * @param dev
  62. * @return uint8_t
  63. */
  64. uint8_t MOTOR_DC_Stop(struct MOTOR_DC_ATY_Dev* dev)
  65. {
  66. if(dev->motorEn == 0)
  67. return 1;
  68. __ATY_LOCK(dev);
  69. dev->motorEn = 0;
  70. dev->signalSet('A', 0);
  71. dev->signalSet('B', 0);
  72. dev->motorSpeedCounter = 0;
  73. // MOTOR_DC_PARAM_SET(0, 0, 0, 0, 0, 0, dev);
  74. __ATY_UNLOCK(dev);
  75. return 0;
  76. }
  77. /**
  78. * @brief deal step motor state
  79. *
  80. * @param dev
  81. * @note put at 1ms cycle;
  82. * set motorSetState = 4 to change motor dir with speed no changed
  83. * set motorSetState = 3 to start motor directly, motorSoftSteps need to be 0
  84. * set motorSetState = 2 to strat motor with soft, motorDir/0/motorSpeed/motorSoftSteps/motorSteps need to be set
  85. * set motorSetState = 0 to stop motor flow
  86. * set motorSetState = 10 to scram motor
  87. * when motorSetState = 5 means last cycle finished, set others to start a new cycle
  88. * when motorSetState = 1 means motor running and state not changing
  89. */
  90. void MOTOR_DC_StateMachine_PWM(struct MOTOR_DC_ATY_Dev* dev)
  91. {
  92. if(dev->motorSetState == MOTOR_DC_SET_REVERSE){
  93. dev->motorStepCounter = 0;
  94. dev->motorSetState = MOTOR_DC_SET_START_SOFT;
  95. dev->motorDir = !dev->motorDir;
  96. }
  97. else if(dev->motorSetState == MOTOR_DC_SET_START_DIRECTLY){
  98. dev->motorStepCounter = dev->motorSoftSteps;
  99. MOTOR_DC_Start(dev->motorDir, dev->motorSpeed, dev);
  100. dev->motorSetState = MOTOR_DC_SET_RUNNING;
  101. }
  102. else if(dev->motorSetState == MOTOR_DC_SET_START_SOFT){
  103. dev->motorStepCounter = 0;
  104. MOTOR_DC_Start(dev->motorDir, 0, dev);
  105. dev->motorSetState = MOTOR_DC_SET_RUNNING;
  106. }
  107. else if(dev->motorSetState == MOTOR_DC_SET_RUNNING){
  108. // if(dev->motorStepCounter < dev->motorSoftSteps){
  109. // if(dev->lineProType == 'T'){
  110. // dev->speedIncreaseStep = ((float)(0 - dev->motorSpeed) / (float)dev->motorSoftSteps); // at 1ms cycle
  111. // MOTOR_DC_Start(dev->motorDir,
  112. // dev->motorSpeed < (0 - (dev->speedIncreaseStep * dev->motorStepCounter)) ?
  113. // (0 - (dev->speedIncreaseStep * dev->motorStepCounter)) : dev->motorSpeed, dev);
  114. // }
  115. // else if(dev->lineProType == 'S'){
  116. // // S line: y = ax^3 + cx, a in 0-1, c >= 0, lower c cause lower increase at start or end, c for users
  117. // float S_param_A = (((float)(0 - dev->motorSpeed) / 2)
  118. // - (dev->lineProParam * (float)((float)dev->motorSoftSteps / 2) * (float)((float)dev->motorSoftSteps / 2) / 2))
  119. // / ((float)((float)dev->motorSoftSteps / 2) * (float)((float)dev->motorSoftSteps / 2)
  120. // * (float)((float)dev->motorSoftSteps / 2) * (float)((float)dev->motorSoftSteps / 2)) * 4;
  121. // // mbG[27] = S_param_A * 10000000;
  122. // if(dev->motorStepCounter < (dev->motorSoftSteps / 2))
  123. // dev->speedIncreaseStep =
  124. // ((float)(S_param_A * dev->motorStepCounter * dev->motorStepCounter * dev->motorStepCounter * dev->motorStepCounter) / 4)
  125. // + ((float)(dev->lineProParam * dev->motorStepCounter * dev->motorStepCounter) / 2);
  126. // // (S_param_A * dev->motorStepCounter * dev->motorStepCounter * dev->motorStepCounter)
  127. // // + (lineProParam * dev->motorStepCounter);
  128. // else
  129. // dev->speedIncreaseStep =
  130. // (float)((float)(0 - dev->motorSpeed) / 2)
  131. // + ((float)(S_param_A * dev->motorSoftSteps * dev->motorSoftSteps * dev->motorSoftSteps * dev->motorSoftSteps) / 64)
  132. // + ((float)(dev->lineProParam * dev->motorSoftSteps * dev->motorSoftSteps) / 8)
  133. // - ((float)(S_param_A * (dev->motorSoftSteps - dev->motorStepCounter) * (dev->motorSoftSteps - dev->motorStepCounter)
  134. // * (dev->motorSoftSteps - dev->motorStepCounter) * (dev->motorSoftSteps - dev->motorStepCounter)) / 4)
  135. // - ((float)(dev->lineProParam * (dev->motorSoftSteps - dev->motorStepCounter) * (dev->motorSoftSteps - dev->motorStepCounter)) / 2);
  136. // // 0
  137. // // - (S_param_A * (float)((float)dev->motorStepCounter - (float)dev->motorSoftSteps)
  138. // // * (float)((float)dev->motorStepCounter - (float)dev->motorSoftSteps)
  139. // // * (float)((float)dev->motorStepCounter - (float)dev->motorSoftSteps))
  140. // // - (dev->lineProParam * (float)((float)dev->motorStepCounter - (float)dev->motorSoftSteps));
  141. // MOTOR_DC_Start(dev->motorDir,
  142. // dev->motorSpeed < (0 - dev->speedIncreaseStep) ?
  143. // (0 - dev->speedIncreaseStep) : dev->motorSpeed, dev);
  144. // }
  145. // else if(dev->lineProType == '2'){}
  146. // }
  147. if(dev->motorStepCounter == dev->motorSoftSteps)
  148. dev->motorSetState = MOTOR_DC_SET_START_DIRECTLY;
  149. else if(dev->motorStepCounter >= (dev->motorSoftSteps + dev->motorSteps))
  150. dev->motorSetState = MOTOR_DC_SET_FINISHED;
  151. }
  152. else if(dev->motorSetState == MOTOR_DC_SET_SCRAM){
  153. MOTOR_DC_Stop(dev);
  154. dev->motorSetState = MOTOR_DC_SET_STOP;
  155. }
  156. else{ MOTOR_DC_Stop(dev); } // 5 0
  157. if(dev->motorEn == 0){
  158. dev->motorStepCounter = 0;
  159. }
  160. else{
  161. dev->motorStepCounter++;
  162. }
  163. }
  164. /**
  165. * @brief deal step motor state
  166. *
  167. * @param dev
  168. * @note put at 1ms cycle;
  169. * set motorSetState = 4 to change motor dir with speed no change
  170. * set motorSetState = 3 to start motor directly, motorSoftSteps need to be 0
  171. * set motorSetState = 2 to strat motor with soft, motorDir/0/motorSpeed/motorSoftSteps/motorTime need to be set
  172. * set motorSetState = 0 to stop motor
  173. * set motorSetState = 10 to scram motor
  174. * when motorSetState = 5 means last cycle finished, set others to start a new cycle
  175. * when motorSetState = 1 means motor running and state not changing
  176. */
  177. void MOTOR_DC_StateMachine(struct MOTOR_DC_ATY_Dev* dev)
  178. {
  179. if(dev->motorSetState == 4){
  180. dev->motorSpeedCounter = 0;
  181. dev->motorSetState = 1;
  182. dev->motorDir = !dev->motorDir;
  183. }
  184. else if(dev->motorSetState == 3){
  185. dev->motorSpeedCounter = dev->motorSoftSteps;
  186. dev->motorSetState = 1;
  187. MOTOR_DC_Start(dev->motorDir, dev->motorSpeed, dev);
  188. }
  189. else if(dev->motorSetState == 2){
  190. dev->motorSpeedCounter = 0;
  191. dev->motorSetState = 1;
  192. MOTOR_DC_Start(dev->motorDir, 0, dev);
  193. }
  194. else if(dev->motorSetState == 1){
  195. if(dev->motorSpeedCounter == dev->motorSoftSteps)
  196. dev->motorSetState = 3;
  197. else if(dev->motorSpeedCounter == (dev->motorSoftSteps + dev->motorSteps))
  198. dev->motorSetState = 5;
  199. }
  200. else if(dev->motorSetState == 10){
  201. dev->motorSetState = 0;
  202. MOTOR_DC_Stop(dev);
  203. }
  204. else{ MOTOR_DC_Stop(dev); } // 5 0
  205. if(dev->motorEn == 0){
  206. dev->motorSpeedCounter = 0;
  207. }
  208. else{
  209. dev->motorSpeedCounter++;
  210. }
  211. }
  212. #endif /* __MOTOR_DC_ATY_C */
  213. /******************************** End Of File *********************************/