gfvb125 Napisano Lipiec 19, 2022 Udostępnij Napisano Lipiec 19, 2022 Witam. Jestem w trakcie budowy regulatora MPPT według tego filmu https://www.youtube.com/watch?v=qVfIR20kqQ0. Mógłby ktoś poprawić błędy w programie? Link do komentarza Share on other sites More sharing options...
Gieneq Lipiec 20, 2022 Udostępnij Lipiec 20, 2022 @gfvb125 witam na forum 🙂 Zanim ktoś zje cie negatywnymi komentarzami to zwrócę na coś uwagę - nikt nie obejrzy filmu tylko po to żeby przekopiować stamtąd kod i zrobić za ciebie pracę. Pokaż co zrobiłeś, z czym masz problem, wklej tu ładnie kod w ramkę dla kodu. 1 Link do komentarza Share on other sites More sharing options...
gfvb125 Lipiec 20, 2022 Autor tematu Udostępnij Lipiec 20, 2022 Kod wygląda tak. Usunąłem z niego wyświetlacz, czujniki prądu i temperatury oraz wentylator. Zależy mi tylko na śledzeniu punktu mocy maksymalnej. Informować o stanie ładowania mają tylko diody. Mikrokontroler to atmega328p. #define SOL_VOLTS_CHAN A0 #define BAT_VOLTS_CHAN A2 #define AVG_NUM 10 #define SOL_VOLTS_SCALE 28 #define BAT_VOLTS_SCALE 28 #define PWM_PIN 9 #define PWM_FULL 1023 #define PWM_MAX 100 #define PWM_MIN 60 #define PWM_START 90 #define PWM_INC 1 #define TRUE 1 #define FALSE 0 #define ON TRUE #define OFF FALSE #define ONE_SECOND 50000 #define LOW_SOL_WATTS 5.00 #define MIN_SOL_WATTS 1.00 #define MIN_BAT_VOLTS 11.00 #define MAX_BAT_VOLTS 14.10 #define HIGH_BAT_VOLTS 13.60 #define OFF_NUM 9 #define yellowLed 10 #define greenLed 11 #define redLed 12 float pwm = 0; float sol_volts; float bat_volts; int delta = PWM_INC; float old_sol_watts = 0; int disp_page=1; unsigned long prev_millis, pwm_disp_millis; double msec, last_msec, elasped_msec, elasped_time, ampSecs, wattSecs; enum charger_mode { off, on, bulk, bat_float } charger_state; void setup() { TCCR1B = TCCR1B & B11111000 | B00000001; analogWrite(PWM_PIN,0); pwm = PWM_START; charger_state = on; pinMode(yellowLed, OUTPUT); pinMode(greenLed, OUTPUT); pinMode(redLed, OUTPUT); digitalWrite(yellowLed,LOW); digitalWrite(greenLed,LOW); digitalWrite(redLed,LOW); } int read_adc(int channel){ int i; for (i=0; i<AVG_NUM; i++) { delayMicroseconds(50); } return(sum / AVG_NUM); } - void set_pwm_duty(void) { if (pwm > PWM_MAX) { PWM_MAX pwm = PWM_MAX; } else if (pwm < PWM_MIN) { pwm = PWM_MIN; } if (pwm < PWM_MAX) { analogWrite(PWM_PIN,(PWM_FULL * (long)pwm / 100)); } else if (pwm == PWM_MAX) { analogWrite(PWM_PIN,(PWM_FULL - 1)); } } void read_data(void) { sol_volts = read_adc(SOL_VOLTS_CHAN)*0.02705; bat_volts = read_adc(BAT_VOLTS_CHAN)*0.02613; } void power(void) { msec = millis(); elasped_msec = msec - last_msec; elasped_time = elasped_msec / 1000.0; last_msec = msec; } void ledIndication(void) { if (charger_state == off){ digitalWrite(greenLed,LOW); digitalWrite(yellowLed,LOW); digitalWrite(redLed,HIGH); } else if ((charger_state == bulk) || (charger_state == on)) { digitalWrite(greenLed,LOW); digitalWrite(yellowLed,HIGH); digitalWrite(redLed,LOW); } else if (charger_state == bat_float) { digitalWrite(greenLed,HIGH); digitalWrite(yellowLed,LOW); digitalWrite(redLed,LOW); } } void run_charger(void) { static int off_count = OFF_NUM; switch (charger_state) { case on: { charger_state = off; off_count = OFF_NUM; analogWrite(PWM_PIN,0); } else if (bat_volts > MAX_BAT_VOLTS) { charger_state = bat_float; } else if (sol_watts < LOW_SOL_WATTS) { pwm = PWM_MAX; set_pwm_duty(); as possible } else { pwm = ((bat_volts * 10) / (sol_volts / 10)) + 5; out what the pwm charger_state = bulk; } break; case bulk: if (sol_watts < MIN_SOL_WATTS) { charger_state = off; off_count = OFF_NUM; } else if (bat_volts > MAX_BAT_VOLTS) { charger_state = bat_float; } else if (sol_watts < LOW_SOL_WATTS) { charger_state = on; } else { pwm += delta; set_pwm_duty(); } break; case bat_float: if (sol_watts < MIN_SOL_WATTS) { charger_state = off; off_count = OFF_NUM; set_pwm_duty(); analogWrite(PWM_PIN,0); } else if (bat_volts > MAX_BAT_VOLTS) { pwm -= 1; set_pwm_duty(); } else if (bat_volts < MAX_BAT_VOLTS) { pwm += 1; set_pwm_duty(); if (pwm >= 100) { charger_state = bulk; } } break; case off: if (off_count > 0) { off_count--; } else if ((bat_volts > HIGH_BAT_VOLTS) && (bat_volts < MAX_BAT_VOLTS) && (sol_volts > bat_volts)) { charger_state = bat_float; set_pwm_duty(); } else if ((bat_volts > MIN_BAT_VOLTS) && (bat_volts < MAX_BAT_VOLTS) && (sol_volts > bat_volts)) { pwm = PWM_START; set_pwm_duty(); charger_state = on; } break; default: analogWrite(PWM_PIN,0); break; } } void loop() { read_data(); power(); run_charger(); if ((millis() > (prev_millis+ 1500))) { s prev_millis = millis(); ledIndication(); lcd_display1(); if (sol_amps > 2) if (disp_page==1) disp_page=2; else disp_page=1; } Link do komentarza Share on other sites More sharing options...
Kamil996 Listopad 28, 2022 Udostępnij Listopad 28, 2022 i jak, udało się? Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »