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

[atmega8] Sterowanie robotem - PID

grzeory 24 Paź 2008 18:27 3088 6
  • #1 5663982
    grzeory
    Poziom 10  
    Jestem w trakcie budowanie małego robota (ok 2kg),
    jednym z jego modułów jest sterownik silników
    (atmega8@8Mhz, 2 enkodery szczelinowe 800pików/obrót+ 2 silniki DC z przekładnią
    ok 200obr/min sterowane PWM, komendy przekazywane przez SPI)
    I tak po wielu próbach udało mi się napisać mniej więcej działający
    algorytm PID - robot już jeździ prosto z zadana przeze mnie
    prędkością (mniej lub bardziej:) - tzn ma odchylenie o jakieś
    5cm przy 1-2metrach)

    Teraz pokusiłem się o dorobienia funkcji obrotu o zadaną ilość stopnie,
    i tak dla dużych wartości tzn 45s,60s...itd jeszcze jakoś działa tzn
    np dla 90s błąd +-5s (zależy od prędkości - przy wyższych większy błąd)
    ale dla małych 1-10 stopni błąd jest duuuzy tzn zamiast 3 obraca się o 10s.
    Związane jest to z tym ze robot przy starcie silników bardzo szarpie i musi minąć ten ułamek sekundy zanim
    prędkość się ustabilizuje.

    I tu właśnie moje pytanie - czy to jest normalnie i przy tego typu konstrukcjach trudno jest osiągnąć
    dobre wyniki dla niedużych stopni - czy raczej wina jest po stronie algorytmu i dobrze napisany
    powinien dawać możliwość obrotu nawet o 1s - a jeśli tak to czy można taki spokojnie napisać pod
    atmege czy już lepiej kupić specjalny kontroler.

    Dziękuje za wszelkie odpowiedzi.

    Zmieniłem tytuł - regulamin p.11.2
    [zumek]
  • #2 5664759
    adamusx
    Poziom 27  
    WItam.
    To tylko kwestia dopracowania algorytmu lub doboru parametrów p, i ,d regulatora.
    A moze masz jakiś bląd w algorytmie?? Pokaz listing na forum.

    Pozdrawiam
  • #3 5664989
    bobbyAIR
    Poziom 20  
    W praktyce lepszy efekt jeśli chodzi o przejechanie danej odległości ( bo taki jest pewnie cel obracania o zadany kąt kół) jest pomiar takowej odległości i korygowanie sterowań
  • #4 5665062
    grzeory
    Poziom 10  
    adamusx:

    W algorytmie nie ma nic specjalnego:

    
    void doPID(void)
    {
    int errorl; 
    int errorr; 
    int derrorl=0; 
    int derrorr=0; 
    int cl;
    int cr;
    float KP = 4;
    float KD = 4;
    float KI = 0.1;
    int x;
    int y;
    
    errorl = setpoint - encodercountl; 
    errorr = setpoint - encodercountr;
    //if ((errorl<=2)  && (errorl>=-2)) return;
    derrorl = (errorl - preverrorl);
    derrorr = (errorr - preverrorr);
    
    cl = ((KP*errorl) + (KD*derrorl)  + (KI*Ierrorl)); 
    cr = ((KP*errorr) + (KD*derrorr) + (KI*Ierrorr));
    
    
    x=OCR1A;
    
    if (cl<=-255) x=0;
    else { if((x + cl) > 255) 
    		x = 255;
    		else x = x + cl; 
    }
    	if (x<0) x=0;
    	OCR1A=x;
    
    y=speed1;//y=OCR1B;
    if (cr<=-255) y=0;
    else {
    	if((y + cr) > 255) 
    	y = 255;
    	else y = y + cr; 
    if (y<0) y=0;
    
    speed1=y;  //OCR1B=y;
    
    encodercountl = 0;
    encodercountr = 0;
    
    preverrorl = errorl; 
    preverrorr = errorr;
    
    Ierrorl = Ierrorl + errorl;
    Ierrorr = Ierrorr + errorr;
    
    }
    



    petla glowna w mainie z grubsza wyglada tak:
    - czeka 35ms(sprawdzajac co 1ms czy robot nie powinien sie zatrzymac) i wywoluje alg PIDu


    while(1) {

    wyciąłem sprawdzanie czy nie nie ma zadnych polecen do wykonania - i jesli tak wykonanie

    unsigned int czas;
    czas=35;//czekaj 35ms
    for(;czas>0;czas--){ // 1ms
    unsigned char x=10;
    for(;x>0;x--){
    TCCR2=_BV(CS21);
    TCNT2=155;
    while(bit_is_clear(TIFR,TOV2));
    TIFR=1<<TOV2;
    }
    //tu sprawdzanie czy nie nie powinno sie zatrzymac
    //stop timer jest zmienna z przeliczana iloscia stopni na piki enkodera
    if((stop_timer>0) && (stop_timer<=e_count1)){
    stop_motor();
    stop_timer=0;
    }
    }


    if(pid_enable>0) {doPID();}

    }
    [b]bobbyAIR[\b] :

    Robot chwilowo nie spełnia żadnego zadania - chce tylko żeby miał możliwość wykonywania dowolnych manewrów wysyłanych do niego zdalnie bo za mozg robi komputer i na nim będzie biblioteka udostępniająca wszystkie możliwe funkcje a potem będzie można ją wykorzystywać do bardziej zaawansowanych zadań.


    Zastanawiam się nad zmiana kwarcu na 16Mhz bo zdaje mi sie ze uC nie wyrabia z obsługa przerwań od enkoderów i pidem, albo doPID() trwa za długa i robot obraca sie o za duży kąt.
    Właśnie może ktoś wie ile czasu procesora może zajmować powyższa doPID()?

    Może zmienić okres pomiędzy wywoływaniami doPID()?

    Będę wdzięczny za jakiekolwiek uwagi bo nie ma za dużego doświadczenia w programowaniu mikrokontrolerów a co do automatyki/robotyki to już wcale nie mam żadnego doświadczenia:/

    Pozdrawiam
  • #5 5665823
    adamusx
    Poziom 27  
    WItam.

    Generalnie algorytm cyfrowego regulatora PID powinien byc cyklicznie wywolywany ze stałym czasem odstepu, który okresla tez próbkowanie wartosci polozenia enkodera. W algorytmie PID powinien byc wiec uwzględniony czas Tp (okres probkowania) lub fp(czestotliwosc probkowania) a u Ciebie tego czasu nie widze.
    Algorytm PID powinienes wywolywac z przerwania od np timera z czestotliwoscią powiedzmy nie mniejszą niż te 100Hz, maks pewnie z 1Khz.
    SAM algorytm PID jest pewnie zajmuje sporo taktow procesorowi bo wykonuje obliczenia na liczbach zmiennoprzecinkowych. ZMiana zegara na 16MHz jest dobrym pomysłem.

    Nie jestem tylko pewnien czy jedna Mega poradzi sobie dobrze ze sterowaniem w ten sposób dwóch silników.
  • #6 5666203
    grzeory
    Poziom 10  
    adamusx:
    Dzięki za odpowiedz,
    Zmiany czasu nie uwzględniłem bo z tego co zauważyłem przy rozpisywaniu algorytmu można go włączyć do KP,KI,KD jeśli jest stały.
    Algorytm jest wywoływany cyklicznie (w mainie jest pętla główna wywołująca go co 35ms(ok 30Hz) większa częstotliwość nie ma raczej sensu
    bo przy prędkości silnika 10-200obr/min i 800pikach enkodera na obrót to przy częstotliwości kilkuset Hz byłoby dosłownie kilka pików enkodera,albo i wcale(przy 30Hz mam od 5-70pikow w zależności od prędkości).Tak samo ilość pików enkodera encodercountl(r) jest zerowana przy wyjściu z doPID i zwiększana przez przerwanie od enkodera.

    Inny problem (chyba źle dobrane KP KI KD?) to te szarpanie przy starcie(choć startowa prędkość PWM jest mała...
    może przy starcie zmienne typu preverrorl, Ierrorl powinny nie być zerowe?

    Pozdrawiam
  • #7 5666244
    adamusx
    Poziom 27  
    Dobrze napisany regulator PID ( i dobrane parametry p , i , d) sam dobiera taką wartosc wyjsca ( w tym przypadku PWM) by nie powodowac szarpniec silnika itp, takze przy osiaganiu wartoswci zadanej nie powinny nastepowac przeregulowania. Jak bede mial czas wrzuce tu sprawdzony algorytm PID.
REKLAMA