PID do sterowania silnikiem DC?

0 głosów
86 wizyt
pytanie zadane 14 stycznia 2017 przez użytkownika krzakx (7)
edycja 14 stycznia 2017 przez użytkownika krzakx

Cześć.

Mam do zrealizowania sterowanie, które utrzyma mi dźwignię klapy w zadanej pozycji x. Klapa ta poruszana jest poprzez cięgno (metalowy pręt), które z kolei na połączone jest ramieniem do silnika DC 12-14 [V]. 

Do tego celu wykorzystałem mostek H na L298, o taki:

Element wykonawczy/aktuator to zintegrowany silnik DC z hallotronowym czujnikiem położenia, który wystawia 0-5V w funkcji położenia, poniżej w kodzie widać że szczytuję tę pozycję na wejściu A3.

#define PWM_ENA 3
#define PWM_ENB 11
#define MOTOR_IN1 2
#define MOTOR_IN2 4
#define MOTOR_IN4 7
#define MOTOR_IN3 8
 
void setup() {
    //TCCR2B = TCCR2B & B11111000 | B00000010;    // set timer 2 divisor to     8 for PWM frequency of  3921.16 Hz
    TCCR2B = TCCR2B & B11111000 | B00000011;    // set timer 2 divisor to    32 for PWM frequency of   980.39 Hz
    Serial.begin(9600);
    //Serial.println("Pomiar sygnalu polozenia");
    analogWrite(3,0);
    analogWrite(11,0);
    //pinMode(4,OUTPUT);
    //pinMode(2,OUTPUT);
    pinMode(12,OUTPUT);
    pinMode(13,OUTPUT);
    analogRead(A0);
    analogRead(A1);
    analogRead(A2);
    analogRead(A3);
    analogRead(A4);
    analogRead(A5);
    analogWrite(PWM_ENA,0);
    analogWrite(PWM_ENB,0);
    int pozycja_zadana = 0;
}

void loop() {
    int pozycja_zadana = analogRead(A3);
    //pozycja_zadana = constrain(pozycja_zadana, 0, 1000);
    int pozycja_aktualna1 = analogRead(A4);

    if (pozycja_aktualna1 >= (pozycja_zadana-16) && pozycja_aktualna1 < (pozycja_zadana+16)){
        digitalWrite(MOTOR_IN1, LOW);
        digitalWrite(MOTOR_IN2, LOW);
        analogWrite(PWM_ENA,0);
    }
    else
    {
        int roznica = pozycja_aktualna1 - pozycja_zadana;
        int predkosc = roznica>=0 ? roznica : roznica*-1;
        // predkosc = 50;// predkosc/4;
        predkosc = predkosc>128?predkosc:128;
        predkosc = predkosc<250?predkosc:250;
        //Serial.println(pozycja_aktualna1);
        if (roznica > 0) {
            analogWrite(PWM_ENA,predkosc);
            digitalWrite(MOTOR_IN1, LOW);
            digitalWrite(MOTOR_IN2, HIGH);
        }else {
            analogWrite(PWM_ENA,predkosc);
            digitalWrite(MOTOR_IN2, LOW);
            digitalWrite(MOTOR_IN1, HIGH);
        }
      Serial.println(predkosc);  
    }

Niestety, gdy klapa zostaje obciążona siłą występują problemy z drganiami w zadanej pozycji x, zastanawiam się jak to rozwiązać, może zaimplementować kontroler PID a może macie jakiś pomysł na poprawkę mojego kodu?

1 odpowiedź

0 głosów
odpowiedź 6 sierpnia 2017 przez użytkownika tomekatomek123456789 (558)
Polecałbym przesiąść się na uC dla AVR (Arduino da się w tym programować dzięki mkAvrCalculator wybierająć programator arduino) bo funkcje w arduino mają problemy przy małych obciążeniach(głownie sygnał z analogRead();)
...