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