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

138 lines
4.1 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() { return; }
  28. /**
  29. * @brief 0->360
  30. *
  31. * @return uint32_t
  32. */
  33. uint32_t motor_get_position_degree() { return 0; }
  34. /**
  35. * @brief
  36. */
  37. void motor_run_to_postion(int potion) { return; }
  38. void motor_reg_event_cb(motor_on_event_t onevent) { return; }
  39. double motor_drive_read_encoder() {
  40. size_t encoder_buffer_size = 5;
  41. uint8_t buffer[5] = {0X3E, 0X90, MOTOR_ID, 0X00, 0XCF};
  42. uint16_t encoder_data = 0;
  43. // Send cmd
  44. uart_flush(uart_num);
  45. uart_write_bytes(uart_num, (const char *)buffer, encoder_buffer_size);
  46. encoder_buffer_size = 0;
  47. memset(buffer, 0, sizeof(uint8_t) * 5);
  48. // Wait receive
  49. encoder_buffer_size = uart_read_bytes(uart_num, buffer, 12, uart_read_time_ms / portTICK_RATE_MS);
  50. if (encoder_buffer_size != 12 || buffer[0] != 0X3E) {
  51. ESP_LOGW(MOTOR_DRIVE, "encoder size:%d,buffer[0] = 0X%x", encoder_buffer_size, buffer[0]);
  52. return -1.0;
  53. }
  54. encoder_data = buffer[5] + (buffer[6] << 8);
  55. return ((double)encoder_data / 100.0);
  56. }
  57. uint8_t motor_drive_set_packages_ctr(double position, int direction) {
  58. int position_int = 0;
  59. uint8_t position_remainder = 0;
  60. uint8_t position_buffer_size = 5; //从第五位开始(低位)
  61. uint8_t checksum = 0;
  62. uint8_t buffer[10] = {0x3E, 0XA7, MOTOR_ID, 0X04, 0XEA, 0X00, 0X00, 0X00, 0X00, 0X00};
  63. // char *notify_err = "set size error";
  64. position_int = position * 100;
  65. if (direction == 2) {
  66. position_int = 0 - position_int;
  67. }
  68. if (position_int != 0) {
  69. if (position_int > 0) { // Positive number
  70. while ((position_int / 0X100) > 0) {
  71. position_remainder = position_int & 0XFF;
  72. buffer[position_buffer_size] = position_remainder;
  73. position_buffer_size += 1;
  74. position_int = position_int >> 8;
  75. checksum += position_remainder;
  76. }
  77. buffer[position_buffer_size] = position_int;
  78. checksum += position_int;
  79. checksum = checksum & 0XFF;
  80. buffer[9] = checksum;
  81. } else { // Negative
  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. position_buffer_size += 1;
  91. while (position_buffer_size != 9) {
  92. buffer[position_buffer_size] = 0XFF;
  93. position_buffer_size += 1;
  94. checksum += 0XFF;
  95. }
  96. checksum += position_int;
  97. checksum = checksum & 0XFF;
  98. buffer[9] = checksum;
  99. }
  100. }
  101. // Send cmd
  102. uart_flush(uart_num);
  103. uart_write_bytes(uart_num, buffer, 10);
  104. position_buffer_size = 0;
  105. memset(buffer, 0, sizeof(uint8_t) * 10);
  106. // Wait uart receive,if time out return error and output log
  107. position_buffer_size = uart_read_bytes(uart_num, buffer, 13, uart_read_time_ms / portTICK_RATE_MS);
  108. if (position_buffer_size != 13 || buffer[0] != 0X3E) {
  109. ESP_LOGW(MOTOR_DRIVE, "set motor size error ,buffer_size:%d,buffer[0] = 0X%x", position_buffer_size, buffer[0]);
  110. // bluetooth_active_notify((uint8_t *)notify_err, strlen(notify_err));
  111. return 1;
  112. }
  113. // Parse receive
  114. // motor_drive_buffer_cmd_parse(buffer);
  115. return 0;
  116. }