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

[AVR] [AVR][Atmega328p] - Ustawienia PWM dla silnika DC, problem z kierunkiem obrotów

sorex86 18 Lip 2013 14:22 2637 4
REKLAMA
  • #1 12535302
    sorex86
    Poziom 15  
    Witam,

    Używam sterownika do silnika DC. Sterowanie polega na podanie odpowiedniego wypelnienia PWM na wejscia AIN1 AIN2. Wejscia AIN odpowiadaja za obroty w lewo/prawo. Uzywam atmegi328p. http://www.atmel.com/Images/doc8161.pdf

    Zasada dzialania (obroty w prawo/lewo):

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


    PWM na pinach PD5 PD6 powinny dzialac synchronicznie. Niestety przy obecnych ustawieniach silnik kreci mi sie tylko w jedna strone. np.

    timer_init();
    OCR0A = 255; //PD6 //BIN2 //M1B 255niski, 0 wysoki
    OCR0B = 170; //speed

    Jak odwroce wartosc silnik stoi w miejscu. Dlatego mam pytanie czy dobrze ustawilem timer/counter? Cialo funkcji to wywolanie timera.

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


    Korzystalem z poradnika z tej strony:
    https://sites.google.com/site/qeewiki/books/avr-guide/pwm-on-the-atmega328
    atmega328p. http://www.atmel.com/Images/doc8161.pdf

    main.c

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #2 12535637
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #3 12535679
    sorex86
    Poziom 15  
    Kierowalem sie tym opisem:

    MODE WGM02 WGM01 WGM00 TOP DESCRIPTION

    7 1 1 1 OCR0A Fast PWM
    3 0 1 1 0xFF Fast PWM

    Myslalem, ze MOD 7 jest odpowiedni? To jaki tryb wybrac? Aby miec 4 PWMy na portach:

    #define BIN1 (1<<PD5)
    #define BIN2 (1<<PD6)
    #define AIN1 (1<<PB3)
    #define AIN2 (1<<PD3)

    ?
  • REKLAMA
  • #4 12535943
    Konto nie istnieje
    Poziom 1  
  • #5 12535951
    perlon
    Poziom 20  
    Może to powinno wyjaśnić
    
    The counter counts from BOTTOM to TOP then restarts from BOTTOM.
    TOP is defined as 0xFF when WGM2:0 = 3, and OCR0A when WGM2:0 = 7.
    


    Ja to rozumiem tak, że jak licznik osiągnie OCR0A to jest zerowany i tylko wywołuje przerwanie dając w efekcie 0% wypełnienia. Wypełnienie byłoby różne od zera gdybyś pozwolił licznikowi iść dalej czyli niepotrzebne jest (1<<WGM2)
REKLAMA