Skocz do zawartości

Budowa regulatora MPPT


gfvb125

Pomocna odpowiedź

@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.

  • Lubię! 1
Link do komentarza
Share on other sites

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

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

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

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.