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

156 lines
4.7 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. void motor_init(motor_t *motor) {
  13. motor_init_structer = motor;
  14. uart_config_t uart_config = {
  15. .baud_rate = 115200,
  16. .data_bits = UART_DATA_8_BITS,
  17. .parity = UART_PARITY_DISABLE,
  18. .stop_bits = UART_STOP_BITS_1,
  19. .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
  20. .source_clk = UART_SCLK_APB,
  21. };
  22. ESP_ERROR_CHECK(uart_driver_install(uart_num, buffer_size * 2, 0, 0, NULL, 0));
  23. ESP_ERROR_CHECK(uart_param_config(uart_num, &uart_config));
  24. ESP_ERROR_CHECK(uart_set_pin(uart_num, tx_io_num, rx_io_num, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE));
  25. return;
  26. }
  27. void motor_set_zero_point() {
  28. size_t set_current_buffer_size = 5;
  29. uint8_t buffer[5] = {0X3E, 0X19, MOTOR_ID, 0X00, 0X58};
  30. // char *notify_err = "Set current size err";
  31. uart_flush(uart_num);
  32. uart_write_bytes(uart_num, buffer, 5);
  33. set_current_buffer_size = 0;
  34. memset(buffer, 0, sizeof(uint8_t) * 5);
  35. // Wait receive
  36. set_current_buffer_size = uart_read_bytes(uart_num, buffer, 5, uart_read_time_ms / portTICK_RATE_MS);
  37. if (set_current_buffer_size != 5 || buffer[0] != 0X3E) {
  38. ESP_LOGW(MOTOR_DRIVE, "Set current size:%d,buffer[0] = 0X%x", set_current_buffer_size, buffer[0]);
  39. // bluetooth_active_notify((uint8_t *)notify_err, strlen(notify_err));
  40. }
  41. return ;
  42. }
  43. /**
  44. * @brief 0->360
  45. *
  46. * @return uint32_t
  47. */
  48. uint32_t motor_get_position_degree() { return 0; }
  49. /**
  50. * @brief
  51. */
  52. void motor_run_to_postion(int potion) { return; }
  53. void motor_reg_event_cb(motor_on_event_t onevent) { return; }
  54. double motor_drive_read_encoder() {
  55. size_t encoder_buffer_size = 5;
  56. uint8_t buffer[5] = {0X3E, 0X90, MOTOR_ID, 0X00, 0XCF};
  57. uint16_t encoder_data = 0;
  58. // Send cmd
  59. uart_flush(uart_num);
  60. uart_write_bytes(uart_num, (const char *)buffer, encoder_buffer_size);
  61. encoder_buffer_size = 0;
  62. memset(buffer, 0, sizeof(uint8_t) * 5);
  63. // Wait receive
  64. encoder_buffer_size = uart_read_bytes(uart_num, buffer, 12, uart_read_time_ms / portTICK_RATE_MS);
  65. if (encoder_buffer_size != 12 || buffer[0] != 0X3E) {
  66. ESP_LOGW(MOTOR_DRIVE, "encoder size:%d,buffer[0] = 0X%x", encoder_buffer_size, buffer[0]);
  67. return -1.0;
  68. }
  69. encoder_data = buffer[5] + (buffer[6] << 8);
  70. return ((double)encoder_data / 100.0);
  71. }
  72. uint8_t motor_drive_set_packages_ctr(double position, int direction) {
  73. int position_int = 0;
  74. uint8_t position_remainder = 0;
  75. uint8_t position_buffer_size = 5; //从第五位开始(低位)
  76. uint8_t checksum = 0;
  77. uint8_t buffer[10] = {0x3E, 0XA7, MOTOR_ID, 0X04, 0XEA, 0X00, 0X00, 0X00, 0X00, 0X00};
  78. // char *notify_err = "set size error";
  79. position_int = position * 100;
  80. if (direction == 2) {
  81. position_int = 0 - position_int;
  82. }
  83. if (position_int != 0) {
  84. if (position_int > 0) { // Positive number
  85. while ((position_int / 0X100) > 0) {
  86. position_remainder = position_int & 0XFF;
  87. buffer[position_buffer_size] = position_remainder;
  88. position_buffer_size += 1;
  89. position_int = position_int >> 8;
  90. checksum += position_remainder;
  91. }
  92. buffer[position_buffer_size] = position_int;
  93. checksum += position_int;
  94. checksum = checksum & 0XFF;
  95. buffer[9] = checksum;
  96. } else { // Negative
  97. while ((position_int / 0X100) < 0) {
  98. position_remainder = position_int & 0XFF;
  99. buffer[position_buffer_size] = position_remainder;
  100. position_buffer_size += 1;
  101. position_int = position_int >> 8;
  102. checksum += position_remainder;
  103. }
  104. buffer[position_buffer_size] = position_int;
  105. position_buffer_size += 1;
  106. while (position_buffer_size != 9) {
  107. buffer[position_buffer_size] = 0XFF;
  108. position_buffer_size += 1;
  109. checksum += 0XFF;
  110. }
  111. checksum += position_int;
  112. checksum = checksum & 0XFF;
  113. buffer[9] = checksum;
  114. }
  115. }
  116. // Send cmd
  117. uart_flush(uart_num);
  118. uart_write_bytes(uart_num, buffer, 10);
  119. position_buffer_size = 0;
  120. memset(buffer, 0, sizeof(uint8_t) * 10);
  121. // Wait uart receive,if time out return error and output log
  122. position_buffer_size = uart_read_bytes(uart_num, buffer, 13, uart_read_time_ms / portTICK_RATE_MS);
  123. if (position_buffer_size != 13 || buffer[0] != 0X3E) {
  124. ESP_LOGW(MOTOR_DRIVE, "set motor size error ,buffer_size:%d,buffer[0] = 0X%x", position_buffer_size, buffer[0]);
  125. // bluetooth_active_notify((uint8_t *)notify_err, strlen(notify_err));
  126. return 1;
  127. }
  128. // Parse receive
  129. // motor_drive_buffer_cmd_parse(buffer);
  130. return 0;
  131. }