Asservissement PI(D) de la température

Bonjour,

Ma discussion fait suite à un échange précédent (Régulation de température - Français - Arduino Forum).
Je souhaite contrôler la température à l'extrémité d'une barre métallique. Le chauffage se fait grâce à une résistance alimentée avec ~40 W.
Avec les recommandations données dans la précédente discussion, j'alimente la résistance à l'aide d'un transistor branchée sur la broche PWM.
je cherche désormais à asservir à l'aide d'un PI le transistor pour réguler au mieux la température mais je ne vois pas le paramètre le plus pertinent à utiliser comme commande.

Pourriez-vous m'aider à la mettre en oeuvre ?
Merci

grandeur de commande : le rapport cyclique du signal pilotant le transistor

Bonjour,

J'ai testé le code suivant (j'ai remodelé l'exemple basic) :

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



//chargement des librairires nécessaires
#include <OneWire.h>
#include <DallasTemperature.h>
#include <PID_v2.h>

//définition des constantes du programme
const unsigned long BAUD = 250000; //débit de la liaison série
#define ONE_WIRE_BUS  7  //broche de connexion des capteurs température

#define TRANSISTOR_PIN 3

//déclaration de l'objet one wire qui permet de gérer le bus one wire
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

// Specify the links and initial tuning parameters
double Kp = 2, Ki = 5, Kd = 1;
PID_v2 myPID(Kp, Ki, Kd, PID::Direct);

void setup()
{
  Serial.begin(BAUD);
  pinMode(TRANSISTOR_PIN, OUTPUT);
  sensors.begin();

  myPID.Start(mesureTemperature(),  // input
              0,                      // current output
              30);                   // setpoint
}

void loop() {
  const double input = mesureTemperature();
  const double output = myPID.Run(input);
  analogWrite(TRANSISTOR_PIN, output);
}

double mesureTemperature()
{
  sensors.requestTemperatures();
  double temperature = sensors.getTempCByIndex(0);
  Serial.println(temperature);
  return temperature;

}

Je pense avoir mis une température de consigne de 30 (setpoint ?) mais cela ne fonctionne pas, la résistance chauffe tout le temps

Peux-tu préciser où tu as trouvé ta bibliothèque PID_v2 : impossible de mettre la main dessus. Celle-ci n'a pas de méthode 'run'... ?

Affiche la valeur de input dans la loop, afin de voir ce que renvoie la mesure :

void loop() {
  double input = mesureTemperature();
  Serial.println(input);
  double output = myPID.Run(input);
  analogWrite(TRANSISTOR_PIN, output);
}

(j'ai ôté les const, ne comprenant pas pourquoi ils sont là)

Pour choisir les paramètres du PID, il y a cette bibliothèque.

Bonsoir,

J'ai pris celle-là.
Je vais voir ce que donne le input et te tiens au courant

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