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

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