[AVR] Przerwania i 50Hz

Jun 13, 2007 1 Replies

Zrobiłem w przerwaniu od timera0 (overflow co 256us) wykrywanie przejścia przez 0 i chcę synchronizować z tym inne wyjście procka (klasyczny ściemniacz do światła (:). Niestety pojawił się problem - impulsy wyjściowe 'drgają' co powoduje mruganie żarówki. Doszedłem do tego, że zrobienie tego z poolingiem, bez przerwań, eliminuje problem. No ale to bez sensu jest (szczególnie przy bardziej zaawansowanych programach). I tu pojawia się moje pytanie: czy coś sknociłem, czy to jakiś feature? Nie podejmę się opisywać co robiłem w celu naprawienia sytuacji, ale było to już chyba wszystko. Nie mogę niestety zmienić układu i podpiąć sobie to 50Hz do nóżki przerwania zewnętrznego.



W tej chwili (w trakcie walki wyrzuciłem obliczanie drugiej połówki sinusoidy) mam to zrobione tak (darujcie nazwy zmiennych (:):



SIGNAL (SIG_OVERFLOW0) { if (flagWait450Hz) { if (bit_is_set(PIN_50HZ, BIT_50HZ)) lastPinState = 1; else if (lastPinState == 1) { flagWait450Hz = false; flagWait2ON = true; countWait2ON = 0; lastPinState = 0; } } else if (flagWait2ON && ++countWait2ON > 4) { PORT_OBROTY |= _BV(BIT_OBROTY); flagWait2ON = false; flagWait2OFF = true; countWait2OFF = 0; } else if (flagWait2OFF && ++countWait2OFF >= 2) { PORT_OBROTY &= ~_BV(BIT_OBROTY); flagWait2OFF = false; flagWait450Hz = true; } }



No i oscyloskop synchronizuje się na jednym impulsie a kolejne drgają :/



Co można z tym zrobić? Może w ogóle zmienić podejście? Już całkowicie ugrzązłem a gugle nie pomagają :(


MoonWolf snipped-for-privacy@polbox.com pisze:

Zastanówmy siê:

256 us to oko³o 4 kHz

Stosunek 4 kHz (próbkowanie) do 100 Hz (sygna³ wej¶ciowy) daje jedynie 40. Daje to b³±d detekcji przej¶cia przez zero na 180 stopni/40, czyli 4,5 stopnia. Innymi s³owy 2,5 % regulacji mocy ¿arówki.

Mo¿liwo¶ci widzê dwie:

1) zewrzeæ nó¿kê wej¶ciow± z wej¶ciem INT0/INT1 o ile masz je wolne i zrobic to w przerwaniu. Ewentualnie mo¿esz zewrzeæ z ICP. Napisa³e¶, ¿e nie mo¿esz tego zrobiæ, ale nie wiem, czy masz ju¿ zrobione p³ytki, czy nie masz wolnego pinu. Je¶li to kwestia p³ytek, to jeden kawa³ek kynaru to nic z³ego ;-). A zwarcie dwóch nó¿ek wej¶ciowych ze sob± krzywdy nie zrobi. 2) Je¶li chcesz to miec koniecznie w przerwaniu zrób procedurê obs³ugi przerwania:

-czekaj na przej¶cie przez zero.

-ustaw overflow timera na 9.8 ms, czyli na krótk± chwilê przed nastêpnym spodziewanym przej¶ciem przez zero

Te 0.2 ms to IMHO wystarczaj±cy margines bepzoeczeñstwa, oczywi¶cie mo¿esz go zwiêkszyæ.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required