Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
170 changes: 87 additions & 83 deletions lib/buffer/buffer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);//超时出错
Expand Down Expand Up @@ -81,18 +81,25 @@ 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;



//独立看门狗
#include "stm32f0xx_hal_iwdg.h"

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)
{
Expand Down Expand Up @@ -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);//超时出错,独立看门狗
Expand All @@ -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寄存器值


Expand Down Expand Up @@ -288,6 +296,7 @@ void buffer_sensor_init(){
}

void buffer_motor_init(){

//电机驱动引脚初始化
pinMode(EN_PIN, OUTPUT);
pinMode(STEP_PIN, OUTPUT);
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand All @@ -467,7 +476,7 @@ void motor_control(void)
motor_state=Stop;

//断料引脚输出低电平
digitalWrite(DUANLIAO,0);
digitalWrite(DUANLIAO,DUANLIAO_OUT_STATE);

//关闭指示灯
digitalWrite(START_LED,0);
Expand All @@ -481,8 +490,8 @@ void motor_control(void)
return;//无耗材,结束
}

//有耗材,断料引脚输出高电平
digitalWrite(DUANLIAO,1);
//有耗材,断料引脚输出非断料状态
digitalWrite(DUANLIAO,!DUANLIAO_OUT_STATE);

//开启指示灯
digitalWrite(START_LED,1);
Expand Down Expand Up @@ -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);
Expand All @@ -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);
Expand Down Expand Up @@ -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=");
Expand All @@ -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(" ");
Expand All @@ -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=");
Expand All @@ -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{
Expand All @@ -870,6 +925,8 @@ void USB_Serial_Analys(void){
Serial.print("| show all info : <info CRLF> |\n");
Serial.print("| set scale: <scale nnn CRLF> |\n");
Serial.print("| set speed(r/min): <speed nnn CRLF> |\n");
// Serial.print("| set I_CURRENT(mA): <I nnn CRLF> |\n");
Serial.print("| endstop out: <out n> |\n");
Serial.print("+-----------------------------------------------+\n\n");
}
serial_buf="";
Expand Down Expand Up @@ -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);
}


Expand All @@ -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;
}
Expand Down
15 changes: 13 additions & 2 deletions lib/buffer/buffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -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:无耗材

Expand Down Expand Up @@ -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

//定义结构体存储缓冲器中各传感器的的状态
Expand Down Expand Up @@ -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();

Expand Down