Implémentation d'un PID pour réguler un module Peltier

Bonjour à tous,
dans le cadre d'un projet, je suis amené à fabriquer un refroidisseur à eau à l'aide d'un module Peltier. Pour l'instant, j'alimente mon Peltier avec un signal PWM et j'ai réalisé le montage suivant:

et le code ci-dessous :

int pin_peltier = 6;
void setup() {
  // put your setup code here, to run once:
  pinMode(pin_peltier,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  analogWrite(pin_peltier,0);
  delay(10000);
}

Et j'aimerais implémenter un PID à ce programme mais je ne sais pas du tout par où commencer.

Merci d'avance pour vos réponses et si vous voulez plus de précisions sur certains points il n'y a pas de soucis.

Quelle est la grandeur à réguler ?
Quelle est la grandeur régulante ?

il existe des bibliothèques pour ça :
https://playground.arduino.cc/Code/PIDLibrary/

La doc indiquée par @lesept dit :

Citation: From Wikipedia: "A PID controller calculates an 'error' value as the difference between a measured [Input] and a desired setpoint. The controller attempts to minimize the error by adjusting [an Output]."

et :

So, you tell the PID what to measure (the "Input",) Where you want that measurement to be (the "Setpoint",) and the variable to adjust that can make that happen (the "Output".) The PID then adjusts the output trying to make the input equal the setpoint.

Avant de parler code comment compte tu faire ?

Il te faut la mesure (t°) et la consigne à atteindre.
La sortie c'est le pwm

La formule PID est dispo sur wiki.
Très important d'utiliser le D car ça évitera la variation permanente de la sortie (principe du pompage)

Le plus difficile est de savoir quoi mettre pour les 3 XS du PID. Cat dépend de la vitesse et amplitude de la variation mais aussi des limites admissible (surchauffe,....)

on cherche à réguler la température de l'eau en modifiant le courant qui passe dans le Peltier.
pour cela nous avons un rapport cyclique

oui j'ai déjà vu cela mais je n'arrive pas à le combiner avec mon code et je ne le comprends pas vraiment

Dans ce cas, teste d'abord les exemples de la bibliothèque puis fais en un à toi tout simple avec une sortie qui reproduit une entrée. Et tu contrôles l'entrée toi même. Pas besoin d'IO juste deux variables dont la seconde cherche à reproduire la première.

D'accord, est-ce que vous pourriez me montrer un programme simple type dont vous parliez car je n'ai aucune connaissances en arduino.

Voir ici:
http://brettbeauregard.com/blog/2011/04/improving-the-beginners-pid-introduction/
par Brett Beauregard qui a développé une des librairies PID disponibles dans le gestionnaire de librairies de l'IDE

Dans le lien que je t'ai indiqué au message 3, il y a des exemples : voici le code de l'exemple 'basic'

/********************************************************
 * PID Basic Example
 * Reading analog input 0 to control analog PWM output 3
 ********************************************************/

#include <PID_v1.h>

//Define Variables we'll be connecting to
double Setpoint, Input, Output;

//Specify the links and initial tuning parameters
PID myPID(&Input, &Output, &Setpoint,2,5,1, DIRECT);

void setup()
{
  //initialize the variables we're linked to
  Input = analogRead(0);
  Setpoint = 100;

  //turn the PID on
  myPID.SetMode(AUTOMATIC);
}

void loop()
{
  Input = analogRead(0);
  myPID.Compute();
  analogWrite(3,Output);
}

Cet exemple lit une valeur analogique sur l'entrée A0 et envoie une copie sur la sortie analogique A3. Donc pour le mettre en œuvre, il faut a minima un potentiomètre sur A0 et un oscillo sur A3, ce qui n'est pas forcément simple.

Tu peux le changer en forçant des valeurs sur Input pour voir comment se comporte la variable Output. Par exemple, si on impose une variation sinusoïdale en Input : je tente un code...

#include <PID_v1.h>

//Define Variables we'll be connecting to
double Setpoint, Input, Output;
float x,y;
float dx = 0.05;

//Specify the links and initial tuning parameters
PID myPID(&Input, &Output, &Setpoint,2,5,1, DIRECT);

void setup()
{
  //initialize the variables we're linked to
  Input = 0;
  Setpoint = 100;

  //turn the PID on
  myPID.SetMode(AUTOMATIC);
}

void loop()
{
  x = x + dx;
  y = sin(x);
  Input = (int)((y+1)*127);
  myPID.Compute();
  Serial.print(Input); 
  Serial.print(","); 
  Serial.println(Output);
  delay(100);
}

Pas testé, à voir ce que ça donne.

il faut bien sûr installer la bibliothèque, tu peux le faire avec le gestionnaire de bibliothèque dans l'IDE (menu Croquis > Inclure une bibliothèque > gestionnaire de bibliothèque, ou CTRL MAJ I) et tu mets PID dans la barre de recherche. Tu choisis celle de Brett Beauregard, appelée PID.

Regarde ce qui sort sur la console série de l'IDE. Tu dois pouvoir aussi afficher des courbes en utilisant le traceur série (menu Outils)

Question :

Pas réponse.

Quel type d'information prends-tu comme entrée dans la PID et où la prends-tu ?

Sous-entendu l'AOP est-il encore nécessaire ?
Avec la PID la comparaison entre la consigne et la mesure du courant réel n'est-elle pas réalisée par le microcontrôleur ?

Schéma électrique ?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.