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

310 lines
8.7 KiB

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