|
@ -2,6 +2,7 @@ |
|
|
|
|
|
|
|
|
#include "driver/uart.h" |
|
|
#include "driver/uart.h" |
|
|
#include "esp_log.h" |
|
|
#include "esp_log.h" |
|
|
|
|
|
#include "port.h" |
|
|
|
|
|
|
|
|
#define MOTOR_DRIVE "MOTOR_DRIVE" |
|
|
#define MOTOR_DRIVE "MOTOR_DRIVE" |
|
|
|
|
|
|
|
@ -12,7 +13,13 @@ |
|
|
#define uart_read_time_ms 200 |
|
|
#define uart_read_time_ms 200 |
|
|
#define MOTOR_ID 0X01 |
|
|
#define MOTOR_ID 0X01 |
|
|
|
|
|
|
|
|
|
|
|
#define angular_error 1.0 //角度误差 |
|
|
|
|
|
|
|
|
static motor_t *motor_init_structer; |
|
|
static motor_t *motor_init_structer; |
|
|
|
|
|
static motor_on_event_t s_onevent; |
|
|
|
|
|
|
|
|
|
|
|
static bool notify_send_flag = false; |
|
|
|
|
|
static double motor_position; |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* @brief 电机初始化 |
|
|
* @brief 电机初始化 |
|
@ -69,7 +76,33 @@ void motor_set_zero_point() { |
|
|
* |
|
|
* |
|
|
* @return uint32_t |
|
|
* @return uint32_t |
|
|
*/ |
|
|
*/ |
|
|
uint32_t motor_get_position_degree() { return 0; } |
|
|
|
|
|
|
|
|
double motor_get_position_degree() { |
|
|
|
|
|
uint16_t turn_angle_data = 0; |
|
|
|
|
|
size_t turn_angle_buffer_size = 5; |
|
|
|
|
|
uint8_t buffer[5] = {0X3E, 0X94, MOTOR_ID, 0X00, 0XD3}; |
|
|
|
|
|
// char *notify_err = "Turn angle size err"; |
|
|
|
|
|
|
|
|
|
|
|
uart_flush(uart_num); |
|
|
|
|
|
uart_write_bytes(uart_num, buffer, 5); |
|
|
|
|
|
|
|
|
|
|
|
turn_angle_buffer_size = 0; |
|
|
|
|
|
memset(buffer, 0, sizeof(uint8_t) * 5); |
|
|
|
|
|
|
|
|
|
|
|
// Wait receive |
|
|
|
|
|
turn_angle_buffer_size = uart_read_bytes(uart_num, buffer, 8, uart_read_time_ms / portTICK_RATE_MS); |
|
|
|
|
|
if (turn_angle_buffer_size != 8 || buffer[0] != 0X3E) { |
|
|
|
|
|
ESP_LOGW(MOTOR_DRIVE, "Turn angle size:%d,buffer[0] = 0X%x", turn_angle_buffer_size, buffer[0]); |
|
|
|
|
|
// bluetooth_active_notify((uint8_t *)notify_err, strlen(notify_err)); |
|
|
|
|
|
return -1; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Parse receive |
|
|
|
|
|
// motor_drive_buffer_cmd_parse(buffer); |
|
|
|
|
|
|
|
|
|
|
|
turn_angle_data = buffer[5] + (buffer[6] << 8); |
|
|
|
|
|
|
|
|
|
|
|
return ((double)turn_angle_data / 100.0); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* @brief 电机转到多少度 |
|
|
* @brief 电机转到多少度 |
|
@ -142,8 +175,12 @@ void motor_run_to_postion(int rotation_direction, double position, int speed_lev |
|
|
if (position_buffer_size != 13 || buffer[0] != 0X3E) { |
|
|
if (position_buffer_size != 13 || buffer[0] != 0X3E) { |
|
|
ESP_LOGW(MOTOR_DRIVE, "set motor size error ,buffer_size:%d,buffer[0] = 0X%x", position_buffer_size, buffer[0]); |
|
|
ESP_LOGW(MOTOR_DRIVE, "set motor size error ,buffer_size:%d,buffer[0] = 0X%x", position_buffer_size, buffer[0]); |
|
|
// bluetooth_active_notify((uint8_t *)notify_err, strlen(notify_err)); |
|
|
// bluetooth_active_notify((uint8_t *)notify_err, strlen(notify_err)); |
|
|
|
|
|
return; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
notify_send_flag = true; |
|
|
|
|
|
motor_position = position; |
|
|
|
|
|
|
|
|
// Parse receive |
|
|
// Parse receive |
|
|
// motor_drive_buffer_cmd_parse(buffer); |
|
|
// motor_drive_buffer_cmd_parse(buffer); |
|
|
return; |
|
|
return; |
|
@ -154,7 +191,10 @@ void motor_run_to_postion(int rotation_direction, double position, int speed_lev |
|
|
* |
|
|
* |
|
|
* @param onevent 注册的回调函数 |
|
|
* @param onevent 注册的回调函数 |
|
|
*/ |
|
|
*/ |
|
|
void motor_reg_event_cb(motor_on_event_t onevent) { return; } |
|
|
|
|
|
|
|
|
void motor_reg_event_cb(motor_on_event_t onevent) { |
|
|
|
|
|
s_onevent = onevent; |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* @brief 读取编码器 |
|
|
* @brief 读取编码器 |
|
@ -258,4 +298,49 @@ static uint8_t motor_drive_set_packages_ctr(double position, int direction) { |
|
|
// Parse receive |
|
|
// Parse receive |
|
|
// motor_drive_buffer_cmd_parse(buffer); |
|
|
// motor_drive_buffer_cmd_parse(buffer); |
|
|
return 0; |
|
|
return 0; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
* @brief 电机模块调度(验证电机是否到达指定位置,然后主动上报数据) |
|
|
|
|
|
* |
|
|
|
|
|
*/ |
|
|
|
|
|
void motor_module_schedule() { |
|
|
|
|
|
static uint32_t time = 0; |
|
|
|
|
|
//读取角度是否到达想要角度,到达上报(每隔500ms读取一次) |
|
|
|
|
|
if ((notify_send_flag == true) && (port_haspassedms(time) > 500)) { |
|
|
|
|
|
double now_position_degree = motor_get_position_degree(); |
|
|
|
|
|
double maximum = 0.0; |
|
|
|
|
|
double minimum = 0.0; |
|
|
|
|
|
|
|
|
|
|
|
if (motor_position == 0){ |
|
|
|
|
|
motor_position = 360; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if ((motor_position + angular_error) > 360.0) { |
|
|
|
|
|
maximum = (motor_position + angular_error) - 360.0; |
|
|
|
|
|
} else { |
|
|
|
|
|
maximum = motor_position + angular_error; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if ((motor_position - angular_error) < 0.0) { |
|
|
|
|
|
minimum = (motor_position - angular_error) + 360.0; |
|
|
|
|
|
} else { |
|
|
|
|
|
minimum = motor_position - angular_error; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (maximum < minimum) { |
|
|
|
|
|
maximum = maximum + 360; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if ((now_position_degree >= minimum) && (now_position_degree <= maximum)) { //读取角度是否到达 |
|
|
|
|
|
s_onevent(kRunToPosition); //组包,主动上报 |
|
|
|
|
|
notify_send_flag = false; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// ESP_LOGI("=======", "now:%lf,run to:%lf,minimum = %lf,maximum = %lf", now_position_degree, motor_position, minimum, maximum); |
|
|
|
|
|
|
|
|
|
|
|
time = port_get_ticket(); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return; |
|
|
} |
|
|
} |