Witam
To mój pierwszy wątek na tym forum, mam więc nadzieję, że znajduje się w odpowiednim dziale. Potrzebuję pomocy, ponieważ nie mogę znaleźć błędu w swoim kodzie oraz nie mam pomysłu jak mogłabym go jeszcze zmodyfikować. Byłabym wdzięczna za każdą podpowiedź czy sugestię.
Realizowany przeze mnie program ma za zadanie sterowanie otwarciem kontaktronu w wyznaczonej chwili przebiegu napięcia sieciowego. Projekt realizuję nietypowo, ponieważ program testuję na układzie zmontowanym na płytce stykowej z wykorzystaniem Arduino Leonardo, a układem wyjściowym jest płytka drukowana z ATmegą328 z zewnętrznym kwarcem 16Mhz. Jest to spowodowane tym, że niestety nie potrafię (jeszcze) pisać kodu na czysty AVR. Napisany program w Arduino IDE kompiluję do pliku .hex i wgrywam za pomocą narzędzia MkAvrCalculator i programatora USBasp na płytkę drukowaną. Na płytce tej wykorzystuję również detektor przejścia przez zero zgodny ze schematem z BB. Co do strony związanej z hardwarem jestem pewna, problem więc stanowi kod.
Zamysł programu w skrócie jest taki: po wykryciu impulsu z detektora przejścia przez zero, program "czeka" przez pewien ustawiony przez użytkownika za pomocą przycisków czas (który odpowiada chwili na przebiegu, określonej jako przesunięcie względem zera w stopniach) następnie otwiera kontaktron, znowu "czeka" przez pewien czas otwarcia i ponownie go zamyka. Akcja ta ma się powtarzać co ileś okresów przebiegu, nie ma być jednorazowa.
Poniżej zamieszczam listing kodu z wykorzystaniem delayów (jedynie do zobrazowania kodu, wiem że nie mogę ich używać w programie tak czasowo zależnym ze względu na wprowadzanie opóźnienia)
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Chcąc się pozbyć delayów postanowiłam wykorzystaj funkcję millis(), która odpowiadać będzie za czas otwarcia kontaktronu oraz przesunięcie względem zera oraz zmienną licznik do powtarzania akcji co ileś okresów.
Usunęłam z programu napisaną funkcję start(), zadeklarowałam na początku kodu nowe zmienne i zmieniłam kod w głównej pętli loop. Pozostałą część kodu pozostawiłam niezmienioną. Poniżej przedstawiam zedytowany kod programu.
język cpp
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
Niestety obserwując przebieg na oscyloskopie okazuje się, że kontaktron załączany jest każdorazowo w innym punkcie przebiegu, niezależnie od nastawionego przesunięcia, a nawet przy ustawieniu sztywnej wartości dla przesunięcia cz=0. Nie rozumiem więc gdzie i na jakim etapie wprowadzane jest opóźnienie. Popełniam błąd, z którego istnienia nie zdaję sobie prawdopodobnie sprawy.
Pomyślałam, że może otwarcie kontaktronu powinno być wyzwalane zboczem impulsu przejścia przez zero i z użyciem przerwania, podobnie jak to było opisane w BB przy projekcie ze ściemniaczem. Albo być może mam problem z synchronizacją. Być może to biblioteki Arduino wprowadzają opóźnienie. I w tym wypadku może lepszym rozwiązaniem byłoby napisanie programu dla "czystej" ATmegi. Niestety nie potrafię pisać kodu operując na rejestrach.
Kończą mi się pomysły, więc proszę o jakąkolwiek pomoc.
Pozdrawiam