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

Kod w C dla PWM na ATmega8 do sterowania silnikiem dwoma przyciskami

the_one 29 Lip 2006 01:37 2415 4
  • #1 2860584
    the_one
    Poziom 13  
    Posty: 75
    Pomógł: 5
    Ocena: 20
    witam,
    potrzebuje jakiegos programu(kodu) ktory generuje sygnal pwm. dopiero zaczynam zabawe z uC i umiem juz zapalac ledy etc. :P Nigdzie nie moge znalesc info jak napisac program dzieki ktoremu mogl bym np zmieniac predkosc obrotowa silniczka za pomoca dwoch przyciskow.

    znalazlem troche info w tym temacie https://www.elektroda.pl/rtvforum/topic339802.html ale sterowanie za pomoca przyciskow mi nie wychodzi :(
    Czy mogl by mi ktos opisac ten program? zwlaszcza inicjacje pwm
  • #2 2860603
    autoservice
    Poziom 20  
    Posty: 516
    Pomógł: 7
    Ocena: 16
    ...otworz pdf atmegi8 i popatrz na rejestry ktore trzeba skonfigurowac...oczywiscie dla liczniki ktory ma tryb pwm, skonfiguruj je i potem zaladuj licznik jakas stala wartoscia, otrzymasz przebieg o stalym wypelnieniu zaleznym od wartosci licznika tj odpowiedniego rejestru porownania. zachecam do przejrzenia pdf, to tylko kilka linijek kodu i gotowe :) to na zachete...
    pzdr.
  • #3 2861535
    Procekk
    Poziom 12  
    Posty: 77
    Pomógł: 3
    PWM możesz sobie zrobić tak, że odpalasz np. timer0 zeby rzucał Ci przerwania co określony czas (jakies us, ms), inkrementujesz zmienną w obsłudze przerwania, po przekroczeniu np. 255 zerujesz. Masz w tym momencie "przebieg" (zmiennej) w kształcie piły. Wystarczy teraz w każdym przerwaniu od Timera porównywać tą zmienną z inną, ustaloną, i jeśli jedna większa od drugiej to "H" na wyjście, inaczej "L".
    No ale, możesz odpalić sprzętowego PWMa i sie nie bawić w liczenie. Powiedzmy niech PWM będzie 8-bitowy (wyjście PB3 (OC2)). To teraz poleć na strone 115 dokumentacji. Masz tam rejestr TCCR2 (od Timera2), ustawiasz tutaj preskaler timera, czy ma chodzic PWM, jeśli tak to rodzaj.
    Np. TCCR2 = (1 << WGM20) | (1 << COM21) | (1 << CS22)
    TCNT2 = 0 (od jakiego poziomu liczymy)
    OCR2 = 0x80 (moment porównania, w dowolnym miejscu programu jak to zmienisz, będziesz miał regulacje PWMa).
    No i jeszcze wyjście PB3 musisz ustawić: DDRB = _BV(PB3).
    Pomyśl, poczytaj, pokombinuj, a więcej zyskasz niż z gotowca (choć już prawie go masz :)). Powodzenia.
  • #4 2862393
    the_one
    Poziom 13  
    Posty: 75
    Pomógł: 5
    Ocena: 20
    dzieki:D jakims cudem uruchomilem
    a gdzie sie zmienia czestotliwosc?

    edit:
    jaka jest maksymalna i minimalna wartosc OCR2?

    zrobilem takie cos:
    
    { 
      
      if(bit_is_clear(PINC,PC5)) 
    {
    pwm++;
    delayms(10);
    }
    if(bit_is_clear(PINC,PC4)) 
    {
    pwm--;
    delayms(10);
    
    }
    
    
     OCR2 = pwm; 
      
     }
    

    i zmieniam sobie jasnosc led'a. Tylko ze gdy dojdzie do maksymalnej jasnosci led gasnie i zaczyna sie rozjasniac od poczatku.

    edit2:

    dobra juz wszystko wiem:D
  • #5 2863688
    Procekk
    Poziom 12  
    Posty: 77
    Pomógł: 3
    Gratuluje sukcesu :)
    ---
    Częstotliwość zmieniać najlepiej preskalerem (bity CS w TCCR2), no i ewentualnie rejestrem który mówi od jakiego "poziomu" zaczynamy liczyć (TCNT2), ale przesuwając w górę, trzeba pamiętać że zawężamy również możliwość regulacji wypełnienia (rozdzielczość) przez OCR2.
    ---
    Co do zgaszenia i rozjaśnienia od nowa - po prostu wpisujesz wartość do rejestru większą niż jest w stanie pomieścić, zrób zabezpieczenie w warunkach if (bit_is_clear), że jęsli zmienna pwm osiągnęła wartośc max, to już jej nie zwiększaj i podobnie przy ściemnianiu :)
    ---
    OCR2 możesz zmieniać w zakresie 0-255 (PWM 8-bitowy)
REKLAMA