logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[Atmega16][C] Regulacja fazowa (ściemniacz/regulator obrotów)

lampa alladyna 15 Sty 2012 21:07 3442 13
  • #1 10402744
    lampa alladyna
    Poziom 10  
    Witam
    założeniem projektu jest regulowanie prędkości obrotowej silnika jednak testuję go na żarówce. Po złożeniu układu żarówka stale miga, nawet jak napiszę program który czeka t ms, potem jest impuls 1ms i zero przez 9-t ms (t od 0 do 9 regulowane potencjometrem) to również widać migotanie. Męczę się już z tym około tygodnia i nic nie wskórałem. Dodam, że testowałem układ na MOC3021 i MOC3041.
    Program:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    [Atmega16][C] Regulacja fazowa (ściemniacz/regulator obrotów)

    Czy ktoś wie co jest przyczyną mrugnięć żarówki?
  • #3 10403474
    lampa alladyna
    Poziom 10  
    Jak już pisałem testowałem układ zarówno z MOC3041 jak i MOC3021, w obu przypadkach żarówka miga, jednak nieco inaczej. Wmontowałem ponownie MOC3021, sprawdziłem czy nie ma nigdzie czasem zimnych lutów - wszystko ok. Żarówka dalej miga.
  • #4 10403526
    mirekk36
    Poziom 42  
    No przy takim kodzie jaki pokazałeś, przy _delay'u z takimi argumentami i opóźnieniami w przerwaniu, plus detekcji zera sieci po transformatorze a sterowaniu żarówką przed transformatorem to jeszcze długo będzie ci wszystko tylko migać zamiast poprawnie działać niestety :( I na nic się zda wachlowanie i wymiany optotriaków z jednego typu na drugi, tym bardziej, że słusznie kolega wyżej ci podpowiedział.
  • #5 10403674
    lampa alladyna
    Poziom 10  
    ale dlaczego w takim razie bez przerwań itp. jak dam w pętli while:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    to czemu żarówka nadal miga?
    Detekcji zera po transformatorze używają również tutaj i tutaj. Rozumiem, że wg. Ciebie lepszym rozwiązaniem byłoby użycie transoptora?
  • Pomocny post
    #6 10410750
    excray
    Poziom 41  
    A spróbuj tak:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Pamiętaj że łączny czas funkcji od momentu pzerwania do momentu powrotu z przerwania pod żadnym pozorem nie może przekroczyć 10ms. Inaczej każde następne przerwanie jest "spóźnione" o wartość nadmiarową nad te 10ms.
    Poza tym:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    - to jest przerwanie od zbocza narastającego.
  • #7 10412196
    lampa alladyna
    Poziom 10  
    miga, jednak w tym wypadku jest to oczywiste, tyle, że powinna migać jaśniej/ciemniej (pulsować) a ona miga tak jakbym szybko włączał i wyłączał włącznik.widać, że momentami w ogóle się nie żarzy. Pulsuje dokładnie w ten sam sposób co podłączona do PC0 dioda.
    EDIT:
    Po wrzuceniu w pętle poniższego kodu czas od jednego mignięcia do drugiego wynosi około 8 sekund. Myślałem, że będzie migać co pół sekundy, a tu taki zonk.
    Czy ktoś może mi wyjaśnić dlaczego tak się dzieje?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    a i nawet jak utworzę funkcję:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    to nadal źle mierzy czas (wywołuję delay_ms(500) i delay_ms(1))

    Edit:
    Zauważyłem, że _delay_ms jest zależne od ustawionego F_CPU.
  • Pomocny post
    #8 10412425
    excray
    Poziom 41  
    Albo fusebity źle ustawione albo w kompilatorze źle masz ustawioną częstotliwość. W zasadzie to tłumaczy cały Twój problem.
  • Pomocny post
    #9 10412481
    mirekk36
    Poziom 42  
    panie, lampa alladyna ----> jak już tworzysz własną funkcję delay_ms to nie rzucaj sobie kłód pod nogi, poczytaj o typach danych, stosuj je z głową w mikrokontrolerach, bo widać że chyba jeśli chodzi o C to na razie wiedzę opierasz tylko na książkach z języka C dla PC'tów, gdzie takie problemy się nie liczą....

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    czy nie krócej, lepiej i przyjemniej ? ;)

    (dzięki excray za uwagę o brakującym nawiasie)
  • #10 10412718
    lampa alladyna
    Poziom 10  
    mam jeszcze jedno pytanie jak mam potencjometr 10k który podaję na ADC0 to jaką wartość maksymalną a jaką minimalną uzyska ADC?
  • #11 10412731
    excray
    Poziom 41  
    Vref masz VCC a ADLAR=0 więc maksymalna to 1023 (ADC0=VCC) a minimalna to 0 (ADC0=GND).
    BTW> Na schemacie masz parę rzeczy do poprawy. Nie wiem czy po prostu z pośpiechu tego nie narysowałeś czy rzeczywiście tam masz wszystko podłączone. Zalecam poprawić:
    - dodać kondensator między Vref a masą - 100nF
    - dodać kondensator między ADC0 a masą - ok 100nF
    - co robi dioda D2 szeregowo z kondensatorem C2?
    - jeśli nie ma to dodać kondensator tuż przy pinach mikrokontrolera między VCC-GND
    - RESET podciągnąć opornikiem 10k do +VCC

    EDIT> Poprawiłem wynik maksymalny na 1023.
  • #12 10412750
    lampa alladyna
    Poziom 10  
    pytałem, bo nie wiem, czy 1024 czy 1023?? bo niby 10bitowy, więc chyba 1023 jest max.
  • #13 10412756
    excray
    Poziom 41  
    lampa alladyna napisał:
    pytałem, bo nie wiem, czy 1024 czy 1023?? bo niby 10bitowy, więc chyba 1023 jest max.

    Racja, rozpędziłem się. 1023 to max.
  • #14 10412787
    lampa alladyna
    Poziom 10  
    Zdaje się, że u mnie częstotliość sieci jest nieco większa niż 50Hz ;]
    więc żeby mieć pewność sprawnego działania ustawiłem czas opóźnienia załączenia triaka od 0 do 8 ms. Układ działa, żarówka świeci od małego żarzenia do prawie pełnej mocy - w zasadzie ja to nie widzę różnicy, jestem oślepiony :P.
REKLAMA