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

[ATMega16][c] Fast PWM 16bitów, do sterowania servem.

_StinG_ 23 Lis 2009 09:26 3890 12
REKLAMA
  • #1 7297397
    _StinG_
    Poziom 14  
    Tak jak w temacie.

    Chciałem użyć 16-bitowego PWM na Timerze1,

    Poprzednio na ATTiny13 zrobiłem i serwo działało bez zarzutów (oczywiście 8-bitowy timer)
    Tu pocę się i nie działa:

    
    void initPWM()    //inicjalizacja timera
    {
      //OCR1A  = 40000;
      OCR1AH = 40000>>8;
      OCR1AL = 40000 & 0xFF;                                            //TOP = 40000
      TCCR1A = (1<<WGM10) | (1<<WGM11) | (1<<COM1A1) ;
      TCCR1B = ( 1<<CS11) | (1<<WGM12) | ( 1<<WGM13);        //Fast PWM, pin OC1A w trybie nie odwracającym, prescaler 8;
    }
    
    void turn(char grad_x_10)    //obrót serwa
    {
    
      int val;
    
      val = MIN_VAL + (((MAX_VAL-MIN_VAL)*(9+grad_x_10))/18 );
      TCNT1 = val;
    }
    


    takie 2 funkcje stworzyłem i już nie bardzo wiem co jest nie tak.
    Proszę o jakieś wskazówki.
  • REKLAMA
  • #3 7297500
    _StinG_
    Poziom 14  
    To info z noty katalogowej:
    
    tryb|   WGM13:0     | dzialanie | TOP     | Aktualizacja | Flaga
    ----------------------------------------------------------------
    15  | 1 | 1 | 1 | 1 | Fast PWM | OCR1A | BOTTOM | TOP
    
    



    program zmieniłem tak i nic:

    
      TCNT1  = 40000;
    //  OCR1AH = 40000>>8;
    //  OCR1AL = 40000 & 0xFF;
      TCCR1A = (1<<WGM10) | (1<<WGM11) | (1<<COM1A1) ;
      TCCR1B = ( 1<<CS11) | (1<<WGM12) | ( 1<<WGM13); 
    }
    
    void turn(char grad_x_10)
    {
    
      int val;
    
      val = MIN_VAL + (((MAX_VAL-MIN_VAL)*(9+grad_x_10))/18 );
      OCR1A = val;
    }
    
  • REKLAMA
  • Pomocny post
    #4 7297512
    mirekk36
    Poziom 42  
    _StinG_ --> tak wiem i widziałem to info nie raz ;) ..... dlatego polecałem ci abyś spróbował któryś z trybów 5 do 7 ..... to wtedy łatwiej może będzie ci dostrzec czym różnią się tryby 14 i 15 od trybów 5,6 i 7. Tym bardziej, że tryby 5,6 albo 7 od razu zadziałają ci zgodnie z twoimi oczekiwaniami (tak myślę)

    Dodano po 5 [minuty]:

    jak? gdzie zmieniłeś program? jeśli nadal ustawiasz bit ..... ( 1<<WGM13);
  • #5 7297554
    _StinG_
    Poziom 14  
    7 próbowałem, nie działa, jak by pin nie odpowiadał.
  • #7 7297600
    _StinG_
    Poziom 14  
    Tak...
  • REKLAMA
  • #9 7309864
    _StinG_
    Poziom 14  
    Nie wiem jak uruchomić to w 16 bitach, w 10 uruchomiłem teraz bez najmniejszych problemów :/
  • REKLAMA
  • #10 7310026
    snow
    Poziom 31  
    Kto ci powiedział że da się 16 bitów?
  • #11 7317832
    _StinG_
    Poziom 14  
    Tak zrozumiałem z noty katalogowej... Mogę się mylić ale, w trybie 15, jest napisane, że wartość "TOP" licznika jest ograniczona rejestrem OCR1A, Który z kolei jest 16 bitowy, czy moje rozumowanie było błędna? Poprawcie mnie jeśli plotę bzdury.
  • Pomocny post
    #12 7317889
    mirekk36
    Poziom 42  
    snow napisał:
    Kto ci powiedział że da się 16 bitów?


    ja myślę, że nota katalogowa powiedziała, że się da 16 bitów. Chociażby w tym zdaniu:

    Cytat:
    The PWM resolution for fast PWM can be fixed to 8-, 9-, or 10-bit, or defined by either
    ICR1 or OCR1A.




    _StinG_ napisał:
    Tak zrozumiałem z noty katalogowej... Mogę się mylić ale, w trybie 15, jest napisane, że wartość "TOP" licznika jest ograniczona rejestrem OCR1A, Który z kolei jest 16 bitowy, czy moje rozumowanie było błędna? Poprawcie mnie jeśli plotę bzdury.


    twoje rozumowanie jest prawie dobre ;)

    jeśli chcesz zrobić sprzętowy PWM ale nie 8,9 lyb 10 bitowy (choć do płynnego sterowania świeceniem diody LED 10bitowy to już aż za dużo) to rzeczywiście musisz skorzystać ale z trybu 14-tego a nie 15go. W trybie 14 wartość TOP ustalasz sobie właśnie za pomocą rejestru ICR a za pomocą OCR1x regulujesz sobie wypełnienie. Jednak ze względu na brak podwójnego buforowania rejestru ICR nie nadaje się ten tryb do takich celów gdzie chciałbyś aktywnie zmieniać poza wypełnieniem także częstotliwość sygnału PWM. W przeciwnym wypadku spoko. Masz to opisane tutaj w nocie -poniżej fragment.

    Cytat:
    Using the ICR1 Register for defining TOP works well when using fixed TOP values. By
    using ICR1, the OCR1A Register is free to be used for generating a PWM output on
    OC1A. However, if the base PWM frequency is actively changed (by changing the TOP
    value), using the OCR1A as TOP is clearly a better choice due to its double buffer
    feature.


    Użycie trybu 15 ograniczone jest do takich zachowań:

    Cytat:
    The extreme values for the OCR1x Register represents special cases when generating
    a PWM waveform output in the fast PWM mode. If the OCR1x is set equal to BOTTOM
    (0x0000) the output will be a narrow spike for each TOP+1 timer clock cycle. Setting the
    OCR1x equal to TOP will result in a constant high or low output (depending on the polarity
    of the output set by the COM1x1:0 bits.)
    A frequency (with 50% duty cycle) waveform output in fast PWM mode can be achieved
    by setting OC1A to toggle its logical level on each compare match (COM1A1:0 = 1).
    This applies only if OCR1A is used to define the TOP value (WGM13:0 = 15). The waveform
    generated will have a maximum frequency of fOC1A = fclk_I/O/2 when OCR1A is set to
    zero (0x0000). This feature is similar to the OC1A toggle in CTC mode, except the


    czyli ponieważ tym razem to OCR1x jest TOP - to niestety przy ustawionych bitach COM tak jak w innych trybach gdzie chciałbyś sterować wypełnieniem będzie KISZKA ;) bo będziesz miał tylko albo stan wysoki albo stan NISKI z ew super cieniutkimi szpileczkami. W tym trybie możesz za to wykorzystać tryb bitów COM tak aby uzyskać TOGGLE czyli coś podobnego jak w trybie CTC
  • #13 7323764
    _StinG_
    Poziom 14  
    Normalnie wielkie dzięki za wyjaśnienie, teraz już rozumiem co robiłem nie tak :) Twoja odpowiedź jest w pełni wyczerpująca i teraz spokojnie mogę uznać, temat za zamknięty, a Tobie należą się jeszcze raz OGROMNE podziękowania.
    Ponadto znalazłem jeszcze jeden błąd ale tutaj

    ale to oczywiście poprawiłem.
REKLAMA