Witam Szanownych Kolegów.
Chciałbym zaprezentować moją konstrukcję stroboskopu opartego o mikroprocesor ATmega16 i układ detekcji zera sinusoidy sieciowej.
Mikroprocesor steruje impulsem wyzwalającym powstającym od trafo wysokonapięciowego.
Docelowo powinien realizować obsługę przycisków sterujących częstotliwością i jasnością świecenia ksenonowej lampy wyładowczej o mocy 1500W.
Lampa ta jest zasilana poprzez diody prostownicze napięciem sieciowym, a sterowanie jasnością odbywa się za pomocą przesunięcia fazowego napięcia wyzwalającego względem dodatniej połówki napięcia sieci (w maksimum sinusoidy wybija bezpieczniki).
Mam jeszcze problemy ze zrobieniem optymalnego programu na mikroprocesor.
Programuję w Codevision AVR poprzez programator firmy telwis.com.
Nie mam wyprowadzonej końcówki złącza ISP na płytce, po prostu wyciągam procesor z podstawki i umieszczam go w programatorze.
Oczywiście bardziej wygodne jest mieć to złącze.
Jestem początkującym elektronikiem i radzę każdemu początkującemu,
nie popełniajcie tych błędów, co ja.
Na razie opiszę to, co udało mi się zrobić, jeśli chodzi o software:
1. Nie udało mi się wymyślić na początku, żeby użyć ATtiny.
2. Zaimplementowałem obsługę przerwania od timera pracującego w trybie CTC.
3. Zainicjowałem timer wpisując konkretne wartości w jego rejestry sterujące.
4. Odblokowałem przerwania.
5. Udało mi się dokładnie synchronizować impuls wyzwalający poprzez odmierzanie określonego czasu, jeśli detektor wykrył "zero".
Robi to instrukcja w programie głównym "if".
Przy tym punkcie taka rada dla tych, którzy będą starać się zrobić coś podobnego:
Najlepiej użyć do takich rzeczy przerwań zewnętrznych od zmiany stanu portu,
aby nie zajmować czasu procesora ciągłym sprawdzaniem warunku if.
Ja natomiast przy projektowaniu nie wziąłem tego pod uwagę i wykonałem płytkę tak, że nie mam możliwości skorzystania z zewnętrznego przerwania.
6. Starałem się zaimplementować prostą obsługę przycisków sterujących jasnością i częstotliwością błysków, jednak są problemy.
Na razie regulacje nie działają dobrze, bo jedno naciśnięcie przycisku jest interpretowane jako wiele naciśnięć, może nawet kilkadziesiąt, zależy to od czasu w którym jest naciśnięty i pewnie również od tzw. zjawiska drgania styków.
I tu pytanie: jak napisać optymalny program, aby procesor ciągle realizował swoje zadania (niedopuszczalne jest, aby spóźniał się przy podawaniu impulsu wyzwalającego) i dodatkowo, aby zapewniał zmiany zmiennych i,j w rytm naciśnięć przełączników zwierających konkretne linie portu A (0-3) do masy?
Powiedzmy, że oczekujemy tego, aby działało to jak taka klawiatura komputerowa, czyli że dłuższe naciśnięcie przycisku powoduje cykliczne zmiany o 1 wartości zmiennych w zakresie: zmienna i od 0 do 20, zmienna j od 0 do 10.
Powiedzmy również, że oczekujemy tego, aby po dłuższym przytrzymaniu przycisku zmieniał wartość określonej zmiennej w tempie 4/sekundę.
Powiedzmy również, że każde przyciśnięcie przycisku ma być traktowane jako jednokrotne, jeśli przycisk nie jest naciśnięty dłużej niż 1 sekundę.
Panowie, jak proponowalibyście zmienić program tak, aby realizował powyższe wymogi, ale również tak, aby nie zakłócać synchronizacji impulsu wyzwalającego względem dodatniej połówki sin.?
Oczywiście liczę się już z tym, że bez użycia dodatkowych przerwań pochodzących od zmiany stanu linii portu (w ATmedze16 port A0-3 nie posiadają takiej funkcji) oraz bez możliwości dołączenia peryferyjnych układów znoszących efekt tzw.drgania styków może być to trudne do osiągnięcia.
Liczę się również z tym, że może to wpłynąć na chwilową zmianę częstotliwości błysków, jeśli będzie wpływać, to załóżmy, że chcemy ten wpływ również minimalizować.
Będę wdzięczny za sugestie, może nawet za jakieś kody źródłowe. ;P
Jestem początkowy w AVR.
Uwaga na koniec: nie używam operatorów przesunięć bitowych, ponieważ w Codevision musiałbym dodatkowo definiować bazę poszczególnych nazw bitów w rejestrach.
Ten kompilator nie rozpoznaje, np. instrukcji typu:
ale już na przykład taką jak najbardziej:
Wiadomo jednak, że to nam nic nie daje, bo nie uzyskamy samodokumentującego się kodu. Dlatego wpisałem w rejestr wartości w kodzie hex, np. TIMSK=0x02.
Program na procesor poniżej:
Na koniec jeszcze jedno pytanie, które pojawiło mi się w trakcie już budowania samego układu (świeżak jestem):
- aby wysterować tyrystor z mikroprocesora zwierający obwód LC w pętlę, który powoduje szybkozmienne rozładowanie go przez uzwojenie pierwotne trafo, potrzebowałem zewrzeć masy układu sieciowego (N) i masę układu cyfrowego.
Czy taka praktyka jest w ogóle dopuszczalna?
Jeśli nie tak to jak inaczej ?

Chciałbym zaprezentować moją konstrukcję stroboskopu opartego o mikroprocesor ATmega16 i układ detekcji zera sinusoidy sieciowej.
Mikroprocesor steruje impulsem wyzwalającym powstającym od trafo wysokonapięciowego.
Docelowo powinien realizować obsługę przycisków sterujących częstotliwością i jasnością świecenia ksenonowej lampy wyładowczej o mocy 1500W.
Lampa ta jest zasilana poprzez diody prostownicze napięciem sieciowym, a sterowanie jasnością odbywa się za pomocą przesunięcia fazowego napięcia wyzwalającego względem dodatniej połówki napięcia sieci (w maksimum sinusoidy wybija bezpieczniki).
Mam jeszcze problemy ze zrobieniem optymalnego programu na mikroprocesor.
Programuję w Codevision AVR poprzez programator firmy telwis.com.
Nie mam wyprowadzonej końcówki złącza ISP na płytce, po prostu wyciągam procesor z podstawki i umieszczam go w programatorze.
Oczywiście bardziej wygodne jest mieć to złącze.
Jestem początkującym elektronikiem i radzę każdemu początkującemu,
nie popełniajcie tych błędów, co ja.

Na razie opiszę to, co udało mi się zrobić, jeśli chodzi o software:
1. Nie udało mi się wymyślić na początku, żeby użyć ATtiny.
2. Zaimplementowałem obsługę przerwania od timera pracującego w trybie CTC.
3. Zainicjowałem timer wpisując konkretne wartości w jego rejestry sterujące.
4. Odblokowałem przerwania.
5. Udało mi się dokładnie synchronizować impuls wyzwalający poprzez odmierzanie określonego czasu, jeśli detektor wykrył "zero".
Robi to instrukcja w programie głównym "if".
Przy tym punkcie taka rada dla tych, którzy będą starać się zrobić coś podobnego:
Najlepiej użyć do takich rzeczy przerwań zewnętrznych od zmiany stanu portu,
aby nie zajmować czasu procesora ciągłym sprawdzaniem warunku if.
Ja natomiast przy projektowaniu nie wziąłem tego pod uwagę i wykonałem płytkę tak, że nie mam możliwości skorzystania z zewnętrznego przerwania.
6. Starałem się zaimplementować prostą obsługę przycisków sterujących jasnością i częstotliwością błysków, jednak są problemy.
Na razie regulacje nie działają dobrze, bo jedno naciśnięcie przycisku jest interpretowane jako wiele naciśnięć, może nawet kilkadziesiąt, zależy to od czasu w którym jest naciśnięty i pewnie również od tzw. zjawiska drgania styków.
I tu pytanie: jak napisać optymalny program, aby procesor ciągle realizował swoje zadania (niedopuszczalne jest, aby spóźniał się przy podawaniu impulsu wyzwalającego) i dodatkowo, aby zapewniał zmiany zmiennych i,j w rytm naciśnięć przełączników zwierających konkretne linie portu A (0-3) do masy?
Powiedzmy, że oczekujemy tego, aby działało to jak taka klawiatura komputerowa, czyli że dłuższe naciśnięcie przycisku powoduje cykliczne zmiany o 1 wartości zmiennych w zakresie: zmienna i od 0 do 20, zmienna j od 0 do 10.
Powiedzmy również, że oczekujemy tego, aby po dłuższym przytrzymaniu przycisku zmieniał wartość określonej zmiennej w tempie 4/sekundę.
Powiedzmy również, że każde przyciśnięcie przycisku ma być traktowane jako jednokrotne, jeśli przycisk nie jest naciśnięty dłużej niż 1 sekundę.
Panowie, jak proponowalibyście zmienić program tak, aby realizował powyższe wymogi, ale również tak, aby nie zakłócać synchronizacji impulsu wyzwalającego względem dodatniej połówki sin.?
Oczywiście liczę się już z tym, że bez użycia dodatkowych przerwań pochodzących od zmiany stanu linii portu (w ATmedze16 port A0-3 nie posiadają takiej funkcji) oraz bez możliwości dołączenia peryferyjnych układów znoszących efekt tzw.drgania styków może być to trudne do osiągnięcia.
Liczę się również z tym, że może to wpłynąć na chwilową zmianę częstotliwości błysków, jeśli będzie wpływać, to załóżmy, że chcemy ten wpływ również minimalizować.
Będę wdzięczny za sugestie, może nawet za jakieś kody źródłowe. ;P
Jestem początkowy w AVR.
Uwaga na koniec: nie używam operatorów przesunięć bitowych, ponieważ w Codevision musiałbym dodatkowo definiować bazę poszczególnych nazw bitów w rejestrach.
Ten kompilator nie rozpoznaje, np. instrukcji typu:
Code: c
ale już na przykład taką jak najbardziej:
Code: c
Wiadomo jednak, że to nam nic nie daje, bo nie uzyskamy samodokumentującego się kodu. Dlatego wpisałem w rejestr wartości w kodzie hex, np. TIMSK=0x02.
Program na procesor poniżej:
Code: c
Na koniec jeszcze jedno pytanie, które pojawiło mi się w trakcie już budowania samego układu (świeżak jestem):
- aby wysterować tyrystor z mikroprocesora zwierający obwód LC w pętlę, który powoduje szybkozmienne rozładowanie go przez uzwojenie pierwotne trafo, potrzebowałem zewrzeć masy układu sieciowego (N) i masę układu cyfrowego.
Czy taka praktyka jest w ogóle dopuszczalna?
Jeśli nie tak to jak inaczej ?









