Cześć!
Zbudowałem na płytce stykowej taką przetwornicę typu Buck jak na zdjęciu i mam problem z regulacją napięcia. Równolegle z obciążeniem jakim jest rezystor 100om dołożyłem dzielnik napięcia z rezystora 51k i 10k do pomiaru napięcia wyjściowego. Dzielnik jest podpięty do wejścia ADC3 (PC3). Zadaję napięcie wyjściowe przetwornicy za pomocą potencjometru podpiętego do wyjścia ADC1 (PC1). I wszytko ładnie śmiga, napięcie na dzielniku jest równe zawsze napięciu na potencjometrze do czasu gdy nie włączę równolegle do opornika 100om drugi opornik 10om. Napięcie na wyjściu z zadanych 9V spada do 8V i napięcia na dzielniku i potencjometrze się nie zgadzają. Ale gdy zwiększę napięcie zadane na powiedzmy 10V to napięcie na wyjściu wynosi z powrotem 9V. Więc uważam że to jest problem ze złym sterowaniem PWMem
Problemem raczej nie jest niedostatek mocy. Przetwornica jest zasilana z prostownika a prostownik ze 100W transformatora (12V, 8A). Gdy dokładam ten opornik 10om to napięcie na wyjściu prostownika wynosi ok 13V więc jest zapas mocy.
Parametry przetwornicy
L=3mH 2A
Cwyj=2000uF
Mosfet= IRF630
Cbootstrap=2,2uF
Najbardziej mnie interesuje to czy uważacie że kod jest poprawny i tak zaprogramowana atmega może regulować napięcie
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
volatile uint8_t napiecie,pwm, kanal=3, zadane;
int main(void){
//ADC
ADMUX|=(1<<REFS1)|(1<<REFS0)|(1<<MUX1)|(1<<MUX0)|(1<<ADLAR);
ADCSRA|=(1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
//
//TIMER
DDRB|=(1<<PB3);
TCCR2|=(1<<WGM21)|(1<<WGM20)|(1<<COM21)|(1<<CS20);
TIMSK|=(1<<TOIE2);
//OCR2=100;
//
sei();
while(1){
//pomiar napiecia na wyjsciu
ADCSRA|=(1<<ADSC);
while (ADCSRA&(1<<ADSC));
napiecie=ADCH;
kanal=1;// zmiana kanalu napomiar napiecia z potenncjometru
ADMUX&=(0xE0);
ADMUX|=(kanal & 0x0F);
//pomiar napiecia zadanego
ADCSRA|=(1<<ADSC);
while (ADCSRA&(1<<ADSC));
zadane=ADCH;
kanal=3;//zmiana kanalu na wyjscie przetwornicy
ADMUX&=(0xE0);
ADMUX|=(kanal& 0x0F);
}
}
ISR(TIMER2_OVF_vect){
// regulacja pwm
// mosfet jest sterowany przez tranzystor bipolarny
// gdy na wyjsciu pwm atmegi jest stan niski na bramce
//jest stan wysoki
if(napiecie>zadane){
if(pwm<255)
pwm++;
}
if(napiecie<zadane){
if(pwm>0)
pwm--;
}
OCR2=pwm;
}