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.

245 lines
7.4 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
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
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
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 "ble_parse_data.h"
  3. #include "driver/uart.h"
  4. #include "esp_log.h"
  5. #define MOTOR_DRIVE "MOTOR_DRIVE"
  6. #define uart_num UART_NUM_1
  7. #define tx_io_num 1
  8. #define rx_io_num 2
  9. #define buffer_size 128
  10. #define uart_read_time_ms 2000
  11. void motor_drive_uart_init() {
  12. uart_config_t uart_config = {
  13. .baud_rate = 115200,
  14. .data_bits = UART_DATA_8_BITS,
  15. .parity = UART_PARITY_DISABLE,
  16. .stop_bits = UART_STOP_BITS_1,
  17. .flow_ctrl = UART_HW_FLOWCTRL_DISABLE,
  18. .source_clk = UART_SCLK_APB,
  19. };
  20. ESP_ERROR_CHECK(uart_driver_install(uart_num, buffer_size * 2, 0, 0, NULL, 0));
  21. ESP_ERROR_CHECK(uart_param_config(uart_num, &uart_config));
  22. ESP_ERROR_CHECK(uart_set_pin(uart_num, tx_io_num, rx_io_num, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE));
  23. }
  24. void motor_drive_turn(int direction, int speed_level, double position) {
  25. if ((direction > 2) || (direction < 0)) {
  26. ESP_LOGW(MOTOR_DRIVE, "Direction out of range");
  27. }
  28. if ((speed_level > 9) || (speed_level < 0)) {
  29. ESP_LOGW(MOTOR_DRIVE, "Speed level out of range");
  30. }
  31. if ((position > 360) || (position <= 0)) {
  32. ESP_LOGW(MOTOR_DRIVE, "Position out of range");
  33. }
  34. motor_drive_set_packages_ctr(position);
  35. uart_write_bytes(uart_num, "test", strlen("test"));
  36. }
  37. double motor_drive_read_encoder() {
  38. size_t encoder_buffer_size = 5;
  39. uint8_t buffer[5] = {0X3E, 0X90, 0X01, 0X00, 0XCF};
  40. uint16_t encoder_data = 0;
  41. char *notify_err = "read encoder error";
  42. // Generate cmd
  43. // encoder_buffer_size = motor_drive_buffer_cmd_generate(buffer, 0x90, 4, 0X5A97FF00);
  44. // if (encoder_buffer_size == 0) {
  45. // ESP_LOGW(MOTOR_DRIVE, "generate_buffer_size null");
  46. // return -1;
  47. // }
  48. // Send cmd
  49. uart_flush(uart_num);
  50. uart_write_bytes(uart_num, (const char *)buffer, encoder_buffer_size);
  51. encoder_buffer_size = 0;
  52. memset(buffer, 0, sizeof(uint8_t) * 5);
  53. // Wait receive
  54. encoder_buffer_size = uart_read_bytes(uart_num, buffer, 12, uart_read_time_ms / portTICK_RATE_MS);
  55. if (encoder_buffer_size != 12 || buffer[0] != 0X3E) {
  56. ESP_LOGW(MOTOR_DRIVE, "encoder size:%d,buffer[0] = 0X%x", encoder_buffer_size, buffer[0]);
  57. bluetooth_active_notify((uint8_t *)notify_err, strlen(notify_err));
  58. return -1.0;
  59. }
  60. // Parse receive
  61. // motor_drive_buffer_cmd_parse(buffer);
  62. encoder_data = buffer[5] + (buffer[6] << 8);
  63. // parse motor usart
  64. return ((double)encoder_data / 100.0);
  65. }
  66. void motor_drive_set_packages_data_max64bit(uint8_t cmd, uint8_t buffer_data_size, uint64_t buffer_data) {
  67. uint8_t buffer[20] = {0};
  68. motor_drive_buffer_cmd_generate(buffer, cmd, buffer_data_size, buffer_data);
  69. }
  70. uint8_t motor_drive_set_packages_ctr(double position) {
  71. int position_int = 0;
  72. uint8_t position_remainder = 0;
  73. uint8_t position_buffer_size = 5; //从第五位开始(低位)
  74. uint8_t checksum = 0;
  75. uint8_t buffer[10] = {0x3E, 0XA7, 0X01, 0X04, 0XEA, 0X00, 0X00, 0X00, 0X00, 0X00};
  76. char *notify_err = "set size error";
  77. position_int = position * 100;
  78. if (position_int != 0) {
  79. while ((position_int / 0XFF) > 0) {
  80. position_remainder = position_int & 0XFF;
  81. buffer[position_buffer_size] = position_remainder;
  82. position_buffer_size += 1;
  83. position_int = position_int >> 8;
  84. checksum += position_remainder;
  85. }
  86. buffer[position_buffer_size] = position_int;
  87. checksum += position_int;
  88. checksum = checksum & 0XFF;
  89. buffer[9] = checksum;
  90. }
  91. // Send cmd
  92. uart_flush(uart_num);
  93. uart_write_bytes(uart_num, buffer, 10);
  94. position_buffer_size = 0;
  95. memset(buffer, 0, sizeof(uint8_t) * 10);
  96. // Wait uart receive,if time out return error and output log
  97. position_buffer_size = uart_read_bytes(uart_num, buffer, 13, uart_read_time_ms / portTICK_RATE_MS);
  98. if (position_buffer_size != 13 || buffer[0] != 0X3E) {
  99. ESP_LOGW(MOTOR_DRIVE, "set motor size error ,buffer_size:%d,buffer[0] = 0X%x", position_buffer_size, buffer[0]);
  100. bluetooth_active_notify((uint8_t *)notify_err, strlen(notify_err));
  101. return 1;
  102. }
  103. // Parse receive
  104. // motor_drive_buffer_cmd_parse(buffer);
  105. return 0;
  106. }
  107. void motor_drive_hex_to_str(const char *hex, int hex_len, char *str) {
  108. int i, pos = 0;
  109. ESP_LOGI(MOTOR_DRIVE, "0X%X", hex[0]);
  110. for (i = 0; i < hex_len; i++)
  111. {
  112. sprintf(str + pos, "%02x", hex[i]);
  113. pos += 2;
  114. }
  115. ESP_LOGI(MOTOR_DRIVE, "0X%X", hex[0]);
  116. }
  117. size_t motor_drive_buffer_cmd_generate(uint8_t *buffer, uint8_t cmd, uint8_t buffer_data_size, uint64_t buffer_data) {
  118. uint8_t i = 0;
  119. uint8_t checksum = 0;
  120. uint8_t buffer_data_uint8 = 0;
  121. uint8_t strbuffer[20] = {'\0'};
  122. uint8_t hex_to_str_size = buffer_data_size;
  123. if (buffer == NULL) {
  124. ESP_LOGW(MOTOR_DRIVE, "buffer nil ,init error");
  125. return 0;
  126. }
  127. buffer[0] = 0X3E;
  128. buffer[1] = cmd;
  129. buffer[2] = 0X1;
  130. buffer[3] = buffer_data_size;
  131. buffer[4] = (0X3E + cmd + 0X1 + buffer_data_size) % 0XFF;
  132. if (buffer_data_size > 0) {
  133. hex_to_str_size = buffer_data_size + 1;
  134. for (i = 0; i < buffer_data_size; i++) {
  135. buffer_data_uint8 = buffer_data;
  136. buffer_data = buffer_data >> 8;
  137. buffer[5 + i] = buffer_data_uint8;
  138. checksum += buffer_data_uint8;
  139. }
  140. buffer[5 + buffer_data_size] = (checksum % 0XFF);
  141. }
  142. motor_drive_hex_to_str((char *)buffer, (5 + hex_to_str_size), (char *)strbuffer);
  143. ESP_LOGI(MOTOR_DRIVE, "%s", strbuffer);
  144. // motor_drive_buffer_cmd_parse(buffer);
  145. return (5 + hex_to_str_size);
  146. }
  147. void motor_drive_buffer_cmd_parse(uint8_t *buffer) {
  148. // uint8_t i = 0;
  149. // uint16_t temp_data_arr[(buffer[3] / 2)];
  150. // ESP_LOGI(MOTOR_DRIVE, "=====buffer data size %d=====", buffer[3]);
  151. if (buffer == NULL) {
  152. ESP_LOGW(MOTOR_DRIVE, "cmd parse buffer null");
  153. return;
  154. }
  155. if (buffer[0] != 0X3E || buffer[2] != 0X01) {
  156. ESP_LOGW(MOTOR_DRIVE, "cmd parse buffer error");
  157. return;
  158. }
  159. // for (i = 0; i < (buffer[3]); i += 2) {
  160. // temp_data_arr[i] = buffer[5 + i] + (buffer[5 + i + 1] << 8);
  161. // ESP_LOGI(MOTOR_DRIVE, "%d\n", temp_data_arr[i]);
  162. // }
  163. }
  164. u_int8_t motor_drive_set_motor_current_size() {
  165. size_t set_current_buffer_size = 5;
  166. uint8_t buffer[5] = {0X3E, 0X19, 0X01, 0X00, 0X58};
  167. char *notify_err = "Set current size err";
  168. uart_flush(uart_num);
  169. uart_write_bytes(uart_num, buffer, 5);
  170. set_current_buffer_size = 0;
  171. memset(buffer, 0, sizeof(uint8_t) * 5);
  172. // Wait receive
  173. set_current_buffer_size = uart_read_bytes(uart_num, buffer, 5, uart_read_time_ms / portTICK_RATE_MS);
  174. if (set_current_buffer_size != 5 || buffer[0] != 0X3E) {
  175. ESP_LOGW(MOTOR_DRIVE, "Set current size:%d,buffer[0] = 0X%x", set_current_buffer_size, buffer[0]);
  176. bluetooth_active_notify((uint8_t *)notify_err, strlen(notify_err));
  177. return 1;
  178. }
  179. return 0;
  180. }
  181. double motor_drive_read_single_turn_angle() {
  182. uint16_t turn_angle_data = 0;
  183. size_t turn_angle_buffer_size = 5;
  184. uint8_t buffer[5] = {0X3E, 0X94, 0X01, 0X00, 0XD3};
  185. char *notify_err = "Turn angle size err";
  186. uart_flush(uart_num);
  187. uart_write_bytes(uart_num, buffer, 5);
  188. turn_angle_buffer_size = 0;
  189. memset(buffer, 0, sizeof(uint8_t) * 5);
  190. // Wait receive
  191. turn_angle_buffer_size = uart_read_bytes(uart_num, buffer, 8, uart_read_time_ms / portTICK_RATE_MS);
  192. if (turn_angle_buffer_size != 8 || buffer[0] != 0X3E) {
  193. ESP_LOGW(MOTOR_DRIVE, "Turn angle size:%d,buffer[0] = 0X%x", turn_angle_buffer_size, buffer[0]);
  194. bluetooth_active_notify((uint8_t *)notify_err, strlen(notify_err));
  195. return -1;
  196. }
  197. // Parse receive
  198. // motor_drive_buffer_cmd_parse(buffer);
  199. turn_angle_data = buffer[5] + (buffer[6] << 8);
  200. return ((double)turn_angle_data / 100.0);
  201. }