Detekcja zera od podstaw
Witam
Dziś chciałbym przybliżyć Wam zagadnienie Detekcji Zera potocznie zwane detekcja przejścia przez zero.
Jak wiadomo prąd przemienny charakteryzuje się pulsacją, czyli cyklicznymi zmianami swojej polaryzacji 50 razy na sekundę a więc napięcie w ciągu jednej sekundy 100 razy osiąga wartość 0V. Naszym zadaniem jest wykrycie przecięcia osi x przez napięcie.
Wszyscy widzieliśmy tak zwane ściemniacze do oświetlenia, oczywiście mowa tu o oświetleniu żarowym, większość ściemniaczy nie zadziała z żarówkami energooszczędnymi /świetlówkami/, gdyż zasada ich działania nie opiera się na spożytkowaniu prądu do rozżarzenia żarnika, tylko na jonizacji “gazu”, to właśnie to “spożytkowanie” powoduje żarzenie się żarnika, wyobraźmy sobie teraz sytuacje w której zamiast doprowadzić do żarówki pełne napięcie tylko jego połowę, żarówka będzie się świecić ciemniej. Taką sytuację można osiągnąć na dwa sposoby, poprzez ograniczenie prądu płynącego przez żarnik opornikiem lub sprytnym wycinaniem z wykresu sinusoidy napięcia przemiennego kawałków, takich aby żarówka świeciła proporcjonalnie do dostarczonego napięcia.
Dla prostego ściemniacza można zastosować Diaka, który załączy Triaka w odpowiednim punkcie sinusoidy, punkt ten można odpowiednio przesunąć od zera za pomocą zwyczajnego potencjometru. Schemat realizujący takie proste ściemnianie widoczny jest na poniższym rysunku.
Co natomiast gdy potrzebujemy bardziej dokładnie sterować mocą, na przykład za pomocą Atmegi. Nic prostszego, wystarczy zbudować odpowiedni układ podobny do tego z rysunku poniżej.
Zasada działania powyższego układu jest prosta, dioda zawarta w optotriaku /zastosowano CNY17/ świeci przez cały czas przepływu przez nią prądu a przestaje świecić w momencie kiedy wykres przechodzi właśnie przez zero. Dioda przestaje świecić i fototranzystor zostaje zatkany, gdy prąd ponownie zaczyna płynąć przez diodę ta zaczyna świecić i fototranzystor zostaje odetkany. Podłączeniu fototranzystora do nóżki Atmegi wykorzystamy do programowego wykrycia zera funkcji. W tym celu kolektor fototranzystora podłączamy do procesora i ustawiamy przerwanie zewnętrzne, wyzwalane wznoszącym zboczem, które nastąpi w momencie gdy dioda w optotriaku zacznie ponownie świecić. W tym momencie procesor przejdzie do obsługi przerwania. Nam nie pozostaje nic innego jak tylko napisanie jej obsługi. Wykorzystamy któryś z Timerów Atmegi do odmierzania czasu, który będzie nam potrzebny do opóźnienia włączenia triaka, a tym samym do zmniejszenia napięcia dostarczonego do odbiornika. Cała ta zabawa bierze się stąd, iż triak po przejściu wykresu przez zero samoczynnie się wyłączy, a my musimy go ponownie włączyć i to właśnie włączenie nastąpi w momencie ściśle przez nas kontrolowanym.
W tym celu połówkę sinusoidy dzielimy sobie na równe kawałki czasowe, wykorzystując do tego Timer Atmegi którego częstotliwość pracy ustawiamy dla przykładu na 100KHz, co daje nam przerwanie co 0.00001 sekundy, okres przebiegu prądu przemiennego trwa 0.02 sekundy co daje nam podział jednego kawałka sinusa na 2000 równych części, teraz tylko wystarczy odczekać odpowiednią ilość cykli zegara i wysłać impuls załączenia triaka. Impuls nie powinien być mniejszy niż 0.0002 sekundy. No i mamy gotowy algorytm płynnego sterowania żarówką. W moim sterowniku CO taką właśnie procedurę zastosowałem do płynnej regulacji dmuchawy pieca, oraz załączania pompy obiegu wody.
To tyle teorii teraz praktyka. Poniżej części kodu odpowiedzialna za inicjacje pinów Atmegi.
C |copy code |?
1 2 {3 4 5 6 7 8 9 }
Jak widać nic ciekawego się tu nie dzieje, ważną częścią jest włączenie podciągnięcia pinu INT0 do 5V /PULLUP/, inaczej nasze przerwanie nie będzie miało szans działać, gdyż nie nastąpi narastające zbocze po tym jak dioda zacznie świecić.
Kod inicjacji przerwań
C |copy code |?
01 02 {03 #ifdef __AVR_ATmega8__04 05 06 #else07 08 09 #endif10 11 //Timer2 - 200KHZ dla 16MHZ 100Khz dla 8Mhz CTC, sterowanie triakami12 13 #ifdef __AVR_ATmega8__14 15 #else16 17 #endif18 19 20 21 22 23 24 }
W powyższym kodzie inicjujemy przerwania INT0 oraz Timera2 Atmegi do odliczania czasu przesunięcia załączenia triaka.
C |copy code |?
01 02 {03 //przerwanie generowane po przejsciu przez 0 wykresu sinusoidy04 //wyzwalajace wznoszączym zboczem sygnalu05 //przepisanie rejestru tymczasowego do rejestru opozniajacego06 //czas ktory odczekujemy po przejsciu przez 0 aby wlaczyc triak07 08 09 }10 11 12 {13 //sterownie Triakiem Wentylatora14 15 {16 17 {18 19 {20 21 22 }23 else24 {25 26 }27 }28 }
W przerwaniu Timera2 w powyższym kodzie odliczamy czas zadany w zmiennej timerT2_tmp, która zostanie przepisana w przerwaniu INT0 do zmiennej timerT2 służąca do odliczania opóźnienia, zmienna timerT2_tmp może zostać ustawiona w głównej pętli programu w wyniku reakcji na kody pilota zdalnego sterowania o czym pisałem w tym artykule odczyt kodów RC5, i jest to właśnie czas, po którym nastąpi załączenie Triaka. Natomiast ustawienie zmiennej timerT2 na 20; służy do wprowadzenia krótkiego opóźnienia potrzebnego na reakcje triaka.
UWAGA: Wszystkie prace i eksperymenty z napięciem 22oV zagrażają twojemu życiu i zdrowiu, wykonuj je z najwyższą uwagą.
 5 kwietnia, 2014 
		 
									| 
			 	
			Posted by   admin
 
			5 kwietnia, 2014 
		 
									| 
			 	
			Posted by   admin  
				  
			 
			


 Categories:
 Categories: