/** * @file dj.c * @author 1722451300@qq.com * @brief * @version 0.1 * @date 2021-12-15 * * @copyright Copyright (c) 2021 * */ #include "motor.h" volatile int32_t recv_motor_data_state=0;//1就判断是不是接收完成,0不判断 volatile int32_t motor_jerk_state = 0; extern volatile int32_t lcd_issue_motor_speed; volatile int16_t motor_off_state=0; extern int32_t recv_motor_data_time; extern int32_t inquire_error_time=0; void motor_uart_config(void) { /** * @brief 用的 UART0 作为与单机的通信接口 CH340电机端 * */ uart0_config(); rs485_re_pin = 0; rs485_re_port &= ~(0x01 << 3); //初始化为低电平默认接收模式 } void send_cmd_to_motor(volatile char buff[20], unsigned int num) { /** * @brief 向电机发送命令 * @param buff 发送的命令 */ rs485_re_port |= (0x01 << 3); while (num--) { while (!TRMT0) ; TX0B = *buff; buff++; } while (!TRMT0) ; //等待向电机发送数据完成 rs485_re_port &= ~(0x01 << 3); } void inquire_motor_error_state(void) { /** * @brief 每3秒查询一次电机的状态 * 3E 9C 01 00 DB */ unsigned char inquire_motor_error_cmd[20] = {0}; unsigned char str[2]={0}; if(inquire_error_time>=2000)//2s查询一次 { inquire_error_time=0; //读取错误信息 inquire_motor_error_cmd[0] = 0x3E; inquire_motor_error_cmd[1] = 0x9A; inquire_motor_error_cmd[2] = 0X01; inquire_motor_error_cmd[3] = 0x00; inquire_motor_error_cmd[4] = 0xD9; //send_cmd_to_motor(inquire_motor_error_cmd, 5); sleep_ms(10); //读取速度的值 inquire_motor_error_cmd[0] = 0x3E; inquire_motor_error_cmd[1] = 0x9C; inquire_motor_error_cmd[2] = 0X01; inquire_motor_error_cmd[3] = 0x00; inquire_motor_error_cmd[4] = 0xDB; //send_cmd_to_motor(inquire_motor_error_cmd, 5); sleep_ms(10); } } //---------------------------------------------------- //---------------------------------------------------- //---------------------------------------------------- uint8_t g_motor_rxbuf_isready = 0; volatile char motor_rxbuff[50] = {0}; volatile uint32_t motor_count = 0; uint32_t g_process_recv_motor_data_time = 0; void recv_from_motor_data(unsigned char data) { /** * @brief 接受来自电机的数据 * */ g_motor_rxbuf_isready=true;//进入中断就让他为真 motor_rxbuff[motor_count++] = data; g_process_recv_motor_data_time= hal_get_irqticket();//记录最后的时间 } uint32_t judge_recv_motor_data_finish(uint32_t time) { /** * @brief 接收motor的数据完成 */ static uint32_t recv_motor_data_time = 0; recv_motor_data_time = time; if(recv_motor_data_time=0) { recv_motor_data_time = hal_get_ticket(); return recv_motor_data_time; } else if (hal_has_passedms(recv_motor_data_time) > 10) { g_motor_rxbuf_isready=false; recv_motor_data_time = hal_get_ticket(); send_cmd_to_motor(motor_rxbuff,motor_count);//接收完成将数据发给电脑 motor_count=0; return 0; } } void motor_data_analyse(volatile char buff[20], unsigned int num) { /** * @brief 对电机回复的数据进行分析 * @param 电机回复的数据 * @param 数据长度 * buff[8]电机速度低字节,buff[9]电机速度高字节 */ if (buff[0] == 0x3E && buff[1] == 0x9A)//查询电机错误状态命令下发后,电机的回复 { if((buff[11]>>0&0x01)||(buff[11]>>3&0x01)) { lcd_switch_anomaly_page(); } } if (buff[0] == 0x3E && buff[1] == 0x9C)//读取点击速度数值 { } } volatile int32_t speed_dsp_now = 0;//记录现在的速度 volatile int32_t first_set_motor_speed_dsp = 0; int32_t motor_jerk_status(void) { /** * @brief 判断急停按键是否被按下 * */ if(!((PA>>0)&1)&&motor_jerk_state==0) { sleep_ms(10); if(!((PA>>0)&1)) { motor_jerk_state = 1; speed_dsp_now=0; first_set_motor_speed_dsp=0; lcd_switch_anomaly_page();//急停状态的时候显示异常界面 clear_zero(); sleep_ms(3000); lcd_switch_anomaly_page_key(); } } else if((PA >> 0) & 1) //不是急停状态 { if((PA >> 0) & 1) { motor_jerk_state = 0; beep_off; } } } int32_t judge_foreward_or_reversal(int32_t speed,int32_t turn_state) { /** * @brief 用户点击正转反转时,判断现在的状态是正转还是反转 * */ if(turn_state==0) //正转 { if(first_set_motor_speed_dsp<0) { speed =~speed+1; } return speed; } else if (turn_state == 1) //反转 { if(first_set_motor_speed_dsp>0) { speed = ~(speed - 1); } return speed; } } void set_motor_off(void) { /** * @brief 电机速度为0时也不能彻底停止需要再发一个停止指令 * 3E 80 01 00 BF */ motor_off_state=1; unsigned char motor_off_cmd[20] = {0}; motor_off_cmd[0] = 0x3E; motor_off_cmd[1] = 0x80; motor_off_cmd[2] = 0X01; motor_off_cmd[3] = 0x00; motor_off_cmd[4] = 0xBF; send_cmd_to_motor(motor_off_cmd, 5); } //=========================================================================== //=========================================================================== //=========================================================================== //=========================================================================== int32_t set_moter_speed_internal(int32_t speed_dsp) { /** * @brief 速度闭环控制命令用来控制电机的速度 */ unsigned char motor_speed_cmd[20] = {0}; speed_dsp_now = speed_dsp; first_set_motor_speed_dsp = speed_dsp; speed_dsp = speed_dsp * 100; //电机下发速度要乘以100 motor_speed_cmd[0] = 0x3E; motor_speed_cmd[1] = 0xA2; motor_speed_cmd[2] = 0X01; motor_speed_cmd[3] = 0x04; motor_speed_cmd[4] = motor_speed_cmd[0] + motor_speed_cmd[1] + motor_speed_cmd[2] + motor_speed_cmd[3]; motor_speed_cmd[5] = speed_dsp & 0xFF; motor_speed_cmd[6] = (speed_dsp >> 8) & 0xFF; motor_speed_cmd[7] = (speed_dsp >> 16) & 0xFF; motor_speed_cmd[8] = (speed_dsp >> 24) & 0xFF; motor_speed_cmd[9] = motor_speed_cmd[5] + motor_speed_cmd[6] + motor_speed_cmd[7] + motor_speed_cmd[8]; send_cmd_to_motor(motor_speed_cmd, 10); if(speed_dsp_now==0) { sleep_ms(10); set_motor_off(); } } /* void set_motor_speed(int32_t speed_dsp_target) { /** * @brief 设置电机的速度 * @param 要设置的速度(经过单位换算过的) */ /* while(1) { if(speed_dsp_target==speed_dsp_now)//目标速度与现在的速度相等 { break; } else if(speed_dsp_target < speed_dsp_now)//说明用户向让速度减小 { int32_t setspeedthistime = speed_dsp_now - 10; if (setspeedthistime < speed_dsp_target) { setspeedthistime = speed_dsp_target; } set_moter_speed_internal(setspeedthistime); } else if (speed_dsp_target > speed_dsp_now) //说明用户想让速度进行增加 要设置的speed_dsp_target是150,现在的speed_dsp_now 0 { int32_t nowexpectspeed = speed_dsp_now + 10; if (nowexpectspeed > speed_dsp_target) { nowexpectspeed = speed_dsp_target; } set_moter_speed_internal(nowexpectspeed);// 去设置的是10 } sleep_ms(10); } } */