diff --git a/lib/buffer/buffer.cpp b/lib/buffer/buffer.cpp index 9a3ca2c..38175dd 100644 --- a/lib/buffer/buffer.cpp +++ b/lib/buffer/buffer.cpp @@ -47,7 +47,7 @@ bool is_front=false;//前进标志位 uint32_t front_time=0;//前进时间 const uint32_t DEFAULT_TIMEOUT = 60000; uint32_t timeout=60000;//超时时间,单位:ms; -bool is_error=false;//错误标志位,如果连续60s推送耗材没停过,则认为错误 +bool is_error=true;//错误标志位,如果连续60s推送耗材没停过,则认为错误 String serial_buf; static HardwareTimer timer(TIM6);//超时出错 @@ -81,11 +81,16 @@ float encoder_length=1.73;//MDM段堵料模块每脉冲对应的线材移动量 const float DEFAULT_ALLOW_ERROR_SCALE = 2; float allow_error_scale=2;//允许误差比例 +uint32_t I_CURRENT = 500; //电流 + const int EEPROM_ADDR_TIMEOUT = 0; const int EEPROM_ADDR_STEPS = 4; const int EEPROM_ADDR_ENCODER_LENGTH = 8; const int EEPROM_ADDR_ERROR_SCALE = 12; const int EEPROM_ADDR_SPEED = 16; +const int EEPROM_ADDR_I_CURRENT = 20; +const int EEPROM_ADDR_ENDSTOP_OUT = 24; + //独立看门狗 @@ -93,6 +98,8 @@ const int EEPROM_ADDR_SPEED = 16; IWDG_HandleTypeDef hiwdg; static volatile uint32_t g_run_cnt=0; +bool DUANLIAO_OUT_STATE = 0; //断料输出状 0 +Buffer_Parameter buffer_para; void iwdg_init(void) { @@ -128,6 +135,21 @@ void Signal_Dir_Init(void); // void Buffer_S2_IT_Callback(void); // void Buffer_S1_IT_Callback(void); +void buffer_parameter_init(Buffer_Parameter &buffer_para){ + EEPROM.get(0, buffer_para); + if(buffer_para.magic_number!=0x55AA){ + buffer_para=Buffer_Parameter{DEFAULT_TIMEOUT,DEFAULT_STEPS,DEFAULT_ENCODER_LENGTH,DEFAULT_ALLOW_ERROR_SCALE,260,I_CURRENT,DUANLIAO_OUT_STATE,0x55AA}; + EEPROM.put(0, buffer_para); + } + timeout=buffer_para.timeout; + steps=buffer_para.steps; + encoder_length=buffer_para.encoder_length; + allow_error_scale=buffer_para.allow_error_scale; + SPEED=buffer_para.SPEED; + I_CURRENT=buffer_para.I_CURRENT; + DUANLIAO_OUT_STATE=buffer_para.DUANLIAO_OUT_STATE; +} + void buffer_init(){ NVIC_SetPriority(TIM6_DAC_IRQn,0);//超时出错,独立看门狗 @@ -144,27 +166,13 @@ void buffer_init(){ } + buffer_parameter_init(buffer_para); Pulse_Receive_Init(); buffer_sensor_init(); buffer_motor_init(); Signal_Dir_Init(); delay(1000); - EEPROM.get(EEPROM_ADDR_TIMEOUT, timeout); - // 判断读取的值是否有效(例如首次写入前是 0xFFFFFFFF 或 0) - if (timeout == 0xFFFFFFFF || timeout == 0) { - timeout = DEFAULT_TIMEOUT; - EEPROM.put(EEPROM_ADDR_TIMEOUT, timeout); - // Serial.println("EEPROM is empty"); - } else { - // Serial.print("read timeout: "); - // Serial.println(timeout); - } - - EEPROM.get(EEPROM_ADDR_SPEED, SPEED); - if (SPEED < 0 || SPEED > 1000) { - SPEED=260; - } VACTRUAL_VALUE=(uint32_t)(SPEED*Move_Divide_NUM*200/60/0.715) ; //VACTUAL寄存器值 @@ -288,6 +296,7 @@ void buffer_sensor_init(){ } void buffer_motor_init(){ + //电机驱动引脚初始化 pinMode(EN_PIN, OUTPUT); pinMode(STEP_PIN, OUTPUT); @@ -434,8 +443,8 @@ void motor_control(void) driver.VACTUAL(STOP); //停止 motor_state=Stop; - //断料引脚输出低电平 - digitalWrite(DUANLIAO,0); + //断料引脚输出断料状态 + digitalWrite(DUANLIAO,DUANLIAO_OUT_STATE); //关闭指示灯 digitalWrite(START_LED,0); @@ -449,8 +458,8 @@ void motor_control(void) return;//无耗材,结束 } else if(!blockage_detect.blockage_flag){ - //有耗材,断料引脚输出高电平 - digitalWrite(DUANLIAO,1); + //有耗材,断料引脚输出非断料状态 + digitalWrite(DUANLIAO,!DUANLIAO_OUT_STATE); //开启指示灯 digitalWrite(START_LED,1); @@ -467,7 +476,7 @@ void motor_control(void) motor_state=Stop; //断料引脚输出低电平 - digitalWrite(DUANLIAO,0); + digitalWrite(DUANLIAO,DUANLIAO_OUT_STATE); //关闭指示灯 digitalWrite(START_LED,0); @@ -481,8 +490,8 @@ void motor_control(void) return;//无耗材,结束 } - //有耗材,断料引脚输出高电平 - digitalWrite(DUANLIAO,1); + //有耗材,断料引脚输出非断料状态 + digitalWrite(DUANLIAO,!DUANLIAO_OUT_STATE); //开启指示灯 digitalWrite(START_LED,1); @@ -750,8 +759,9 @@ void USB_Serial_Analys(void){ serial_buf=""; Serial.println("Error: Invalid timeout value."); } + buffer_para.timeout=num; timeout=num; - EEPROM.put(EEPROM_ADDR_TIMEOUT, timeout); + EEPROM.put(0, buffer_para); serial_buf=""; Serial.print("set timeout succeed! timeout="); Serial.println(timeout); @@ -769,8 +779,9 @@ void USB_Serial_Analys(void){ serial_buf=""; Serial.println("Error: Invalid steps value."); } + buffer_para.steps=num; steps=num; - EEPROM.put(EEPROM_ADDR_STEPS, steps); + EEPROM.put(0, buffer_para); serial_buf=""; Serial.print("set steps succeed! steps="); Serial.println(steps); @@ -800,8 +811,9 @@ void USB_Serial_Analys(void){ serial_buf=""; Serial.println("Error: Invalid encoder length value."); } + buffer_para.encoder_length=num; encoder_length=num; - EEPROM.put(EEPROM_ADDR_ENCODER_LENGTH, encoder_length); + EEPROM.put(0, buffer_para); serial_buf=""; blockage_detect.allow_error = encoder_length*allow_error_scale; Serial.print("set encoder length succeed! encoder_length="); @@ -813,6 +825,7 @@ void USB_Serial_Analys(void){ Serial.println("steps="+String(steps)); Serial.println("allow_error_scale="+String(allow_error_scale)); Serial.println("allow_error="+String(blockage_detect.allow_error)); + Serial.println("DUANLIAO_OUT_STATE="+String(buffer_para.DUANLIAO_OUT_STATE)); } else if(strstr(serial_buf.c_str(),"scale")){ int index=serial_buf.indexOf(" "); @@ -827,8 +840,9 @@ void USB_Serial_Analys(void){ serial_buf=""; Serial.println("Error: Invalid scale length value."); } + buffer_para.allow_error_scale=num; allow_error_scale=num; - EEPROM.put(EEPROM_ADDR_ERROR_SCALE, allow_error_scale); + EEPROM.put(0, buffer_para); serial_buf=""; blockage_detect.allow_error = encoder_length*allow_error_scale; Serial.print("set scale length succeed! allow_error_scale="); @@ -849,13 +863,54 @@ void USB_Serial_Analys(void){ serial_buf=""; Serial.println("Error: Invalid speed value."); } + buffer_para.SPEED=num; SPEED=num; VACTRUAL_VALUE=(uint32_t)(SPEED*Move_Divide_NUM*200/60/0.715) ; //VACTUAL寄存器值 - EEPROM.put(EEPROM_ADDR_SPEED, SPEED); + EEPROM.put(0, buffer_para); serial_buf=""; Serial.print("set speed succeed! speed="); Serial.println(SPEED); } + else if(strstr(serial_buf.c_str(),"I")){ + int index=serial_buf.indexOf(" "); + if(index==-1){ + serial_buf=""; + Serial.println("I_CURRENT="+String(I_CURRENT)); + return ; + } + serial_buf=serial_buf.substring(index+1); + // float num = serial_buf.toFloat(); + int32_t num = atoi(serial_buf.c_str()); + if(num<0||num>3000){ + serial_buf=""; + Serial.println("Error: Invalid I_CURRENT value,range:0-3000mA"); + return ; + } + buffer_para.I_CURRENT=num; + I_CURRENT=num; + EEPROM.put(0, buffer_para); + serial_buf=""; + Serial.print("set I_CURRENT succeed! I_CURRENT="); + Serial.println(I_CURRENT); + } + + else if(strstr(serial_buf.c_str(),"out")){ + int index=serial_buf.indexOf(" "); + if(index==-1){ + serial_buf=""; + Serial.println("DUANLIAO_OUT_STATE="+String(buffer_para.DUANLIAO_OUT_STATE)); + return ; + } + serial_buf=serial_buf.substring(index+1); + bool state = atoi(serial_buf.c_str()); + buffer_para.DUANLIAO_OUT_STATE=state; + DUANLIAO_OUT_STATE=state; + EEPROM.put(0, buffer_para); + serial_buf=""; + Serial.print("set DUANLIAO_OUT_STATE succeed! DUANLIAO_OUT_STATE="); + Serial.println(DUANLIAO_OUT_STATE); + } + else{ @@ -870,6 +925,8 @@ void USB_Serial_Analys(void){ Serial.print("| show all info : |\n"); Serial.print("| set scale: |\n"); Serial.print("| set speed(r/min): |\n"); + // Serial.print("| set I_CURRENT(mA): |\n"); + Serial.print("| endstop out: |\n"); Serial.print("+-----------------------------------------------+\n\n"); } serial_buf=""; @@ -983,8 +1040,8 @@ void REIN_TIM_SIGNAL_COUNT_DeInit(void) */ void Signal_Dir_Init(void) { - pinMode(DIR_PIN,INPUT); - attachInterrupt(DIR_PIN,&Dir_IT_Callback,CHANGE); + pinMode(SIG_DIR_PIN,INPUT); + attachInterrupt(SIG_DIR_PIN,&Dir_IT_Callback,CHANGE); } @@ -995,65 +1052,12 @@ void Signal_Dir_Init(void) **/ void Pulse_Receive_Init(void){ - EEPROM.get(EEPROM_ADDR_ERROR_SCALE, allow_error_scale); - // 判断读取的值是否有效(例如首次写入前是 0xFFFFFFFF 或 0) - if (allow_error_scale == 0||isnan(allow_error_scale)) - { - allow_error_scale = DEFAULT_ALLOW_ERROR_SCALE; - EEPROM.put(EEPROM_ADDR_ERROR_SCALE, allow_error_scale); - Serial.println("EEPROM is empty"); - } - else - { - Serial.print("read allow_error_scale: "); - Serial.println(allow_error_scale); - } - - - - // PULSE2_PIN初始化 if(connet_mdm_flag){ pinMode(PULSE2_PIN,INPUT); attachInterrupt(PULSE2_PIN,&Recv_MDM_Pulse_IT_Callback,RISING); - } - - EEPROM.get(EEPROM_ADDR_ENCODER_LENGTH, encoder_length); - // 判断读取的值是否有效(例如首次写入前是 0xFFFFFFFF 或 0) - if (encoder_length == 0||isnan(encoder_length)) - { - encoder_length = DEFAULT_ENCODER_LENGTH; - EEPROM.put(EEPROM_ADDR_ENCODER_LENGTH, encoder_length); - Serial.println("EEPROM is empty"); - } - else - { - Serial.print("read encoder_length: "); - Serial.println(encoder_length); - } - - - - // PULSE1_PIN初始化 - // 使用硬件定时器接收 - EEPROM.get(EEPROM_ADDR_STEPS, steps); - // 判断读取的值是否有效(例如首次写入前是 0xFFFFFFFF 或 0) - if (steps > 51200 || timeout == 0) - { - steps = DEFAULT_STEPS; - EEPROM.put(EEPROM_ADDR_STEPS, steps); - Serial.println("EEPROM is empty"); - } - else - { - Serial.print("read steps: "); - Serial.println(steps); - } - - if(connet_mdm_flag){ REIN_TIM_SIGNAL_COUNT_Init(); } - blockage_detect.allow_error = encoder_length*allow_error_scale; } diff --git a/lib/buffer/buffer.h b/lib/buffer/buffer.h index 09f7868..ebbf94e 100644 --- a/lib/buffer/buffer.h +++ b/lib/buffer/buffer.h @@ -60,7 +60,7 @@ //堵料检测 #define PULSE1_PIN EXTENSION_PIN5 //接收脉冲引脚1,接收主控脉冲 -#define DIR_PIN EXTENSION_PIN3 //方向引脚,挤出1,回抽0 +#define SIG_DIR_PIN EXTENSION_PIN3 //方向引脚,挤出1,回抽0 #define PULSE2_PIN EXTENSION_PIN4 //接收脉冲引脚2,接收段断料模块脉冲 #define MDM_DPIN EXTENSION_PIN6 //MDM断料引脚 1:有耗材 0:无耗材 @@ -93,11 +93,11 @@ static int32_t SPEED=260; //转速(单位:r/min) static int32_t VACTRUAL_VALUE=(uint32_t)(SPEED*Move_Divide_NUM*200/60/0.715) ; //VACTUAL寄存器值 #define STOP 0 //停止 -#define I_CURRENT (500) //电流 #define WRITE_EN_PIN(x) digitalWrite(EN_PIN,x)//使能EN引脚 #define FORWARD 1//耗材方向 #define BACK 0 + #define DEBUG 0 //定义结构体存储缓冲器中各传感器的的状态 @@ -139,6 +139,17 @@ typedef struct BlockageDetect }BlockageDetect; +struct Buffer_Parameter{ + uint32_t timeout; + uint32_t steps; + float encoder_length; + float allow_error_scale; + int32_t SPEED; + uint32_t I_CURRENT; + bool DUANLIAO_OUT_STATE; + uint16_t magic_number; +}; + extern void buffer_sensor_init(); extern void buffer_motor_init();