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

Fazowa regulacja obrotów a stabilność programu Arduino

korystor 02 Lis 2018 16:30 918 11
REKLAMA
  • #1 17533884
    korystor
    Poziom 19  
    Posty: 372
    Pomógł: 35
    Ocena: 102
    Atmega 328 Przerwanie 50hz do sterowania fazowego blokuje odliczanie millis(); , występują opóźnienia w całym programie.
    Czy jest możliwość aby mimo przerwań czas do różnych parametrów był odliczany prawidłowo? chciałbym aby program działał stabilnie w trakcie korzystania z przerwań. Pozdrawiam.
  • REKLAMA
  • Pomocny post
    #2 17533915
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #3 17533948
    jarek_lnx
    Poziom 43  
    Posty: 22768
    Pomógł: 4204
    Ocena: 6144
    korystor napisał:
    Atmega 328 Przerwanie 50hz do sterowania fazowego blokuje odliczanie millis(); , występują opóźnienia w całym programie.
    Trudno cię zrozumieć, ale sprawdzanie millis() wskazuje na to że nie używasz potencjału jaki jest w sprzęcie, powinieneś ustawić przerwanie tak aby timer wywołał je kiedy jest potrzeba zmiany stanu wyjścia, albo w ogóle bez udziału programu nich timer zmienia stan wyjścia sprzętowo.
  • REKLAMA
  • Pomocny post
    #4 17534022
    kacpo1
    Poziom 33  
    Posty: 1698
    Pomógł: 273
    Ocena: 156
    Faktycznie, trochę niezrozumiale...
    Najlepiej zrobić to tak - ustawiasz przerwanie aktywowane zboczem opadającym. Przerwanie wywołuje funkcje która czeka x ilość mikro sekund (delayMicroseconds()) po czym załącza triaka. Do napięcia którym chcesz sterować podłączasz transoptor który na wyjściu daje stan niski za każdym przejściem sinusoidy przez 0. I tak oto program "ucina" kawałek sinusoidy.
  • REKLAMA
  • #5 17534069
    jarek_lnx
    Poziom 43  
    Posty: 22768
    Pomógł: 4204
    Ocena: 6144
    kacpo1 napisał:
    Przerwanie wywołuje funkcje która czeka x ilość mikro sekund (delayMicroseconds()) po czym załącza triaka.
    Dobre praktyki programistyczne zalecają nie wykonywać w przerwaniu długotrwałych operacji i ogóle unikać funkcji delay która zajmuje procesor wykonywaniem pustych instrukcji uniemożliwiając zrobienie czegoś pożytecznego. Ty proponujesz jedno i drugie, dorzuć jeszcze coś zrobimy poradnik jak nie powinno sie programować.
  • #6 17534074
    korystor
    Poziom 19  
    Posty: 372
    Pomógł: 35
    Ocena: 102
    Opiszę dokładniej:
    Atmega 328 kwarc 16Mhz.
    Próbuję złożyć sterownik do pieca na ekogroszek z regulacją fazową dmuchawy. Nigdy wcześniej nie korzystałem z przerwań i nagle mnie to przerosło, brak dostatecznej wiedzy. Przykładem takiego sterowania może być np. Sterownik Tech ST-37 na Atmega16. Obroty dmuchawy działają płynnie, czas podawania węgla itp. jest odliczany prawidłowo a wszelkie operacje na przyciskach nie zakłócają pracy dmuchawy co właśnie mi sprawia problem.
    Czy Atmega16 ma więcej możliwości od Atmega 328 że przerwania nie wpływają na prawidłowłe działanie w pętli loop();? Dodam tylko że próbowałem sterowania grupowego dmuchawą ale płynność miała wiele do życzenia.

    Dodano po 7 [minuty]:

    Nie zrobiłem na delaymicrosecond aby nie opóźniać programu. Oto kawałek kodu:
    attachInterrupt(digitalPinToInterrupt(3), fan, CHANGE);

    void loop() {
    currentTime = millis();
    DELAY = micros();


    if(ONOFFdmuchawa == "TAK"){

    if(DELAY >= (before_DELAY + speed_fan) && DELAY < (before_DELAY + (speed_fan + 50))){
    digitalWrite(Pin_dmuchawa, HIGH);
    delayMicroseconds(10);
    digitalWrite(Pin_dmuchawa, LOW);

    }
    }else{
    digitalWrite(Pin_dmuchawa, 0);

    }


    void fan(){
    before_DELAY = DELAY;

    }//dmuchawa----------------------

    W tej konfiguracji oczywiście dmuchawa działa płynnie i nawet odliczanie czasu (pomijając opóźnienie 10micsec) działa prawidłowo ale w trakcie poruszania się po menu, czyli korzystania z danych przesyłanych do wyświetlacza LCD 2x16 występują opóźnienia i dmuchawa przerywa lub przyspiesza w takt przechodzenia z jednego menu do drugiego.


    Dodano po 2 [godziny] 6 [minuty]:

    jarek_lnx napisał:
    korystor napisał:
    Atmega 328 Przerwanie 50hz do sterowania fazowego blokuje odliczanie millis(); , występują opóźnienia w całym programie.
    Trudno cię zrozumieć, ale sprawdzanie millis() wskazuje na to że nie używasz potencjału jaki jest w sprzęcie

    Z pewnością nie wykorzystuję potencjału, wiem. Spróbuję troszkę pozmieniać, sterowanie dmuchawą przeniosę z loop() do funkcji wywołanej przerwaniem a do poprawnego odmierzania czasu użyje przepełnień Timera 8bit.
  • REKLAMA
  • #8 17537753
    korystor
    Poziom 19  
    Posty: 372
    Pomógł: 35
    Ocena: 102
    No oczywiście priorytetem jest przerwanie zewnętrzne do synchronizacji fazy więc rozumiem że nie będę mógł tego pogodzić z przerwaniem timera. Myślę nadal nad rozwiązaniem tego problemu. Ostatecznie mogę zastosować osobny układ ale jestem pewny że jest sposób żeby to zrobić tylko na atmedze. Panowie programiści sterowników pewnie mają ze mnie polewkę ;)
  • Pomocny post
    #9 17537838
    _jta_
    Specjalista elektronik
    Posty: 49161
    Pomógł: 3212
    Ocena: 4262
    A ile czasu może trwać obsługa którego przerwania? Jeśli czas obsługi przerwania do synchronizacji fazy może być porównywalny z okresem timera, to może ono powodować gubienie przerwań timera. A może da się użyć jakiegoś timera 16-bitowego do wykrywania gubienia przerwań timera? Poza tym, mam nadzieję, że timer działa samodzielnie jakimś w trybie cyklicznym, nie jest startowany przy każdym przerwaniu? I że nic innego (np. przesyłanie danych do LCD) nie blokuje obsługi przerwań timera?
  • #10 17537880
    korystor
    Poziom 19  
    Posty: 372
    Pomógł: 35
    Ocena: 102
    Porobię parę doświadczeń na kodzie zanim palnę tutaj coś głupiego. Ogólnie to chciałem użyć timera 8bit i jeszcze przepuścić go przez prescaler żeby za często nie zakłócał przerwania zewnętrznego. Timer oczywiście działa oddzielnie i jest dokładny więc jego taktowania nie da się zakłócić programem. _jta_ dałeś mi dużo do myślenia, zabieram się za lekturę.
  • Pomocny post
    #11 17537967
    _jta_
    Specjalista elektronik
    Posty: 49161
    Pomógł: 3212
    Ocena: 4262
    Rozważyłbym coś takiego: timer 8bit do przerwań, które zliczasz dla odmierzania czasu; timer 16bit do sprawdzania, czy nie zgubiłeś przerwania - chyba nie zgubisz 256 przerwań?
  • #12 17538583
    korystor
    Poziom 19  
    Posty: 372
    Pomógł: 35
    Ocena: 102
    No cóż, na dzień dzisiejszy uruchomiłem odliczanie czasu Timerem 8bit przez prescaler, wyszło 30Hz. Całą procedurę przerwania fazowego i regulacji prędkości dmuchawy wrzuciłem do jednej funkcji i efekt jest jak dal mnie bardzo zadowalający. Dmuchawka pracuje płynnie i nawigacja po menu też. Czas odliczany prawidłowo mimo opóźnienia na każdym przerwaniu "CHANGE" czyli 100 razy na sekunde "delaymicroseconds = 7500". Jutro popracuje nad zmniejszeniem przerwań z "CHANGE" na "RISING" a czas do drugiego impulsu w półokresie sinusoidy wyliczę.

Podsumowanie tematu

LABEL_AI_GENERATED
Użytkownik zmaga się z problemem opóźnień w programie Arduino z wykorzystaniem Atmega 328, spowodowanym przerwaniami 50Hz do sterowania fazowego. W odpowiedziach zasugerowano, aby unikać długotrwałych operacji w przerwaniach oraz rozważyć użycie timerów o różnych bitach do zarządzania przerwaniami. Użytkownik eksperymentował z timerem 8-bitowym i prescalerem, co pozwoliło na płynne działanie dmuchawy oraz prawidłowe odliczanie czasu. Zmiana przerwań z "CHANGE" na "RISING" ma na celu dalsze usprawnienie działania programu.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA