Skocz do zawartości

(ATmega8a) Niepoprawna regulacja PWM za pomocą przetwornika ADC.


MichalBien

Pomocna odpowiedź

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;
}

 

buck.png

Edytowano przez MichalBien
Link do komentarza
Share on other sites

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ę »
×
×
  • 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.