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.
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.
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.
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.