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][C] soft PWM i servo - gdzie robię błąd ?

mirekk36 09 Lut 2010 23:21 3525 8
REKLAMA
  • #1 7670951
    mirekk36
    Poziom 42  
    Witam,

    Piszę program w C. Procek ATmega8 taktowany zewn kwarcem 16MHz i fusy oczywiście przestawione prawidłowo.

    1. Ustawiam sobie Timer2 w tryb CTC
    2. Ustawiam preskaler na 8
    3. Ustawiam OCR2 na 20
    4. Odblokowuję przerwanie CompareMatch

    dzięki czemu uzyskuję przerwanie co 10us

    w przerwaniu mam zmienną (licznik) którą inkrementuję do 999 i znowu na 0

    mam zmienną sr której wartość porównywana jest z tym licznikiem w przerwaniu i generuję tak sobie ładnego PWM'a o częstotliwości 50Hz

    bo 16.000.000 / 8 / 20 / 1000
    F_CPU prescaler OCR2 kroki

    czyli teoretycznie jeśli

    zmienna sr=100 to wypełnienie powinno mieć impuls = 1,0ms

    dla sr=150 impuls powinien być 1,5ms

    dla sr=200 impuls powinien być 2,0ms

    ale się niebyt chce obracać

    SERVO jest Vellman'a o symbolu ES-035 (i testowane w Bascomie działa choć tam reload musiałem ustawiać na 20us bo przy 10us też jakoś było nieruchawe)

    ale ok u mnie zachowuje się to bardzo dziwolągowato bo dopiero jeśli dam

    sr=50 - to przyjmuje pozycję 0st

    a gdy

    sr=210 - to przyjmuje pozycję 180st

    Gdzie popełniam błąd w założeniach? obliczeniach? czy w czym?

    program wygląda mniej więcej tak:


    
    
    volatile uint16_t sr;
    
    TCCR2 |= (1<<WGM21)  // CTC
    TCCR2 |= (1<<CS21)     // prescaler = 8
    OCR2 = 20;
    TIMSK |= (1<<OCIE2);   // odblokowanie przerwania CompareMatch
    
    DDRC |= (1<<PC5);
    
    sei();
    
    while(1)
    {
        sr=100;
        _delay_ms(1000);
    
        sr=150;
        _delay_ms(1000);
    
        sr=200;
        _delay_ms(1000);
    }
    
    ....
    ....
    ....
    
    ISR(TIMER2_COMP_vect)
    {
        static uint16_t i=0;
    
        if(sr<=i) PORTC &= ~(1<<PC5); else PORTC |= (1<<PC5);
    
        i++;
        if(i>999) i = 0;
    
    }


    powiem więcej, na oscylu bardzo ładnie widać jak działa ten PWM więc o co tu może chodzić ???
  • REKLAMA
  • Pomocny post
    #2 7671980
    Konto nie istnieje
    Konto nie istnieje  
  • #3 7672510
    mirekk36
    Poziom 42  
    albertb --> na tej stronce nie mogłem znaleźć żadnych danych odnośnie tego serva a tobie się udało ? nie rozumiem za bardzo o co ci chodziło w pkt.1 ???? Ten link pokazuje mi tylko stronkę vellmana informację że nie może znaleźć nic na temat tego serve ES-035

    2. Kurczę masz rację - nie wiem jak ja to wczoraj w nocy liczyłem - miałem rzeczywiście 100Hz. Ale już poprawiłem na 50Hz czyli wartość



    i nadal kicha z tym servem.

    ale ;) .... ale właśnie wpadły mi w ręce jeszcze 2 inne serva vellmana a wśród nich także ES-035 i okazuje się, że one poprawnie i ładniuśko działają. Kurczę - tyyyle godzin straciłem wczoraj szukając błędu w tym co robię a to servo zepsute co nieco.

    Jednak nie ma tego złego co by na dobre nie wyszło, dzięki temu temat prześwietliłem i poznałem do bólu ;) ..... tak więc mogę działać spokojnie dalej z programem do sterowania kilkoma serwami naraz

    dzięki za naprowadzenie z tym 100Hz
  • REKLAMA
  • Pomocny post
    #4 7672582
    Konto nie istnieje
    Poziom 1  
  • REKLAMA
  • #5 7672604
    mirekk36
    Poziom 42  
    atom1477 --> tak rozumiem, ale chodzi o to , że to jedno serwo działa mi tylko tak, że jeśli

    dam jakąś minimalną wartość np 1ms czy tam 0,5ms to wychyla się w jedną stronę na max'a czyli kąd 0st

    gdy dam wartość max no 2ms czy 2,5ms to wychyla się w drugą stronę na max czyli kąt 180st

    ale niestety, żadne ale to żadne pośrednie wartości na nie działają czyli np gdy podam 1,5ms to nie zmienia w ogóle położenia tylko jakby leciutko drga .... dopiero gdy przekroczę 2ms to nagle zmieni położenie znowu na maxa
  • REKLAMA
  • #6 7672648
    Konto nie istnieje
    Poziom 1  
  • #7 7672687
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #8 7672993
    kamyczek
    Poziom 38  
    Są serwa ,które posiadają tylko dwa położenia są to serwa do podwozia ważna jest też przerwa między impulsami powinna wynosić ok 20ms.
  • #9 7672999
    mirekk36
    Poziom 42  
    albertb --> jak rozkręciłem i rzuciłem okiem na układ i ten schemat z PDF'a to wygląda identycznie ;)

    No ale - kiszka jakaś bo ten jeden egzemplarz nie działa więc - pójdzie pod nóż do przeróbki na silniczek DC z przekładnią ;)

    Dodano po 1 [minuty]:

    kamyczek napisał:
    Są serwa ,które posiadają tylko dwa położenia są to serwa do podwozia ważna jest też przerwa między impulsami powinna wynosić ok 20ms.


    Dobrze wiedzieć, że taki są - bo poznaję tematy tych serw jak tylko można na przyszłość ;) .... ale jak pisałem mam drugi taki sam egzemplarz i on działa poprawnie jak normalne serwo - więc raczej to jedno jest coś nie teges.

    Dodano po 1 [minuty]:

    Dziękuję wszystkim za pomoc w tym temacie ;) jak widać można go zamknąć i czegoś nowego n/t serw się dowiedziałem.
REKLAMA