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

ATmega8A - PWM o zmiennej czestotliwosci i wypelnieniu do 150kHz

EE.PW 18 Sie 2016 19:21 1314 5
  • #1 15876500
    EE.PW
    Poziom 8  
    Witam,
    potrzebny jest mi generator fali PWM o zmiennej częstotliwości i wypełnieniu. Górna częstotliwość wynosi 150kHz, dolna 10kHz. W programie wykorzystuję dwa kanały adc (tj. adc1, adc2) oraz jedno wyjście dla wspomnianej fali (tj. PC5). Atmega8 pracuje z zewnętrznym kwarcem 16MHz. Górna częstotliwość wymaga 106 cykli zegarowych, dolna natomiast 1600. Moim licznikiem jest timer1 pracujący w trybie CTC. Założyłem następującą strukturę programu:
    -konfiguracja adc oraz timer1
    -pobranie danych z adc (tj. wypełnienie i częstotliwość)
    -wykonanie obliczeń dla danych wejściowych
    -określenie który stan logiczny w okresie jest dłuższy
    -w przerwaniu dotyczącym wspomnianego stanu dominującego wykonanie jednego z trzech etapów: aktualizacja danych, pobranie informacji o wypełnieniu, o częstotliwości.
    -w pętli głównej programu oczekiwanie na komplet danych dla algorytmu obliczeniowego
    -aktualizacja danych w przerwaniu
    Doszedłem do wniosku, że stan logiczny w najgorszym przypadku będzie miał 53 cykle zegarowe i przez mój brak doświadczenia uznałem, że to wystarczająco.
    Poniższy program działa prawidłowo do ok 15kHz, później jest niestabilny, aż w końcu mam jakieś śmieci na oscyloskopie. Myślałem początkowo, że przerwanie przekracza czas trwania danego stanu logicznego. Wrzuciłem diody tak by zmieniały stan na wejściu i wyjściu z przerwania, ale to jednak nie jest ten problem. Sam algorytm obliczeniowy nie ma tu większego znaczenia i wspomniane linijki symulują jedynie prace na zakresie uint31_t. Proszę o pomoc i wskazanie kierunku w którym powinienem pójść z opisanym projektem.
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • Pomocny post
    #2 15876593
    Andrzej__S
    Poziom 28  
    EE.PW napisał:
    potrzebny jest mi generator fali PWM o zmiennej częstotliwości i wypełnieniu.

    EE.PW napisał:
    Moim licznikiem jest timer1 pracujący w trybie CTC.

    Nie analizowałem kodu, bo przekombinowałeś. Jak chcesz mieć zmienne wypełnienie to użyj trybu FastPWM (tryb 15 z wartością TOP w OCR1A), a nie CTC.

    W trybie tym częstotliwość zmieniasz za pomocą rejestru OCR1A, wypełnienie za pomocą OCR1B, polaryzację sygnału za pomocą bitów COM1B1 i COM1B0 w rejestrze TCCR1A, sygnał masz na pinie OC1B (PB2).

    Zdajesz sobie sprawę, że rozdzielczość regulacji wypełnienia będzie zależna od częstotliwości (im wyższa częstotliwość, tym mniejsza rozdzielczość)?
  • #3 15876624
    EE.PW
    Poziom 8  
    Tak, zdaję sobie sprawę ze spadku rozdzielczości wraz ze wzrostem częstotliwości. Zacząłem już nawet pisać program w trybie FastPWM, jednak cały czas zastanawiam się co jest przyczyną nieprawidłowej pracy tego co napisałem. To jest pierwszy program w mojej "karierze" i chciałbym go doprowadzić do końca. Dzięki za odpowiedz :D
  • Pomocny post
    #4 15876929
    Konto nie istnieje
    Konto nie istnieje  
  • #5 15877092
    EE.PW
    Poziom 8  
    Dzięki za odpowiedz. Miałem w przerwaniu wcześniej pętle while, która czekała na zakończenie konwersji. Wyrzuciłem ją sam nie wiem dlaczego. Chyba pomyślałem: "przerwanie jest zbyt długie, muszę je skrócić" nie zdając sobie konsekwencji z takiego działania. Teraz przynajmniej wiem dlaczego jak kręciłem potencjometrem od częstotliwości to zmieniałem wypełnienie i na odwrót. A moglibyście jeszcze powiedzieć mi jak to jest z tą flagą przerwania. Jest ona czyszczona po wejściu do jego obsługi czy po wyjściu??
  • #6 15877128
    Konto nie istnieje
    Konto nie istnieje  
REKLAMA