Aktyw Forum

Zarejestruj się na forum.ep.com.pl i zgłoś swój akces do Aktywu Forum. Jeśli jesteś już zarejestrowany wystarczy, że się zalogujesz.

Sprawdź punkty Zarejestruj się

Sterowanie fazowe Atmega16, 8MHz, Timer1 - prośba o konsult.

Awatar użytkownika
m.ciszewski
-
-
Posty: 4
Rejestracja: 21 cze 2011, o 15:05

Sterowanie fazowe Atmega16, 8MHz, Timer1 - prośba o konsult.

Postautor: m.ciszewski » 29 maja 2012, o 20:21

Mikrokontroler ATMEGA16, oscylator wewnętrzny 8 MHz, wykorzystany timer1 (16 bit).
Dzielę połówkę sinusoidy na 100 części. 10ms / 100 = 0,1 ms = 0,0001s.
Odcinki czasu 0,1 ms generuje mi timer1

Takt zegarowy t = 1 / 8000000 Hz = 0,125 ms

Dla uzyskania 0,0001s muszę zliczyć 800 taktów ( 800 x 0,125 us = 100 us = 0,1 ms = 0,0001 s ). Aby licznik się przepełnił po wykonaniu 800 cykli maszynowych i wywołał przerwanie ustawiam wartość początkową licznika na 65536 - 800 = 64736.

Od tej pory co 0,0001 s inkrementuje się zmienna Czas_zwloki$ (sto kroków na połówce sinusa). Jeśli w pewnej chwili okaże się, że Czas_zwloki$ przekroczy Wartosc_t1$ zostanie załączony triak.

Gdy na int1 zostanie wykryte przejście przez zero zrobione na układzie zerocrosser triak zostanie wyłączony. Wyzerowana zostanie również zmienna Czas_zwloki$. I wszystko zacznie się od początku (triak zostanie włączony ponownie po przekroczeniu przez zmienną Czas_zwloki$ wartości odpowiedniej dla włączenia triaka.

Poniżej gotowy kod.

Kod: Zaznacz cały

$regfile = "m16def.DAT" $crystal = 8000000 $baud = 4800 Echo Off Nadawanie Alias Portc.7 Config Nadawanie = Output Dim Wartosc_t1$ As Byte Dim Wartosc_t2$ As Byte Dim Wartosc_t3$ As Byte Wartosc_t1$ = 0 Wartosc_t2$ = 0 Wartosc_t3$ = 0 Dim Czas_zwloki$ As Byte Czas_zwloki$ = 0 D10 Alias Porta.6 Config D10 = Output S10 Alias Pind.4 Config S10 = Input Set S10 Declare Sub Odczytaj_klawisze ' KONFIGURACJA PRZERWANIA DETEKTORA PRZEJSC PRZEZ ZERO Config Int1 = Rising Enable Interrupts Enable Int1 On Int1 Przejscie_przez_0 Dim W_pocz_timera As Word ' KONFIGURACJA TIMERA1 do odliczania 0,0001s odcinków czasu Config Timer1 = Timer , Prescale = 1 On Timer1 00001s Enable Interrupts Enable Timer1 W_pocz_timera = 64736 Timer1 = W_pocz_timera Do Call Odczytaj_klawisze Waitms 10 Loop Sub Odczytaj_klawisze If S10 = 0 Then Incr Wartosc_t1$ If Wartosc_t1$ > 100 Then Wartosc_t1$ = 1 Set Nadawanie Print Wartosc_t1$ Print Reset Nadawanie End If Waitms 100 End Sub End 00001s: Timer1 = W_pocz_timera Incr Czas_zwloki$ If Czas_zwloki$ > Wartosc_t1$ Then Set D10 Return Przejscie_przez_0: Disable Int1 Enable Interrupts Reset D10 Czas_zwloki$ = 0 Enable Int1 Return
W teorii wszystko miodzio w praktyce już nie.

http://filmy.elektroda.net/42_1338305880.flv

Na filmie widać trzecią diodę od prawej (to jest właśnie D10), jej zachowanie (cały czas trzymany przycisk S10) i zachowanie podłączonej żarówki 230V.

Awatar użytkownika
Tomasz Gumny
-
-
Posty: 685
Rejestracja: 4 lut 2004, o 23:31
Lokalizacja: Trzcianka/Poznań

Re: Sterowanie fazowe Atmega16, 8MHz, Timer1 - prośba o kons

Postautor: Tomasz Gumny » 29 maja 2012, o 20:51

Nie mogę odtworzyć filmu, ale:
1. upewnij się, że nie dzielisz zegara przez 8 (fusebit CKDIV8);
2. nie czekaj z wyłączeniem triaka na zero sieci, bo może być za późno. Najlepiej podawaj na bramkę krótki impuls zapalający o stałym czasie a maksymalne opóźnienie załączenia skróć o ten czas.
3. 1N4148 w prostowniku sieciowym to chyba zbyt optymistyczne podejście;
4. AVR z można ustawić tak, aby reagowały na oba zbocza, więc do detekcji zera wystarczyłby transoptor bez tego całego otoczenia.

Awatar użytkownika
ACeK
-
-
Posty: 1520
Rejestracja: 30 mar 2003, o 19:35
Lokalizacja: Kielce

Re: Sterowanie fazowe Atmega16, 8MHz, Timer1 - prośba o kons

Postautor: ACeK » 29 maja 2012, o 21:49

Nie mogę odtworzyć filmu ...
Obrazek film otwiera sie bez problemu z :arrow: VLC Obrazek

Wróć do „AVR/AVR32”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 24 gości