医美代码重构
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

261 lines
7.4 KiB

3 years ago
3 years ago
3 years ago
  1. #include "motor_drive.h"
  2. #include "driver/uart.h"
  3. #include "esp_log.h"
  4. #define MOTOR_DRIVE "MOTOR_DRIVE"
  5. #define uart_num UART_NUM_1
  6. #define tx_io_num 23
  7. #define rx_io_num 22
  8. #define buffer_size 128
  9. #define uart_read_time_ms 200
  10. #define MOTOR_ID 0X01
  11. static motor_t *motor_init_structer;
  12. /**
  13. * @brief
  14. *
  15. * @param motor ()
  16. */
  17. void motor_init(motor_t *motor) {
  18. motor_init_structer = motor;
  19. uart_config_t uart_config = {
  20. .baud_rate = 115200,
  21. .data_bits = UART_DATA_8_BITS,
  22. .parity = UART_PARITY_DISABLE,
  23. .stop_bits = UART_STOP_BITS_1,
  24. .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
  25. .source_clk = UART_SCLK_APB,
  26. };
  27. ESP_ERROR_CHECK(uart_driver_install(uart_num, buffer_size * 2, 0, 0, NULL, 0));
  28. ESP_ERROR_CHECK(uart_param_config(uart_num, &uart_config));
  29. ESP_ERROR_CHECK(uart_set_pin(uart_num, tx_io_num, rx_io_num, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE));
  30. return;
  31. }
  32. static double motor_drive_read_encoder();
  33. static uint8_t motor_drive_set_packages_ctr(double position, int direction);
  34. /**
  35. * @brief
  36. *
  37. */
  38. void motor_set_zero_point() {
  39. size_t set_current_buffer_size = 5;
  40. uint8_t buffer[5] = {0X3E, 0X19, MOTOR_ID, 0X00, 0X58};
  41. // char *notify_err = "Set current size err";
  42. uart_flush(uart_num);
  43. uart_write_bytes(uart_num, buffer, 5);
  44. set_current_buffer_size = 0;
  45. memset(buffer, 0, sizeof(uint8_t) * 5);
  46. // Wait receive
  47. set_current_buffer_size = uart_read_bytes(uart_num, buffer, 5, uart_read_time_ms / portTICK_RATE_MS);
  48. if (set_current_buffer_size != 5 || buffer[0] != 0X3E) {
  49. ESP_LOGW(MOTOR_DRIVE, "Set current size:%d,buffer[0] = 0X%x", set_current_buffer_size, buffer[0]);
  50. // bluetooth_active_notify((uint8_t *)notify_err, strlen(notify_err));
  51. }
  52. return;
  53. }
  54. /**
  55. * @brief 0->360
  56. *
  57. * @return uint32_t
  58. */
  59. uint32_t motor_get_position_degree() { return 0; }
  60. /**
  61. * @brief
  62. */
  63. void motor_run_to_postion(int rotation_direction, double position, int speed_level) {
  64. int position_int = 0;
  65. uint8_t position_remainder = 0;
  66. uint8_t position_buffer_size = 6; //从第五位开始(低位)
  67. uint8_t checksum = 0;
  68. uint32_t limit_speed = 0;
  69. uint8_t buffer[14] = {0x3E, 0XA6, MOTOR_ID, 0X08, 0XED, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00};
  70. // char *notify_err = "set size error";
  71. // forward
  72. if ((rotation_direction == 1)) {
  73. buffer[5] = 0;
  74. checksum += 0;
  75. }
  76. // reverse
  77. if ((rotation_direction == 2)) {
  78. buffer[5] = 1;
  79. checksum += 1;
  80. }
  81. position_int = position * 100;
  82. position_int = position_int % 36000;
  83. if (position_int != 0) {
  84. while ((position_int / 0X100) > 0) {
  85. position_remainder = position_int & 0XFF;
  86. buffer[position_buffer_size] = position_remainder;
  87. position_buffer_size += 1;
  88. position_int = position_int >> 8;
  89. checksum += position_remainder;
  90. }
  91. buffer[position_buffer_size] = position_int;
  92. checksum += position_int;
  93. }
  94. if (speed_level <= 9) {
  95. limit_speed = speed_level * 360;
  96. position_buffer_size = 9;
  97. }
  98. if (limit_speed != 0) {
  99. while ((limit_speed / 0X100) > 0) {
  100. position_remainder = limit_speed & 0XFF;
  101. buffer[position_buffer_size] = position_remainder;
  102. position_buffer_size += 1;
  103. limit_speed = limit_speed >> 8;
  104. checksum += position_remainder;
  105. }
  106. buffer[position_buffer_size] = limit_speed;
  107. checksum += limit_speed;
  108. }
  109. checksum = checksum & 0XFF;
  110. buffer[13] = checksum;
  111. // Send cmd
  112. uart_flush(uart_num);
  113. uart_write_bytes(uart_num, buffer, 14);
  114. position_buffer_size = 0;
  115. memset(buffer, 0, sizeof(uint8_t) * 14);
  116. // Wait uart receive, if time out return error and output log
  117. position_buffer_size = uart_read_bytes(uart_num, buffer, 13, uart_read_time_ms / portTICK_RATE_MS);
  118. if (position_buffer_size != 13 || buffer[0] != 0X3E) {
  119. ESP_LOGW(MOTOR_DRIVE, "set motor size error ,buffer_size:%d,buffer[0] = 0X%x", position_buffer_size, buffer[0]);
  120. // bluetooth_active_notify((uint8_t *)notify_err, strlen(notify_err));
  121. }
  122. // Parse receive
  123. // motor_drive_buffer_cmd_parse(buffer);
  124. return;
  125. }
  126. /**
  127. * @brief
  128. *
  129. * @param onevent
  130. */
  131. void motor_reg_event_cb(motor_on_event_t onevent) { return; }
  132. /**
  133. * @brief
  134. *
  135. * @return double
  136. */
  137. static double motor_drive_read_encoder() {
  138. size_t encoder_buffer_size = 5;
  139. uint8_t buffer[5] = {0X3E, 0X90, MOTOR_ID, 0X00, 0XCF};
  140. uint16_t encoder_data = 0;
  141. // Send cmd
  142. uart_flush(uart_num);
  143. uart_write_bytes(uart_num, (const char *)buffer, encoder_buffer_size);
  144. encoder_buffer_size = 0;
  145. memset(buffer, 0, sizeof(uint8_t) * 5);
  146. // Wait receive
  147. encoder_buffer_size = uart_read_bytes(uart_num, buffer, 12, uart_read_time_ms / portTICK_RATE_MS);
  148. if (encoder_buffer_size != 12 || buffer[0] != 0X3E) {
  149. ESP_LOGW(MOTOR_DRIVE, "encoder size:%d,buffer[0] = 0X%x", encoder_buffer_size, buffer[0]);
  150. return -1.0;
  151. }
  152. encoder_data = buffer[5] + (buffer[6] << 8);
  153. return ((double)encoder_data / 100.0);
  154. }
  155. /**
  156. * @brief
  157. *
  158. * @param position
  159. * @param direction
  160. * @return uint8_t
  161. */
  162. static uint8_t motor_drive_set_packages_ctr(double position, int direction) {
  163. int position_int = 0;
  164. uint8_t position_remainder = 0;
  165. uint8_t position_buffer_size = 5; //从第五位开始(低位)
  166. uint8_t checksum = 0;
  167. uint8_t buffer[10] = {0x3E, 0XA7, MOTOR_ID, 0X04, 0XEA, 0X00, 0X00, 0X00, 0X00, 0X00};
  168. // char *notify_err = "set size error";
  169. position_int = position * 100;
  170. if (direction == 2) {
  171. position_int = 0 - position_int;
  172. }
  173. if (position_int != 0) {
  174. if (position_int > 0) { // Positive number
  175. while ((position_int / 0X100) > 0) {
  176. position_remainder = position_int & 0XFF;
  177. buffer[position_buffer_size] = position_remainder;
  178. position_buffer_size += 1;
  179. position_int = position_int >> 8;
  180. checksum += position_remainder;
  181. }
  182. buffer[position_buffer_size] = position_int;
  183. checksum += position_int;
  184. checksum = checksum & 0XFF;
  185. buffer[9] = checksum;
  186. } else { // Negative
  187. while ((position_int / 0X100) < 0) {
  188. position_remainder = position_int & 0XFF;
  189. buffer[position_buffer_size] = position_remainder;
  190. position_buffer_size += 1;
  191. position_int = position_int >> 8;
  192. checksum += position_remainder;
  193. }
  194. buffer[position_buffer_size] = position_int;
  195. position_buffer_size += 1;
  196. while (position_buffer_size != 9) {
  197. buffer[position_buffer_size] = 0XFF;
  198. position_buffer_size += 1;
  199. checksum += 0XFF;
  200. }
  201. checksum += position_int;
  202. checksum = checksum & 0XFF;
  203. buffer[9] = checksum;
  204. }
  205. }
  206. // Send cmd
  207. uart_flush(uart_num);
  208. uart_write_bytes(uart_num, buffer, 10);
  209. position_buffer_size = 0;
  210. memset(buffer, 0, sizeof(uint8_t) * 10);
  211. // Wait uart receive,if time out return error and output log
  212. position_buffer_size = uart_read_bytes(uart_num, buffer, 13, uart_read_time_ms / portTICK_RATE_MS);
  213. if (position_buffer_size != 13 || buffer[0] != 0X3E) {
  214. ESP_LOGW(MOTOR_DRIVE, "set motor size error ,buffer_size:%d,buffer[0] = 0X%x", position_buffer_size, buffer[0]);
  215. // bluetooth_active_notify((uint8_t *)notify_err, strlen(notify_err));
  216. return 1;
  217. }
  218. // Parse receive
  219. // motor_drive_buffer_cmd_parse(buffer);
  220. return 0;
  221. }