PID Moteur

Bonjour à tous,

Je suis sur un projet ou je rembobine un file sur une bobine qui viens d'une bobine rempli de fil. Je monitor la tension de fil. Lorsque la tension réel du fil n'est pas égal à la consigne de tension que je lui est envoyé, je lance un moteur à courant continue qui vient débobiner le fil est qui permet d'augmenter ou de diminuer la tension du fil.
C'est un peu compliqué à expliquer ...

Bon j'utilise la librairie PID pour avoir la vitesse que je dois donner à mon moteur en fonction de la consigne tension fil et de la tension réel fil.

J'ai crée une fonction qui me permet de générer sur Arduino la tension du fil. La tension se déplace comme une sinusoïdale elle passe de 98 à 102 puis redescend a 98.

La logique est donc la suivante : lorsque la tension diminue, je diminue la vitesse de moteur et inversement quand la tension augmente, j'augmente la vitesse du moteur.

mon code :

include <PID_v1.h>

float x;
double poids, vitesseMoteur;
int consigPoids = 5;
double Kp = 0.8, Ki =11, Kd = 0.1;

double Setpoint, Input, Output;

PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, REVERSE);


void setup() {
  // put your setup code here, to run once:
  Setpoint = 100;
  Input = 0;
  Setpoint = 0;
  x = 0;
  
  //active le PID
  myPID.SetSampleTime(300); 
  myPID.SetMode(AUTOMATIC);
  myPID.SetOutputLimits(0, 255);  // plage de valeur de l'output 

  Serial.begin(115200);
}

void loop() {
  // put your main code here, to run repeatedly:
  
  Setpoint = 100;
  
  x = x + 0.01;
  poids = 100 + 2 * sin(x);
  Serial.print("Poids actuel = ");
  Serial.println(poids);
  delay(100);

  Input = poids;
  myPID.Compute();
  vitesseMoteur = Output;
  //analogWrite(vitesseMoteur, Output);
  Serial.print("--------------> vitesse Moteur = ");
  Serial.println(vitesseMoteur);
}

Je suis face au problème suivant : j'ai bien une augmentation de la vitesse lorsque la tension augmente et j'ai bien une diminution lorsque la tension diminue, mais entre 102 et 101 et entre 101 et 100 il reste bloquer à 255 alors qu'il devrait diminuer la vitesse.

Je vous conseille de lancer le programme pour comprendre.

j'ai lu en diagonale mais il me semble que grosso modo vous dites au PID que quelque soit ce qu'il propose de faire sur sa sortie ça n'a aucune influence sur l'input... dans la vraie vie le poids va diminuer si vous accélérez, pas continuer à augmenter...

Non en réalité le poids va diminuer si j’accélère car le fil va se débobiner plus vite et donc va se relâcher et le fil sera donc moins tendu.

mais c'est pas ce que fait votre code...à mon avis vous overshootez à cause de ce que vous faites subir au poids

Oui mais j'aimerais asservir la vitesse de l'enrouleur en fonction de la force/poids du fil et je ne sais pas comment faire c'est pour cela que j'essaie d'utiliser la librairie PID ...

Oui mais vous ne pouvez pas faire une simulation de pilotage où la vitesse que vous calculez au final n’influe pas sur le poids puisque vous le modifiez vous même à la main. le PID en perd son latin et ne comprend plus ce qu’il faut faire

Si vous voulez voir ce qu’il se passe il faudrait modéliser réellement l’évolution Du poids en fonction de la vitesse et pas le régler arbitrairement... le plus simple est de monter le système et de travailler en grandeur nature