Le programme ci-dessous fait bouger l'axe de gauche à droite :
/* * Contrôle d'un axe d'imprimante en utilisant les bibliothèques * Encoder et Pid * */ #include <Encoder.h> #include <PID_v1.h> const int pin_channelA = 2; // codeur optique const int pin_channelB = 3; // codeur optique const int pin_t1 = 10; // moteur, pont en H const int pin_t2 = 9; // moteur, pont en H double Setpoint, Input, Output; Encoder encoder(pin_channelA, pin_channelB); PID myPID(&Input, &Output, &Setpoint, 6.4, 0.32, 0.00064, DIRECT); unsigned long time; unsigned long last_time = 0; int cons = 1; int val = 1; void setup() { myPID.SetMode(AUTOMATIC); // demarrer Pid pinMode(pin_t1, OUTPUT); pinMode(pin_t2, OUTPUT); myPID.SetSampleTime(1); myPID.SetOutputLimits(-255, 255); Output = 0; } void loop() { Input = encoder.read() + cons; // En entrée du Pid : valeur du codeur + consigne myPID.Compute(); if (Output > 0) { // sens avant analogWrite(pin_t1, Output); digitalWrite(pin_t2, LOW); } else if (Output < 0){ // sens arrière analogWrite(pin_t2, -Output); digitalWrite(pin_t1, LOW); } else { // arrêt digitalWrite(pin_t1, LOW); digitalWrite(pin_t2, LOW); } // on incrémente ou décremente la consigne toute les 2 ms time = millis(); if (time-last_time > 2) { cons+=val; if (cons>500) val=-1; if (cons==0) val = 1; last_time = time; } }
Aucun commentaire:
Enregistrer un commentaire