[AVRGCC] Stabilizacja napięcia i prądu w przerywaczu

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
bercikw
-
Posty: 41
Rejestracja: 28 sie 2011, 15:30
Lokalizacja: Bydgoszcz
Kontakt:

[AVRGCC] Stabilizacja napięcia i prądu w przerywaczu

Post autor: bercikw » 23 sty 2014, 0:24

Dzień dobry,

Chciałbym zadać pytanie, czy ktoś z forumowiczów pisał kiedyś lub widział gdzieś przykład programu do sterowania stabilizowanym przerywaczem obniżającym. (Buck converter)

Próbuję nauczyć się stabilizowania zasilaczy na prostym układzie z ATmega128, w którym pomiar napięcia odbywa się przy pomocy dzielnika napięcia, zaś prądu za pomocą przetwornika LEM.

W załączonym kodzie, oba typy stabilizacji autonomicznie działają poprawnie. Tzn. gdy chcę stabilizować tylko napięcie lub tylko prąd to nie mam żadnych problemów. Jednak gdy dopiszę warunek "stabilizuj prąd gdy prąd zmierzony jest większy od wartości zadanej prądu" to w pobliżu granicy układ zaczyna mi oscylować. Da się to zauważyć gołym okiem ponieważ podłączona do przerywacza żarówka bardzo widocznie zmienia jasność świecenia.

Czy ktoś spotkał się z podobnym problemem i mógłby mi podpowiedzieć w jaki sposób napisać taką stabilizację? Szukałem różnych appnote z firmy Atmel jednak nic nie znalazłem. Oprócz tego LINKU. Jednak tam nie pokazano sposobu jednoczesnej stabilizacji prądu i napięcia.


Poniżej wspomniany kod:

Kod: Zaznacz cały

		if (prad<zadana_pradu)
		{
			if(napiecie<zadana_napiecia)
			{
				if (OCR0>0)
				{
					OCR0=OCR0-((zadana_napiecia-napiecie)/10);
				}
			}
			if(napiecie>zadana_napiecia)
			{
				if (OCR0<255)
				{
					OCR0=OCR0+((napiecie-zadana_napiecia)/10);
				}
			}
		} 

		else
		{
			if(prad<zadana_pradu)
			{
				if (OCR0>0)
				{
					OCR0=OCR0-((zadana_pradu-prad)/10);
				}
			}
			if(prad>zadana_pradu)
			{
				if (OCR0<255)
				{
					OCR0=OCR0+((prad-zadana_pradu)/10);
				}
			}
		}
PS
Zwiększenie rejestru OCR0 zmniejsza napięcie wyjściowe, gdyż mam podłączony driver odwracający.

Awatar użytkownika
dondu
Użytkownik
Posty: 211
Rejestracja: 24 maja 2005, 9:47
Lokalizacja: Śląskie
Kontakt:

Post autor: dondu » 23 sty 2014, 8:18

Witaj.

Zastanów się nad tym:

Kod: Zaznacz cały

if (prad<zadana_pradu) 
{ 
		....
} 
else 
{ 
		if(prad<zadana_pradu) 
		{ 
			..... ta część nigdy się nie wykona
		} 
		if(prad>zadana_pradu) 
		{ 
			....
		} 
} 

bercikw
-
Posty: 41
Rejestracja: 28 sie 2011, 15:30
Lokalizacja: Bydgoszcz
Kontakt:

Post autor: bercikw » 23 sty 2014, 22:59

Hmm... to prawda! Jakoś pisząc wieczorami mi to umknęło. Jednak usunięcie tego fragmentu nie zniweluje problemu. Wciąż na granicy powstają widoczne gołym okiem oscylacje.

ODPOWIEDZ