diff --git a/vscode/Unendlichkeitsmaschine/include/json.hpp b/vscode/Unendlichkeitsmaschine/include/json.hpp index ef180c4..e969131 100644 --- a/vscode/Unendlichkeitsmaschine/include/json.hpp +++ b/vscode/Unendlichkeitsmaschine/include/json.hpp @@ -20,7 +20,7 @@ typedef struct { int max_speed; int min_speed; double max_esc_out; - double min_esc_out + double min_esc_out; }PIDStruct; typedef struct diff --git a/vscode/Unendlichkeitsmaschine/src/main.cpp b/vscode/Unendlichkeitsmaschine/src/main.cpp index 79c9b73..d5be3c0 100644 --- a/vscode/Unendlichkeitsmaschine/src/main.cpp +++ b/vscode/Unendlichkeitsmaschine/src/main.cpp @@ -24,6 +24,7 @@ void data_store(); void data_check(); void data_init(); void speed_set(); +void eval_max_min_speed(); void PID(); unsigned long time_per_round_calc(); @@ -73,6 +74,7 @@ void setup() ESC.write(0); display.progressBar(100,"ETC init done!", true); delay(1000); + display.progressBar(100,"Init data and IRQ!", true); data_init(); #ifndef DUMMY_DATA @@ -98,6 +100,10 @@ void setup() attachInterrupt(digitalPinToInterrupt(HALL8_PIN), ISR_HALL8, FALLING); #endif + + Serial.println(" Measuring min and max speed values ... "); + eval_max_min_speed(); + Serial.println(" Auf gehts ... "); } @@ -115,35 +121,47 @@ void loop() mqtt.send_and_loop("infinity/data", json.create_json_string(AllData, ALL_DATA_COUNT, &Pid_params, run_time)); #endif - display.show_values(Pid_params.speed, MIN_SPEED, MAX_SPEED, HallData, HALL_SENSORS_COUNT, run_time, capportal.localIP()); + display.show_values(Pid_params.speed, Pid_params.min_speed, Pid_params.max_speed, HallData, HALL_SENSORS_COUNT, run_time, capportal.localIP()); } void eval_max_min_speed() { + display.progressBar(0,"Min/Max measure!", true); Pid_params.min_esc_out = 0; Pid_params.min_speed = 0; for(uint8_t out = Pid_params.min_speed; out < Pid_params.max_esc_out; out++) { ESC.write(out); + String esc_str = String("esc_out = " + String(out)); + String speed_str = String("speed_out = " + String(HallData[0].value)); delay(1000); for(uint8_t i=0;i<10;i++) { + display.progressBar(out*10+i,"Min/Max measure!", esc_str.c_str(), speed_str.c_str(), true); data_check(); - delay(1000); + delay(100); if (0 == Pid_params.min_speed && HallData[0].value > 0) { Pid_params.min_speed = HallData[0].value; - Pid_params.min_esc_out = out + Pid_params.min_esc_out = out; break; } } + if (Pid_params.min_speed > 0) + { + break; + } } + display.progressBar(100,"Min speed/esc:", String("min_speed =" + String(Pid_params.min_speed) ).c_str(), String("min_esc_out = " + String(Pid_params.min_esc_out)).c_str(), true); ESC.write(Pid_params.max_esc_out); delay(2000); + data_check(); Pid_params.max_speed = HallData[0].value; + display.progressBar(100,"Max speed/esc:", String("max_speed =" + String(Pid_params.max_speed) ).c_str(), String("max_esc_out = " + String(Pid_params.max_esc_out)).c_str(), true); ESC.write(0); + Serial.printf(">min_speed:%d\n>max_speed:%d\n>min_esc_out:%d\n>max_esc_out:%d\n",Pid_params.min_speed, Pid_params.max_speed, Pid_params.min_esc_out, Pid_params.max_esc_out ); delay(2000); } @@ -174,7 +192,7 @@ void PID() Pid_params.derivative = 0; } - Pid_params.err = constrain(Pid_params.speed - Pid_params.current_speed, -100, 100); + Pid_params.err = constrain(Pid_params.speed - Pid_params.current_speed, -1*Pid_params.max_speed, Pid_params.current_speed); double int_integ = Pid_params.integ + Pid_params.err; double int_derivative = Pid_params.err - last_error; if(Pid_params.ki != 0) @@ -220,7 +238,7 @@ void PID() Pid_params.output = Pid_params.kp * Pid_params.err + Pid_params.ki * Pid_params.integ + Pid_params.kd * Pid_params.derivative; if(-1 == ser_esc_output ) { - Pid_params.esc_output = constrain(Pid_params.output, MIN_ESC_SPEED, MAX_ESC_SPEED); + Pid_params.esc_output = constrain(Pid_params.output, Pid_params.min_esc_out, Pid_params.max_esc_out); } else { @@ -290,7 +308,8 @@ void speed_set() if(0 == last_esc_write_ms || millis() - last_esc_write_ms > UPDATE_ESC_EVERY_MS) { PID(); - Serial.printf(">speed:%06.3f\n>current:%06.3f\n>esc:%06.3f\n",Pid_params.speed, Pid_params.current_speed, Pid_params.esc_output); + Serial.printf(">speed:%06.3f\n>current:%06.3f\n>esc:%06.3f\n>prop:%06.3f\n>derive:%06.3f\n>integ:%06.3f\n",Pid_params.speed, Pid_params.current_speed, Pid_params.esc_output, Pid_params.err, Pid_params.derivative, Pid_params.integ); + //Serial.printf(">speed:%06.3f\n>current:%06.3f\n>esc:%06.3f\n",Pid_params.speed, Pid_params.current_speed, Pid_params.esc_output); ESC.write(Pid_params.esc_output); last_esc_write_ms = millis(); Pid_params.timestamp = last_esc_write_ms; @@ -308,8 +327,8 @@ void data_init() Pid_params.current_speed = 0.0; Pid_params.err = 0; Pid_params.output = 0.0; - Pid_params.kp = 0.001; - Pid_params.ki = 0.001; + Pid_params.kp = 0.002; + Pid_params.ki = 0.003; Pid_params.kd = 0.001; Pid_params.max_speed = 5000; Pid_params.min_speed = 0; @@ -384,7 +403,7 @@ void data_check() else { HallData[nr].value = HallData[nr].unit_factor / mid_time; - HallData[nr].value = HallData[nr].value > MAX_SPEED? MAX_SPEED:HallData[nr].value; + HallData[nr].value = HallData[nr].value > Pid_params.max_speed? Pid_params.max_speed:HallData[nr].value; } } } @@ -450,11 +469,11 @@ void get_serial_cmd() Serial.printf("Set to drive PID control mode.\n"); } else if(command.equals("max")){ - ser_esc_output = MAX_ESC_SPEED; + ser_esc_output = Pid_params.max_esc_out; Serial.printf("Set to maximal speed. %f\n", ser_esc_output); } else if(command.equals("min")){ - ser_esc_output = MIN_ESC_SPEED; + ser_esc_output = Pid_params.min_esc_out; Serial.printf("Set to minimal speed %f .\n", ser_esc_output ); } else if(command.equals("start")){