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

Atmega 32 [C] - Wywołanie pomiaru w przerwaniu timera1

GrzesiekF1 03 Lis 2015 20:24 1503 16
REKLAMA
  • #1 15120205
    GrzesiekF1
    Poziom 10  
    Witam.
    Chciałbym wykorzystać przerwania timera1 w Atmega32 do realizacji pojedynczego pomiaru wartości na ADC.
    Timer ustawiam w tryb "PWM with phase correct", a ADC na pojedynczy pomiar:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Aby wykonać pojedynczy pomiar, muszę jednak wykonać w przerwaniu funkcję while, a uczono mnie bym w przerwaniach tego nie robił.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod

    Czy taki kod zadziała? Jeśli nie, to czy możecie mi podpowiedzieć jak taki pomiar zrealizować?
    Dodam, że zależy mi aby pomiar wykonywany był dokładnie w momencie przerwania.
  • REKLAMA
  • #3 15120376
    BlueDraco
    Specjalista - Mikrokontrolery
    Pod koniec obsługi przerwania timera startuj ADC, a wynik odbieraj na początku procedury obsługi przerwania timera, czyli w następnym przerwaniu. No i przypadkiem nie używaj równocześnie przerwania timera i ADC - pożytku żadnego, a kłopoty mogą być.
  • #4 15120524
    GrzesiekF1
    Poziom 10  
    Zaraz zaraz, bo nie rozumiem. BlueDraco - jeśli pod koniec przerwania timera mam dać pozwolenie na pomiar, a na początku pobrać zmierzoną wartość do zmiennej (czyli wartość odczytaną z poprzedniego pomiaru), to nadal nie wiem gdzie umieścić "while(ADCSRA & (1<<ADSC));" czyli instrukcję każącą czekać programowi, aż pomiar nie zostanie wykonany...
  • REKLAMA
  • #5 15120569
    tmf
    VIP Zasłużony dla elektroda
    Nigdzie masz jej nie umieszczać - o ile pomiędzy kolejnymi przerwaniami timera upływa dłuższy czas niż czas potrzebny na konwersję ADC.
  • REKLAMA
  • #6 15120585
    robiw
    Poziom 26  
    Możesz zrobić jeszcze inaczej. Wyzwalaj przerwanie timera dwa razy częściej i licz je. W przerwaniach parzystych startuj konwersję a w nieparzystych odczytuj jej wynik. Wszystko zadziała pod warunkiem, że czas pomiędzy przerwaniami będzie dłuższy niż czas konwersji, ale to nie powinien być problem. Możesz od biedy użyć tego while w obsłudze przerwania. Konwersja nie trwa długo, jeśli przetwornik taktowany jest dość szybko. Oczywiście długo to pojęcie względne i wszystko zależy od konkretnej aplikacji...robiw

    Dodano po 4 [minuty]:

    Chociaż sposób kolegi BlueDraco jest dobry. Tylko przed wystąpieniem pierwszego przerwania musisz zainicjowac pierwsza konwersję. Zresztą i tak zawsze warto to zrobić, bo trwa znacznie dłużej ;-)...robiw

    Dodano po 2 [minuty]:

    I nie bardzo rozumiem po co Ci tryb PWM? Wystarczy zwykły lub CTC. PWM służy zwykle do czego innego...robiw
  • #7 15120819
    BlueDraco
    Specjalista - Mikrokontrolery
    Nie musisz startować konwersji przed pierwszym przerwaniem (chociaż oczywiście możesz). Pierwszy wynik i tak jest na straty, a wyniki konwersji na ogół wypada filtrować programowo.
  • #8 15120862
    GrzesiekF1
    Poziom 10  
    Tryb PWM służy u mnie do sterowania silnikiem. W przerwaniu Timer1_OVF_vect dokonuje pomiaru prądu, w Timer1_COMPA_vect chcę wrzucić algorytm PI i obliczać nową wartość PWMa, a w głównej pętli programu wysyłać nową obliczoną wartość do rejestru OCR1.
    Niestety po zabawie z przerwaniami pomiar całkowicie przestał działać...
  • #9 15120975
    BlueDraco
    Specjalista - Mikrokontrolery
    Potrzebujesz tylko jednego przerwania - timera. Jeśli zrobisz PID z danymi typu float, to chyba nie ma szans, żeby to zadziałało na AVR.
  • #10 15125306
    GrzesiekF1
    Poziom 10  
    Tylko jednego przerwania? Czy tego, w którym wykonuje się pomiar? Skoro tak, to czy jest istotne kiedy będę wykonywał obliczenia i wystawiał nową wartość na OCR1?
  • Pomocny post
    #11 15127030
    BlueDraco
    Specjalista - Mikrokontrolery
    Istotne może być to, kiedy startujesz pomiar. Rejestr OCR w każdym przyzwoitym mikrokontolerze jest buforowany, więc można go aktualizować w dowolnym momencie - fizycznie zostanie przeładowany przy zawinięciu okresu. Na pewno nie ma sensu aktualizować go w pętli głównej, podobnie jak sama "pętla główna" nie ma sensu.

    Jeśli natomiast używasz zmiennych typu float, to nie możesz wykonywać obliczeń w przerwaniu. Wtedy niestety musisz zrobić niepustą pętlę główną do obliczeń PID.
  • REKLAMA
  • #12 15127700
    Konto nie istnieje
    Konto nie istnieje  
  • #13 15128084
    BlueDraco
    Specjalista - Mikrokontrolery
    Piotrus_999

    To timer miał określać momenty pomiarów, więc stosowanie przerwań ADC w takiej sytuacji ma niewielki sens.
  • #14 15128328
    Konto nie istnieje
    Konto nie istnieje  
  • #15 15128438
    tmf
    VIP Zasłużony dla elektroda
    Piotrus_999 napisał:
    BlueDraco napisał:
    Piotrus_999

    To timer miał określać momenty pomiarów, więc stosowanie przerwań ADC w takiej sytuacji ma niewielki sens.


    No ale raczej pojedynczy pomiar adc w tych prockach ma raczej niewelki sens. Jeżeli musialbym dostac wynik pomiaru i to w miarę dokładnie w okreslonej chwili to raczej bym jakies zewnętrzne adc zastosował.


    A to niby dlaczego? ADC w M32 ma tryb wyzwalania sygnałem zewnętrznym, komparatorem lub zdarzeniem przepełnienia, porównania lub przechwycenia timera 0 lub 1. W efekcie można wyzwalać pomiar ADC w ściśle określonym momencie, co więc ma dać zewnętrzny ADC?
  • #16 15128717
    Konto nie istnieje
    Konto nie istnieje  
  • #17 15129078
    tmf
    VIP Zasłużony dla elektroda
    Piotrus_999 napisał:
    tmf napisał:

    A to niby dlaczego? ADC w M32 ma tryb wyzwalania sygnałem zewnętrznym, komparatorem lub zdarzeniem przepełnienia, porównania lub przechwycenia timera 0 lub 1. W efekcie można wyzwalać pomiar ADC w ściśle określonym momencie, co więc ma dać zewnętrzny ADC?


    Bo napisał że nie chce generalnie żadnych pętli w przerwaniu. Czyli że jeden odzczyt i tyle. Przy takim czytaniu trzeba byc dosć ostrożnym - eliminować zakłócenia (dziwne odczyty), a doskładność - jak się nie zczyta kilku i uśredni też bedzie słaba.


    A co to ma wspólnego ze sposobem wyzwalania ADC? Metoda została podana przez kol. BlueDraco na samym początku wątku i nie ma kombinować ani pisać o jakiś zewnętrznych ADC...
REKLAMA