diff --git a/vscode/Unendlichkeitsmaschine/include/json.hpp b/vscode/Unendlichkeitsmaschine/include/json.hpp index 47d7f0d..916e9d5 100644 --- a/vscode/Unendlichkeitsmaschine/include/json.hpp +++ b/vscode/Unendlichkeitsmaschine/include/json.hpp @@ -13,7 +13,8 @@ typedef struct const char * unit; double value; float unit_factor; - unsigned long last_update_ms; + unsigned long prev_update_ms; + unsigned long act_update_ms; unsigned long timestamp; } DataStruct; diff --git a/vscode/Unendlichkeitsmaschine/include/main.hpp b/vscode/Unendlichkeitsmaschine/include/main.hpp index 2b249d0..07bfb9f 100644 --- a/vscode/Unendlichkeitsmaschine/include/main.hpp +++ b/vscode/Unendlichkeitsmaschine/include/main.hpp @@ -55,6 +55,7 @@ Servo ESC; // Der ESC-Controller (Electronic Speed Controller bzw. elektroni Oled display; const unsigned long UPDATE_TURN_VALUES_EVERY_MS = 1000; +const unsigned long UPDATE_ESC_EVERY_MS = 0; const uint8_t HALL_SENSORS_COUNT = 8; // input, sec, min, hour, day, week, month, year const uint8_t ALL_DATA_COUNT = HALL_SENSORS_COUNT; @@ -102,7 +103,7 @@ const uint8_t HALL8_PIN = 14; const uint16_t MIN_SPEED = 600; const uint16_t MAX_SPEED = 1200; const uint8_t MAX_ESC_SPEED = 60; -const uint8_t MIN_ESC_SPEED = 35; +const uint8_t MIN_ESC_SPEED = 37; const uint16_t MAX_POTI_VALUE = 4095; const uint16_t JITTER_POTI_PERCENT = 10; diff --git a/vscode/Unendlichkeitsmaschine/src/main.cpp b/vscode/Unendlichkeitsmaschine/src/main.cpp index 5bd2765..021269e 100644 --- a/vscode/Unendlichkeitsmaschine/src/main.cpp +++ b/vscode/Unendlichkeitsmaschine/src/main.cpp @@ -17,9 +17,9 @@ volatile double goal_speed = 1000; //1.0 * speed; volatile double current_speed = 0; volatile double err = 0; volatile double output = 0.0; -const double kp = 0.01; -const double ki = 0.001; -const double kd = 0.0005; +const double kp = 0.005; +const double ki = 0.0008; +const double kd = 0.0001; void ISR_HALL1(); void ISR_HALL2(); @@ -35,6 +35,7 @@ void data_generate(); void data_store(); void data_check(); void data_init(); +void speed_get(); void speed_set(); void count_secs(time_t* run_time); @@ -75,7 +76,7 @@ void setup() // Initialise timer timer = timerBegin(0, 80, true); // Timer 0, Prescaler 80, zähle im Up-Modus timerAttachInterrupt(timer, &ISR_onTimer, true); // Setze den Interrupt-Handler und aktiviere den Interrupt auf steigende Flanke - timerAlarmWrite(timer, 1000000, true); // Setze den Alarm auf 1/4 Sekunde und aktiviere ihn + timerAlarmWrite(timer, 1000000/8, true); // Setze den Alarm auf 1/4 Sekunde und aktiviere ihn timerAlarmEnable(timer); // Aktiviere den Alarm pinMode(39, INPUT_PULLDOWN); @@ -113,8 +114,9 @@ void loop() data_generate(); count_secs(&run_time); + speed_get(); speed_set(); - //data_check(); + data_check(); data_store(); #ifdef HAS_MQTT @@ -123,8 +125,7 @@ void loop() display.show_values(speed, MIN_SPEED, MAX_SPEED, HallData, HALL_SENSORS_COUNT, run_time, capportal.localIP()); - Serial.printf("PID ... (goal: %06.3f, current: %06.3f, err: %06.3f, integ: %06.3f, derive: %06.3f, output=%06.3f), esc_output=%06.3f \n", goal_speed, current_speed, err, integ, derivative, output, esc_output); - ESC.write(50); + } void count_secs(time_t* run_time) @@ -142,6 +143,24 @@ void count_secs(time_t* run_time) } void speed_set() +{ + static unsigned long last_esc_write_ms = 0; + static double last_esc_output = 0; + if(0 == last_esc_write_ms || millis() - last_esc_write_ms > UPDATE_ESC_EVERY_MS) + { + Serial.printf(">goal:%06.3f\n>current:%06.3f\n>err:%06.3f\n>integ:%06.3f\n>derive:%06.3f\n>output:%06.3f\n>esc_output:%06.3f\n", goal_speed, current_speed, err, integ, derivative, output, esc_output); + if(esc_output != last_esc_output) + { + //Serial.printf("PID ... (goal>:%06.3f, current>:%06.3f, err>:%06.3f, integ>:%06.3f, derive>:%06.3f, output>:%06.3f), esc_output>:%06.3f \n", goal_speed, current_speed, err, integ, derivative, output, esc_output); + + ESC.write(esc_output); + last_esc_output = esc_output; + last_esc_write_ms = millis(); + } + } +} + +void speed_get() { static uint8_t _count_meas = 0; static int _Drehregler = 0; @@ -219,16 +238,14 @@ void data_init() AllData[i].value = (AllData[i].ticks * AllData[i].unit_factor); } #endif - AllData[i].last_update_ms = current_millis; - + AllData[i].act_update_ms = 0; + AllData[i].prev_update_ms = 0; } } -/* + void data_check() { - unsigned long current_millis = millis(); - static unsigned long speedchanged_ms = current_millis ; /* Serial.printf("H1(pin %d): %d, H2(pin %d): %d, H3(pin %d): %d, H4(pin %d): %d, H5(pin %d) : %d, H6(pin %d) : %d, H7(pin %d) : %d, H8(pin %d) : %d.\n", HALL1_PIN, digitalRead(HALL1_PIN), @@ -243,22 +260,23 @@ void data_check() */ - /* - if(current_millis - speedchanged_ms >= UPDATE_TURN_VALUES_EVERY_MS) + for(uint8_t nr = 0; nr < HALL_SENSORS_COUNT; nr++) { - HallData[0].value = (HallData[0].period_ticks * HallData[0].unit_factor); - HallData[0].period_ticks = 0; - Serial.printf("current_millis: %lu goal speed: %lu calc speed: %f (%lu ticks in %lu ms) \n", current_millis, speed, HallData[0].value, current_millis - speedchanged_ms); - speedchanged_ms = current_millis; - } - - for(uint8_t nr = 1; nr < HALL_SENSORS_COUNT; nr++) - { - HallData[nr].value = (HallData[nr].ticks * HallData[nr].unit_factor); - HallData[nr].period_ticks = 0; + if( 0 == nr) + { + if( (HallData[nr].act_update_ms != 0) + && (HallData[nr].prev_update_ms != 0) + && (HallData[nr].prev_update_ms != HallData[nr].act_update_ms) + ) + { + HallData[nr].value = HallData[nr].unit_factor / (HallData[nr].act_update_ms - HallData[nr].prev_update_ms) ; + } + } + else{ + HallData[nr].value = (HallData[nr].ticks * HallData[nr].unit_factor); + } } } -*/ void data_store() { @@ -287,16 +305,11 @@ void IRAM_ATTR ISR_HALL1() HallData[hallnr].timestamp = run_time; // each 4 ticks is one turn // so we calculate speed each 4 ticks... just in case we check for bigger ... - /* if(HallData[hallnr].period_ticks >= HALL_TICKS_PER_TURN){ HallData[hallnr].period_ticks = 0; - if(HallData[hallnr].last_update_ms != 0) - { - HallData[hallnr].value = HallData[hallnr].unit_factor / HallData[hallnr].last_update_ms; - } - HallData[hallnr].last_update_ms = millis(); + HallData[hallnr].prev_update_ms = HallData[hallnr].act_update_ms; + HallData[hallnr].act_update_ms = millis(); } - */ } void IRAM_ATTR ISR_HALL2() @@ -304,8 +317,7 @@ void IRAM_ATTR ISR_HALL2() const uint8_t hallnr = 1; HallData[hallnr].ticks++; HallData[hallnr].timestamp = run_time; - HallData[hallnr].last_update_ms = millis(); - //HallData[hallnr].value = (HallData[hallnr].ticks * HallData[hallnr].unit_factor); + HallData[hallnr].act_update_ms = millis(); } void IRAM_ATTR ISR_HALL3() @@ -313,8 +325,7 @@ void IRAM_ATTR ISR_HALL3() const uint8_t hallnr = 2; HallData[hallnr].ticks++; HallData[hallnr].timestamp = run_time; - HallData[hallnr].last_update_ms = millis(); - //HallData[hallnr].value = (HallData[hallnr].ticks * HallData[hallnr].unit_factor); + HallData[hallnr].act_update_ms = millis(); } void IRAM_ATTR ISR_HALL4() @@ -322,8 +333,7 @@ void IRAM_ATTR ISR_HALL4() const uint8_t hallnr = 3; HallData[hallnr].ticks++; HallData[hallnr].timestamp = run_time; - HallData[hallnr].last_update_ms = millis(); - //HallData[hallnr].value = (HallData[hallnr].ticks * HallData[hallnr].unit_factor); + HallData[hallnr].act_update_ms = millis(); } void IRAM_ATTR ISR_HALL5() @@ -331,8 +341,7 @@ void IRAM_ATTR ISR_HALL5() const uint8_t hallnr = 4; HallData[hallnr].ticks++; HallData[hallnr].timestamp = run_time; - HallData[hallnr].last_update_ms = millis(); - //HallData[hallnr].value = (HallData[hallnr].ticks * HallData[hallnr].unit_factor); + HallData[hallnr].act_update_ms = millis(); } void IRAM_ATTR ISR_HALL6() @@ -340,8 +349,7 @@ void IRAM_ATTR ISR_HALL6() const uint8_t hallnr = 5; HallData[hallnr].ticks++; HallData[hallnr].timestamp = run_time; - HallData[hallnr].last_update_ms = millis(); - //HallData[hallnr].value = (HallData[hallnr].ticks * HallData[hallnr].unit_factor); + HallData[hallnr].act_update_ms = millis(); } void IRAM_ATTR ISR_HALL7() @@ -349,8 +357,7 @@ void IRAM_ATTR ISR_HALL7() const uint8_t hallnr = 6; HallData[hallnr].ticks++; HallData[hallnr].timestamp = run_time; - HallData[hallnr].last_update_ms = millis(); - //HallData[hallnr].value = (HallData[hallnr].ticks * HallData[hallnr].unit_factor); + HallData[hallnr].act_update_ms = millis(); } void IRAM_ATTR ISR_HALL8() @@ -358,13 +365,9 @@ void IRAM_ATTR ISR_HALL8() const uint8_t hallnr = 7; HallData[hallnr].ticks++; HallData[hallnr].timestamp = run_time; - HallData[hallnr].last_update_ms = millis(); - //HallData[hallnr].value = (HallData[hallnr].ticks * HallData[hallnr].unit_factor); + HallData[hallnr].act_update_ms = millis(); } - - - void IRAM_ATTR ISR_onTimer() { current_speed = HallData[0].value; @@ -379,10 +382,6 @@ void IRAM_ATTR ISR_onTimer() //Aktualisierung der letzten Fehler- und Zeitwerte last_error = err; - - //Ansteuerung des Outputs - - //ESC.write(50); } //this code is just for generating dummy data - in normal use not needed