Detekcja zera | Willy's Desert Willy's Desert Detekcja zera | Willy's Desert

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
 
6
    CROSS0_PORT_D = ~_BV(CROSS0_PIN); //wejscie INT0
7
    CROSS0_PORT_O |= _BV(CROSS0_PIN); //pullup
8
    return;
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
inline void SetupInterrupts( void )
02
{
03
#ifdef __AVR_ATmega8__
04
TCCR1B = _BV( WGM12 ) | _BV(CS10);
05
OCR1A =0xD055;
06
#else 
07
TCCR1B = _BV( WGM12 ) | _BV(CS11); 
08
  OCR1A = 0x3415;
09
#endif
10
 
11
//Timer2 - 200KHZ dla 16MHZ 100Khz dla 8Mhz CTC, sterowanie triakami
12
TCCR2 = _BV( WGM21 ) | _BV(CS20); //preskaler 1 CTC MODE
13
#ifdef __AVR_ATmega8__ 
14
OCR2 = 0x50;
15
#else
16
OCR2 = 0xa0;
17
#endif
18
 
19
TIMSK = _BV(OCIE1A) | _BV(OCIE2); //wlacz przerwanie od Timer0 Timer1
20
MCUCR = _BV(ISC00) | _BV(ISC01) ; //Wznoszące zbocze INT0
21
GIFR |= _BV(INT0); 
22
GICR |= _BV(INT0);
23
return;
24
}

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

 C | 
 
 copy code |
?

01
ISR(INT0_vect)
02
{
03
//przerwanie generowane po przejsciu przez 0 wykresu sinusoidy
04
//wyzwalajace wznoszączym zboczem sygnalu
05
//przepisanie rejestru tymczasowego do rejestru opozniajacego
06
//czas ktory odczekujemy po przejsciu przez 0 aby wlaczyc triak
07
  timerT2=timerT2_tmp;
08
  return;
09
}
10
 
11
ISR(TIMER2_COMP_vect)
12
{
13
//sterownie Triakiem Wentylatora
14
if( timerT2 )
15
{
16
if ( --timerT2==0 )
17
 {
18
   if( _TR2_OFF() )
19
    {
20
       TR2_ON(); //ustaw bit triaka
21
       timerT2=20;
22
      }
23
      else
24
      {
25
       TR2_OFF(); //skasowanie bitu triaka
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ą.

Comments are closed.