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

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.