Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 28 sie 2026, o 03:45


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 38 ]  Przejdź na stronę Poprzednia strona  1, 2
Autor Wiadomość
PostNapisane: 5 lip 2016, o 17:51 
Offline
Nowy

Dołączył(a): 10 lip 2015
Posty: 11
Pomógł: 0

andrews napisał(a):
Czy zrobiłeś zmianę w kodzie, o której pisałem?


Zrobiłem. Działa! Żarówka nie tętni :)

Zeruje TCNT1 i jest git.

Popracuje jeszcze nad szerokością szpilki i zobaczę jak to się przełoży np. na czas pomiędzy wykrywanymi zerami.

------------------------ [ Dodano po: kilkunastu sekundach ]

andrews napisał(a):
Czy zrobiłeś zmianę w kodzie, o której pisałem?


Zrobiłem. Działa! Żarówka nie tętni :)

Zeruje TCNT1 i jest git.

Popracuje jeszcze nad szerokością szpilki i zobaczę jak to się przełoży np. na czas pomiędzy wykrywanymi zerami.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lip 2016, o 18:19 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Stachulec napisał(a):
Popracuje jeszcze nad szerokością szpilki i zobaczę jak to się przełoży np. na czas pomiędzy wykrywanymi zerami.

Czas "pomiędzy zerami" się raczej nie zmieni, powtarzalność też raczej nie. Na pewno zmieni się odstęp czasowy pomiędzy zboczem narastającym i opadającym impulsu detekcji zera.

Niemniej nie rób impulsu zbyt wąskiego, bo przy zastosowanym przez Ciebie sposobie wyłączania triaka może nie zdążać się wyłączyć. Jak się domyślam masz taktowanie 1MHz, więc pomiędzy zboczem narastającym impulsu detekcji (wywołującym przerwanie) a faktycznym przełączeniem pinu sterującego triakiem jest pewne opóźnienie (być może nawet rzędu kilkudziesięciu mikrosekund).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 lip 2016, o 12:00 
Offline
Nowy

Dołączył(a): 10 lip 2015
Posty: 11
Pomógł: 0

Więc może zewnętrzny kwarc?

Podłączyłem do Arduino DS18b20. Podczas obsługi termometru żarówka przygasa :)
Chyba obok sterowania triakiem już nic więcej nie dołożę :/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 lip 2016, o 12:57 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Stachulec napisał(a):
Więc może zewnętrzny kwarc?

Jeśli chcesz zwiększyć częstotliwość taktowania mikrokontrolera, to wystarczy ustawić fusebit CKDIV8 aby ustawić taktowanie na 8MHz.

Ogólnie moim zdaniem wymyśliłeś niezbyt dobry algorytm sterowania. Przerwanie zajmujące zapewne kilkadziesiąt taktów zegara co 200 taktów zegara to nie najlepszy pomysł. Nie znam Twojego kodu obsługi DS18B20 (ani ogólnie Arduino), ale jeśli ten kod także korzysta z przerwań, to prawdopodobnie gubisz niektóre przerwania i stąd ten efekt przygasania. Być może zwiększenie taktowania pomoże.

Ja bym to zrobił inaczej, ale to nieco bardziej zaawansowane rozwiązanie, więc kodu za Ciebie nie napiszę, tym bardziej, że nie znam Arduino.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 lip 2016, o 14:24 
Offline
Nowy

Dołączył(a): 10 lip 2015
Posty: 11
Pomógł: 0

andrews napisał(a):
Ja bym to zrobił inaczej


Więc może tylko napiszesz w dwóch zdaniach jak byś to zrobił. Może się zasugeruję i coś lepszego wymyślę :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 7 lip 2016, o 16:33 
Offline
Użytkownik

Dołączył(a): 07 cze 2016
Posty: 563
Pomógł: 143

Właśnie w dwóch zdaniach to się nie da ;)

No ale spróbuję nakreślić rys:

Na początek pin mikrokontrolera oznaczony jako OC1A należy ustawić na wyjście w stanie wysokim. Stan niski oznacza przewodzenie optotriaka, więc żarówka mogłaby niepotrzebnie mignąć po włączeniu zasilania.

Zakładajmy na razie dla uproszczenia taktowanie 1MHz.

Timer 1 należy skonfigurować do pracy np. w trybie 14: Fast PWM z wartością TOP w ICR1.

Wartość ICR1 powinna trzeba dobrać tak, aby opóźnienie było równe tyle, ile czas od zbocza narastającego impulsu detekcji zera do momentu wyłączenia triaka. Wyłączenie powinno się odbyć nieco przed ponownym zboczem narastającym impulsu detekcji. Myślę, że 200us wyprzedzenia powinno wystarczyć, zbocza są między sobą mniej więcej 10000 taktów, więc 9800 powinno być odpowiednią wartością rejestru ICR1.

Pin OC1A konfigurujemy w tryb non-inverting, czyli tak, aby zerował się po wystąpieniu porównania i ustawiał po "przekręceniu" licznika. Czyli w rejestrze TCCR1A bit COM1A1=1 a bit COM1A0=0.

Wartością rejestru OCR1A regulujemy jasność żarówki. Im mniejsza wartość, tym żarówka będzie świecić jaśniej. Nie należy jednak zaczynać od wartości zero, ponieważ zbocze narastające impulsu detekcji jest nieco przed faktycznym przejściem przez zero, a triaka powinniśmy włączać krótko po przejściu przez zero. Ponieważ nie wiesz jakie jest faktyczne opóźnienie pomiędzy zboczem narastającym impulsu a punktem zerowym sinusoidy, należy dobrać tę wartość doświadczalnie, przy czym lepiej nie schodzić poniżej powiedzmy (dla bezpieczeństwa) 200.

Wartość OCR1A nie powinna też zbytnio zbliżyć się do wartości ICR1, bo wtedy impuls wyzwalający triaka może być zbyt krótki.

Myślę, że wstępnie można ustalić minimalną wartość OCR1A na 1000, a maksymalną na 9500. Później można ewentualnie manipulować tymi wartościami, aby uzyskać pełną regulację. Zawsze lepiej to się robi przy użyciu oscyloskopu.

Do szczęścia potrzebne są jeszcze przerwania.

Pierwsze przerwanie tak jak do tej pory, od zbocza narastającego impulsu detekcji, jednak w nim wykonujemy tylko jedną operację: ustawiamy bit CS10 w rejestrze TCCR1B. To spowoduje wystartowanie timera 1 bez preskalera.
Po doliczeniu do wartości OCR1A pin OC1A załączy triaka.

Drugie przerwanie od przepełnienia timera 1. Tutaj tylko wyłączamy taktowanie timera (zerujemy bit CS10 w rejestrze TCCR1B). Dobrze byłoby też wyzerować rejestr TCNT1. Nie jest to bardo konieczne, ale może trochę poprawi dokładność i powtarzalność czasu załączenia triaka.
Po doliczeniu do wartości ICR1 timer 1 się wyzeruje i pin OC1A wyłączy triaka.

W ten sposób masz rozdzielczość (9500-1000)=8500 stopni regulacji i tylko dwa przerwania wykonujące się krócej niż Twoje (łącznie nie powinny przekroczyć 100 taktów) i to po jednym razie na każde 10000 impulsów (z czego przez ok. 9900 taktów mikrokontroler będzie się nudził :)).

Zanim zaczniesz sprawdź jednak, czy Twoja biblioteka od DS18B20 nie korzysta czasami z timera 1, bo cały plan na nic. Trzeba będzie wtedy użyć innego timera (pozostają tylko 8-bitowe). Oczywiście byłoby trzeba wtedy zastosować preskaler i odpowiednio przeliczyć wartości opóźnień. Konfiguracja timera też może się nieco różnić.

Z kodem Ci zbytnio nie pomogę, bo z Arduino jakoś nie było mi nigdy po drodze ;)

...no i nie udało się w dwóch zdaniach jak widzisz :D

Pozdrawiam
Andrzej

PS.
Jako ciekawostkę dodam, że w ten sposób można, korzystając z jednego impulsu detekcji, sterować dwoma niezależnymi obciążeniami wykorzystując tylko jeden timer (mowa o pinie OC1B i rejestrze OCR1B).

No i życzę powodzenia w realizacji algorytmu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 lip 2016, o 16:54 
Offline
Nowy

Dołączył(a): 10 lip 2015
Posty: 11
Pomógł: 0

Okej! Dzięki za wyczerpującą odpowiedź. W wolnej chwili usiądę do tego :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 14 lip 2016, o 14:31 
Offline
Nowy
Avatar użytkownika

Dołączył(a): 15 lis 2015
Posty: 23
Lokalizacja: Lesznowola (południowe okolice Wa-wy)
Pomógł: 1

Jeżeli interesujemy się sterowaniem fazowym żarówek, to warto zapoznać się z artykułem:
http://www.esp8266-projects.com/2016/04/mpdmv4-mains-dimmerswitch.html

Są tam ciekawie opisane problemy jakie sterowanie fazowe sprawia mikrokontrolerom oraz jest podane dość uniwersalne rozwiązanie takiego sterowania fazowego.

Oczywiście rozwiązania zaprezentowanego w powyższym linku nie należy postrzegać jako zamiennik do układu opisywanego w tym wątku (to by była trochę armata na wróble...), ale warto rozważyć ten układ, jeśli ktoś planuje wykorzystać mały mikrokontroler do sterowania większą liczbą żarówek i/lub taśm LED.

Od niedawna (ok. 1 rok) interesuję się elektroniką i mikrokontrolerami, na razie jestem na etapie testowania/próbowania różnych rozwiązań na samodzielnie projektowanych i wykonywanych płytkach prototypowych, metodą chemiotransferu. Zmagam się z nauką C i poznawaniem chimerycznego ESP8266 (choć ATmegę 8 również nieco poznałem). Innymi słowy bardzo początkujący jestem. Lubię czytać ATNELowskie forum i obejrzałem dość sporo poradników.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 38 ]  Przejdź na stronę Poprzednia strona  1, 2

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 0 gości


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO