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.

detekcja

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.

Źródło http://pl.wikipedia.org/wiki/Diak

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.

wykonawczy

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. inline void SetupIOPins( void )
  2. {
  3.     TRIAK_PORT_D |= _BV(TRIAK1_PIN) | _BV(TRIAK2_PIN);
  4.     TRIAK_PORT_D |= (_BV(TRIAK1_PIN) | _BV(TRIAK2_PIN));
  5.     CROSS0_PORT_D = ~_BV(CROSS0_PIN); //wejscie INT0
  6.     CROSS0_PORT_O |= _BV(CROSS0_PIN); //pullup
  7.     return;
  8. }

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 |
?

  1. inline void SetupInterrupts( void )
  2. {
  3. #ifdef __AVR_ATmega8__
  4. TCCR1B = _BV( WGM12 ) | _BV(CS10);
  5. OCR1A =0xD055;
  6. #else
  7. TCCR1B = _BV( WGM12 ) | _BV(CS11);
  8.   OCR1A = 0x3415;
  9. #endif
  10. //Timer2 - 200KHZ dla 16MHZ 100Khz dla 8Mhz CTC, sterowanie triakami
  11. TCCR2 = _BV( WGM21 ) | _BV(CS20); //preskaler 1 CTC MODE
  12. #ifdef __AVR_ATmega8__
  13. OCR2 = 0x50;
  14. #else
  15. OCR2 = 0xa0;
  16. #endif
  17. TIMSK = _BV(OCIE1A) | _BV(OCIE2); //wlacz przerwanie od Timer0 Timer1
  18. MCUCR = _BV(ISC00) | _BV(ISC01) ; //WznoszÄce zbocze INT0
  19. GIFR |= _BV(INT0);
  20. GICR |= _BV(INT0);
  21. return;
  22. }

W powyższym kodzie inicjujemy przerwania INT0 oraz Timera2 Atmegi do odliczania czasu przesunięcia załączenia triaka.

 C | 
 
 copy code |
?

  1. ISR(INT0_vect)
  2. {
  3. //przerwanie generowane po przejsciu przez 0 wykresu sinusoidy
  4. //wyzwalajace wznoszÄczym zboczem sygnalu
  5. //przepisanie rejestru tymczasowego do rejestru opozniajacego
  6. //czas ktory odczekujemy po przejsciu przez 0 aby wlaczyc triak
  7.   timerT2=timerT2_tmp;
  8.   return;
  9. }
  10. ISR(TIMER2_COMP_vect)
  11. {
  12. //sterownie Triakiem Wentylatora
  13. if( timerT2 )
  14. {
  15. if ( --timerT2==0 )
  16. {
  17.    if( _TR2_OFF() )
  18.     {
  19.        TR2_ON(); //ustaw bit triaka
  20.        timerT2=20;
  21.       }
  22.       else
  23.       {
  24.        TR2_OFF(); //skasowanie bitu triaka
  25.       }
  26.     }
  27. }

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ą.

1 komentarz

  1. Thanks!! This will be a wonderful papercraft for one of those now long & dark evenings.What about changing the form of the petals? Like cutting out five-pointed stars or something else? Sure I will give this a try this evening!Bettina

Dodaj komentarz