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

[C] Atmega8 PWM - jak sterować?

cineksuw 28 Gru 2008 23:42 25149 12
REKLAMA
  • #1 5916498
    cineksuw
    Poziom 10  
    Witam. Jak sterowac PWM ?? Slyszalem ze dzieki temu mozna sterowac obrotami silnika DC. Na jakiej zasadzie to dziala ? I jak na przykladzie napisac te sterowanie ?

    PS. Tylko nie dawajcie linkow do elektroda avr bo tam jest tak lipnie wytlumaczone ze nie moge sie polapac co i jak.
  • REKLAMA
  • #2 5916581
    mufi
    Poziom 12  
    też by mnie ten temat interesował :D
  • #3 5916587
    cineksuw
    Poziom 10  
    no to nie jestem sam :) na razie ucze sie programować więc stąd takie pytania :)
  • REKLAMA
  • #4 5916588
    kasaidolar
    Poziom 19  
    Mowiac krotko:
    Gdy silnik DC dostaje przez caly czas napiecie to kreci sie z pewna predkoscia, ale gdy w ciagu np kolejnych 10ms napiecie jest tylko 5ms to wypelnienie takiego impulsu (napiecia) jest 50%. Powoduje to ze silnik kreci sie wolniej bo napiecie na nim utrzymuje sie tylko w 50% czasu.
  • #6 5916618
    kasaidolar
    Poziom 19  
    Ja tez wlasnie nie rozumiem czemu nie chcesz poszukac. Nie bardzo rozumiem w czym problem - czego nie rozumiesz. Nie rozumiesz co to PWM? Czy jak go uruchomic w procku? Czy nie wiesz jak sterowac tak silnikiem DC.
  • REKLAMA
  • #7 5916627
    snow
    Poziom 31  
    Jak ktoś nie wie jak obsługiwać PWM to może sobie sterowanie zrobić na drabince R-2R :P
  • #8 5916638
    cineksuw
    Poziom 10  
    to moze byscie powiedzieli co i jak bo te posty i te nazwy nie wiele mi mowia :) potrzebuje prostego kodu jak to zrobic :)
  • REKLAMA
  • #9 5916645
    BoskiDialer
    Poziom 34  
    snow: Tak, ale tylko wtedy, kiedy stopień mocy toleruje napięcia pośrednie. Nie chodzi o średnią wartość, tylko o to, że jest ona uzyskiwana z dwóch stanów, przez co da się tą metodę wykorzystać praktycznie w większości stopni.

    Co do samego trybu pracy PWM, w dokumentacji do atmega8 o którym mowa jest dokładnie opisane, jak skonfigurować t1 lub t2, aby generowały sygnał PWM. Wbrew pozorom nie jest to skomplikowane, ustawić tryb, zegar a potem tylko sterować wartością progową w OCR'ach.
  • #11 5916747
    klops_mops
    Poziom 17  
    Ja też podam przykład w BASCOMie:

    
    $regfile = "m8def.dat"
    $crystal = 1000000
    
    Config Timer1 = Pwm , Pwm = 8 , Compare A Pwm = Clear Up , Prescale = 64       
    
    Dim I As Byte
    
    Pwm1a = 0                                                   'wpisanie wartości początkowej 0
          
    Do
    For I = 0 To 255
     Pwm1a = I
     Waitms 10
     Next I
     For I = 255 To 0 Step -1
     Pwm1a = I
     Waitms 10
     Next I
    Loop
    End
    


    Jak zmieniać wartość PWM?

    
    Pwm1a = x
    
    ' gdzie x 0-255 - wartość wypełnienia PWM
    


    W przykładzie podłącz sobie diodę do VCC oraz do nóżki procesora Timer1.

    Pozdrawiam!
  • #12 5916751
    speecu
    Poziom 11  
    Witam!

    http://atmega32.republika.pl/
    To jest link do polskiego tłumaczenia noty aplikacyjnej do Atmega32.
    Nawet jeżeli nie dotyczy to Atmega8, to dość łatwo poprzez analogię dojść jak działają timery i nie tylko, oraz co trzeba ustawić.

    Pozdrawiam
  • #13 5917511
    kasaidolar
    Poziom 19  
    Działajacy przykład:
    
    void PWM_init(void)
    {
    
        DDRD = _BV(PD4) | _BV(PD5);
        
    	//  Set up Timer 1. Timer 1 should reset when
        //  it reaches TOP = ICR1 (WGM13:0 = 1110b). On
        //  compare match clear output, at TOP set (COM1A1:0 = 10b).
        
        TCCR1A = _BV(COM1A1) | !_BV(COM1A0)                 //  Both PWM outputs set at TOP,
                    | _BV(COM1B1) | !_BV(COM1B0)            //    clear on compare match
                    | !_BV(FOC1A) | !_BV(FOC1B)             //  PWM mode, can't force output
                    | _BV(WGM11) | !_BV(WGM10);             //  Fast PWM, TOP = ICR1
        
        TCCR1B = !_BV(ICNC1) | !_BV(ICES1)                  //  Disable input capture noise canceler,
                                                            //    edge select to negative.
                    | _BV(WGM13) | _BV(WGM12)               //  Fast PWM, TOP = ICR1
                    | !_BV(CS12) | _BV(CS11) | _BV(CS10);   //  clk(i/o) / 1024
    
    
    	ICR1 = 2250;
    
    	OCR1A = 2250; // to zmieniasz w programie i zmieniasz wypelnienie
    
    }
    


    Dodano po 59 [sekundy]:

    Podlacz sobie wtedy diodke do wyjscia od pwm i zobaczysz jak zmienia sie jasnosc swiecenia diodki. Pozdr
REKLAMA