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

[ATMEGA8A] [C] - czy to dobra konfiguracja PWM? Dziwna częstotliwość wyjściowa.

Kaliber PC - Service 10 Kwi 2017 15:12 1170 19
REKLAMA
  • #1 16404394
    Kaliber PC - Service

    Poziom 22  
    Witam serdecznie,

    Zwracam się z pytaniem, czy podana niżej konfiguracja PWM w języku C jest poprawna? Wątpliwości moje biorą się z tego, iż wypełnienie jest prawidłowo pokazywane (0...100%) w skali 8bitowej (0...255), natomiast częstotliwość PWM, przy podanej częstotliwości uC, wynosi niecałe 2kHz przy preskalerze równym 1. Dla odmiany - przy ustawieniu preskalera np. na 256 to częstotliwość jest równa tylko 8Hz. Procek to Atmega8A - jak w temacie.

    Krótki program (bo chcę tylko i wyłącznie sterować PWM):


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

    Proszę również zwrócić uwagę na linijkę TCCR1B - dlaczego właśnie jest TCCR1B? Nie powinno być TCCR1A? Kiedy wklepuję TCCR1A, to program w ogóle mi nie startuje (podpięty LED nie świeci).

    Podczas pisania sugerowałem się datasheetem z uC oraz tą stronką : http://forbot.pl/blog/artykuly/programowanie/...o-co-musisz-wiedziec-aby-uruchomic-pwm-id5021 .

    Bardzo proszę o pomoc i fachowe porady.
    Pozdrawiam.
  • REKLAMA
  • #2 16404410
    yokoon
    Poziom 29  
    Witam.
    Bity z rejestru TCCR1B są bitami prescalera i bez nich procek nie wystartuje.
    Są prawidłowo umiejscowione.
  • #3 16404424
    Kaliber PC - Service

    Poziom 22  
    Ok, jedna rzecz już jasna, dzięki za odpowiedź.

    A co z resztą? Czy jest to prawidłowa konfiguracja w programie?
  • REKLAMA
  • #4 16404614
    yokoon
    Poziom 29  
    Witam.
    WGM10 i WGM12 to tryb pracy Fast PWM 8-bitowy, ale bit WGM12 znajduje się
    w rejestrze TCCR1B.
  • #5 16404621
    excray
    Poziom 41  
    JasnyKris napisał:
    TCCR1A |= (1<<WGM10) | (1<<WGM12);

    WGM12 znajduje się w rejestrze TCCR1B
  • #6 16404697
    electronics_design

    Poziom 14  
    Wszystko działa dobrze. W trybie fast PWM częstotliwość wynosi fosc/2 więc wg. twoich ustawień dla prescalera 1:
    f = (fosc/2)/256 = 1953 Hz. Zwróć uwagę, że częstotliwość zegara zawsze będzie w tym trybie najpierw dzielona przez 256 i przez 2 a dopiero potem wyznacz sobie wartość prescalera. Jaka częstotliwość wyjściowa cię interesuje?

    Dodano po 2 [minuty]:

    Sorry przez 2 dzielimy w trybie z korekcją fazy. Więc częstotliwość powinieneś mieć 3906 Hz
  • REKLAMA
  • #7 16404718
    yokoon
    Poziom 29  
    electronics_design napisał:
    Wszystko działa dobrze. W trybie fast PWM częstotliwość wynosi fosc/2 więc wg. twoich ustawień dla prescalera 1:
    f = (fosc/2)/256 = 1953 Hz. Zwróć uwagę, że częstotliwość zegara zawsze będzie w tym trybie najpierw dzielona przez 256 i przez 2 a dopiero potem wyznacz sobie wartość prescalera. Jaka częstotliwość wyjściowa cię interesuje?

    Dodano po 2 [minuty]:

    Sorry przez 2 dzielimy w trybie z korekcją fazy. Więc częstotliwość powinieneś mieć 3906 Hz


    Skąd wytrzasnąłeś 256?
    W rejestrze OCR1A jest wpisane 200.
  • #9 16405101
    electronics_design

    Poziom 14  
    Dokładnie stosunek OCR/256 określa Ci wypełnienie przebiegu. W dokumentacji masz napisane, że wartość TOP dla trybu fast PWM to 0xFF dlatego częstotliwość wyliczasz dzieląc zegar przez tę wartość, a dokładnie 0xFF+1 wg. wzoru.
  • #10 16405147
    Kaliber PC - Service

    Poziom 22  
    electronics_design napisał:
    Wszystko działa dobrze. W trybie fast PWM częstotliwość wynosi fosc/2 więc wg. twoich ustawień dla prescalera 1:
    f = (fosc/2)/256 = 1953 Hz. Zwróć uwagę, że częstotliwość zegara zawsze będzie w tym trybie najpierw dzielona przez 256 i przez 2 a dopiero potem wyznacz sobie wartość prescalera. Jaka częstotliwość wyjściowa cię interesuje?

    Dodano po 2 [minuty]:

    Sorry przez 2 dzielimy w trybie z korekcją fazy. Więc częstotliwość powinieneś mieć 3906 Hz


    No i właśnie tutaj jest ten szkopuł - moje obliczenia rowniez wskazuja na to, ze powinno być ok 4kHz, wiec skad mi sie bierze te 1980Hz (bo tyle co do joty pokazuje mi oscyloskop)? To jak jakby PWM działał tylko na 50% f.

    Koledzy wskazują również, że bit WGM12 jest w rejestrze TCCR1B, czy to może powodować nieprawidłowe działanie tego PWM? Czyli zmienić z TCCR1A na TCCR1B, jak dobrze rozumiem? Czy jeszcze inaczej "pokopać"?
  • #11 16405230
    electronics_design

    Poziom 14  
    Oczywiście, że tak :) widzisz tutaj jest problem tak na prawdę ustawiasz tylko bit WGM10 czyli masz tryb PWM 8 bit z korekcją fazy - stąd dzielenie częstotliwości /2.
    Twój kod powinien wyglądać:
    DDRB = 0b00000010;
    TCCR1A |= (1<<WGM10);
    TCCR1A |= (1<<COM1A1);
    TCCR1B |= (1<<CS10) | (1<<CS11) | (1<<WGM12);
    OCR1A = 200;
    Teraz będzie działać
  • #12 16405231
    tronics
    Poziom 38  
    To co kolega bierze za nazwę bitu to tylko symbol... ot zwykły #define, innymi słowy zamiast ustawić bit WGM12 z rejestru TCCR1B ustawił kolega ten sam (czyt. 4) bit rejestru TCCR1A czyli FOC1A, który nie ma znaczenia w trybach PWM. Ergo zamiast ustawić fast pwm 8bit ma kolega ustawione 8bit pwm phase correct. Prawda? Kłania się tabelka Waveform Generation Mode Bit Description
  • #13 16405302
    Kaliber PC - Service

    Poziom 22  
    Panowie, bo trochę się pogubiłem a nie mam też za bardzo możliwości wklepania poprawek do programu (nie to miejsce i nie ta godzina)... wg. tego co pisze kolega tronics i patrząc na tabelkę to też wygląda mi to na ustawienie "phase correct", więc nadal nie wiem do końca w którą stronę iść. Zmyłka.. :D
  • REKLAMA
  • Pomocny post
    #14 16405311
    electronics_design

    Poziom 14  
    Sprawdź kod który wyżej podesłałem, na pewno będzie teraz działać. Nie masz się czym przejmować, tak jak mówisz wg tabelki trzeba ustawić WGM10 i WGM12 ale znajdują się one w osobnych rejestrach. Sprawdź podpowiedzi jakie wszyscy napisali i na pewno dojdziesz do tego czemu powinno być tak jak mówimy ;)
  • #16 16405560
    Kaliber PC - Service

    Poziom 22  
    electronics_design napisał:
    Sprawdź kod który wyżej podesłałem, na pewno będzie teraz działać. Nie masz się czym przejmować, tak jak mówisz wg tabelki trzeba ustawić WGM10 i WGM12 ale znajdują się one w osobnych rejestrach. Sprawdź podpowiedzi jakie wszyscy napisali i na pewno dojdziesz do tego czemu powinno być tak jak mówimy ;)


    Miałeś rację, działa jak mówiłeś :) Ale rzeczywiście musiałbym jeszcze trochę przestudiować datasheeta i Wasze porady "czemu jest tak a nie inaczej".

    Tak czy inaczej - dziękuję wszystkim za pomoc i porady, już jesteśmy w domu!
  • #17 16406208
    malpek
    Poziom 18  
    Na tej stroni kolega ma wszystko ładnie wytłumaczone o timerach: Link
  • #18 16406757
    Kaliber PC - Service

    Poziom 22  
    Dzięki kolego, pochwalam za dobre serce!
  • #20 16410507
    Kaliber PC - Service

    Poziom 22  
    Przejrzałem i już wszystko rozumiem, dzięki i Tobie za dobre rady.

    A tak marginesem - PWM działa i ma się dobrze, już tworzą się pierwsze zabawki.. :D
REKLAMA