• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
PID do sterowania silnikiem DC?
#1
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:
[Obrazek: 03164_2b.jpg]
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.

Kod:
#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?[/font][/size][/color]
Potrzebuję utrzymać klapę w pozycji x inaczcej mówiąc nijako ją wyhamować w tej pozycji.
 
Odpowiedź
#2
Czyli chcesz zrobić własne serwo.
Może ten silnik jest za słaby? Jaki moment potrzebujesz?
Może łatwiej będzie użyć silnika krokowego. Malutki silniczek 28BYJ-48 a w palcach ciężko go przekręcić.
Oczywiście algorytmy na pid dla silnika dc są znane: http://abigmagnet.blogspot.com/2008/10/d...t-one.html
Pomagam za darmo więc szanuj mój czas.
Wklejaj tekst a nie jego zdjęcie.
Nie pisz następnego postu jak nie odpowiedziałeś na poprzedni.
Jak mądrze zadawać pytania
 
Odpowiedź
#3
Silnik krokowy, żeby utrzymać pozycję, potrzebuje napięcia na cewkach (pomijam przekładnie, ślimaki itp.)
Nie wiem jak to u Ciebie mechanicznie wygląda, ale może hamulec mechaniczny sterowany przekaźnikiem ?
 
Odpowiedź
#4
Cześć.
Dzięki za zainteresowanie.
Generalnie to chcę sterować silnikiem, który już jest i chcę zaimplementować sterowanie typu serwo. Zmiana silnika np. na krokowy nie wchodzi w grę. Przekładnia ślimakowa nie również nie wchodzi w grę. Po prostu muszę sterować mechanizmem, który już jest.
Zaimplementowanie PIDa wydaje się tu być najrozsądniejszym rozwiązaniem, zaczynam studiować playground.arduino.cc/Code/PIDLibrary spróbuje napisać kod i wstawię tutaj celem weryfikacji przez społeczność.
 
Odpowiedź
#5
Cześć. A czy to jest jakieś zadanie na zaliczenie? Bo jeśli robisz to dla siebie to najprostsze rozwiązanie jest przekładnia ślimakowa. Ma ona taka konstrukcje ze silnik bardzo łatwo może nią obracać, natomiast poruszenie jej za klapę będzie niemożliwe. Czyli sama będzie utrzymywać położenie w jakim ją zatrzymasz.
 
Odpowiedź
#6
Tutaj niestety jak i w serwach analogowych problemem jest precyzja układu , zmuszasz układ do osiągnięcia precyzji której nie jest w stanie osiągnąć lub utrzymać . Zmień położenie z wartości na zakres i problem zniknie , np. klapa ma być w położeniu 345 to niech silnik ją tam ustawi i wyjdzie z podprogramu a pomiar niech sprawdzi czy jest pomiędzy 340 a 350 jak jest tak to ok i nic nie robi . Serwa analogowe mają dokładnie taki sam problem pod obciążeniem zwłaszcza te niskiej jakości .
Ważne aby robić co się lubi albo lubić co się robi .
Arduino UNO, TINY, PRO MINI
Pomoc nagradzamy punktami reputacji Wink
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości