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

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