医美代码重构
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.

257 lines
7.3 KiB

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