Calcul d’un correcteur PI en programmation C
Calculez rapidement les termes proportionnel et intégral d’un correcteur PI discret, visualisez l’impact de chaque composant et obtenez une base directe pour votre implémentation en langage C sur microcontrôleur, automate ou système embarqué.
Calculatrice PI discrète
Guide expert: calcul d’un correcteur PI en programmation C
Le calcul d’un correcteur PI en programmation C constitue l’une des tâches les plus fréquentes en automatisme industriel, en robotique, en électronique de puissance et dans les systèmes embarqués. Un correcteur PI, pour proportionnel intégral, cherche à réduire l’erreur entre une consigne et une mesure. Le terme proportionnel réagit immédiatement à l’écart, tandis que le terme intégral accumule les erreurs dans le temps afin d’éliminer l’erreur statique résiduelle. Quand on le programme en C, l’objectif n’est pas seulement de trouver une formule correcte, mais aussi de garantir une exécution stable, rapide et prévisible sur une boucle temps réel.
Dans une implantation numérique, on ne travaille pas avec un temps continu parfait. On mesure périodiquement la grandeur du procédé, puis on applique le correcteur toutes les Ts secondes. C’est précisément cette discrétisation qui transforme l’équation théorique du PI en une forme calculable sur microcontrôleur ou automate. La qualité du résultat dépend alors de plusieurs facteurs: le choix de Kp, le choix de Ki, le pas d’échantillonnage Ts, les limites de sortie, la saturation de l’actionneur et la protection anti windup de l’intégrateur.
Formule de base d’un PI discret
La forme la plus utilisée en programmation C pour un PI discret est la forme positionnelle:
- Erreur: e(k) = consigne – mesure
- Terme proportionnel: P(k) = Kp × e(k)
- Terme intégral: I(k) = I(k-1) + Ki × e(k) × Ts
- Sortie brute: u(k) = P(k) + I(k)
- Sortie finale: u(k) limitée entre une borne min et une borne max
Cette structure est simple, robuste et bien adaptée à la plupart des applications industrielles. En langage C, elle s’intègre généralement dans une fonction appelée à période fixe. Le point essentiel est que Ts soit réellement constant. Si votre boucle n’est pas cadencée correctement, les performances calculées en théorie s’écartent fortement du comportement réel.
Pourquoi le correcteur PI est si utilisé
Le PI offre un excellent compromis entre simplicité et efficacité. Par rapport à un correcteur P seul, il supprime généralement l’erreur permanente. Par rapport à un PID complet, il reste plus facile à régler, moins sensible au bruit de mesure et moins coûteux en calcul. C’est pourquoi on le retrouve dans la régulation de température, la commande de vitesse moteur, la régulation de débit, la tension de sortie d’une alimentation et de nombreuses boucles de procédé.
- Le terme P accélère la réaction du système.
- Le terme I corrige l’écart résiduel.
- La discrétisation en C permet une exécution sur du matériel léger.
- La mise en place est rapide dans les systèmes embarqués.
Exemple de calcul concret
Prenons une consigne de 100, une mesure de 92, un Kp de 1,8, un Ki de 0,6, un Ts de 0,1 seconde et une mémoire intégrale précédente de 10. L’erreur vaut 8. Le terme P vaut 14,4. Le nouvel intégrateur vaut 10 + 0,6 × 8 × 0,1 = 10,48. La sortie brute vaut donc 24,88. Si vos limites sont entre 0 et 100, la sortie finale reste 24,88. Cet exemple, très proche de celui de la calculatrice ci dessus, montre bien que l’intégrateur évolue à chaque période et doit être stocké dans une variable persistante.
| Scénario | Kp | Ki | Ts (s) | Erreur | P calculé | Variation de I par cycle |
|---|---|---|---|---|---|---|
| Boucle température lente | 2,0 | 0,10 | 1,00 | 5 | 10,0 | 0,5 |
| Commande moteur DC | 1,5 | 2,50 | 0,01 | 5 | 7,5 | 0,125 |
| Régulation tension | 0,8 | 15,0 | 0,001 | 5 | 4,0 | 0,075 |
| Procédé débit | 1,2 | 0,40 | 0,10 | 5 | 6,0 | 0,2 |
Les valeurs du tableau sont des résultats numériques cohérents avec la formule discrète. Elles montrent une idée fondamentale: plus Ts est faible, plus la variation intégrale par cycle diminue, mais plus le nombre de cycles par seconde augmente. En pratique, vous ne choisissez donc pas seulement Ki; vous choisissez en réalité le couple Ki et Ts.
Programmation C: structure typique
En C, le plus propre est d’encapsuler le PI dans une structure contenant les gains, les limites et la mémoire intégrale. Cela rend votre code plus lisible, facilite les tests unitaires et permet d’instancier plusieurs correcteurs sans confusion. Une structure minimale contiendra souvent:
- float kp;
- float ki;
- float ts;
- float integral;
- float out_min;
- float out_max;
Le schéma d’appel est généralement le suivant: lecture capteur, calcul de l’erreur, mise à jour du PI, saturation de la sortie, écriture vers l’actionneur. Sur microcontrôleur, cette séquence se place dans une interruption périodique ou dans une boucle principale synchronisée par timer. Cette rigueur temporelle est au moins aussi importante que la formule elle même.
Anti windup: une étape indispensable
Le principal piège d’un correcteur PI programmé en C est le windup intégral. Ce phénomène apparaît quand la sortie est saturée pendant un certain temps, tandis que l’intégrateur continue d’accumuler l’erreur. Résultat: lorsque le système revient dans une zone normale, la correction reste trop forte et provoque dépassement, oscillations ou lenteur excessive.
Pour éviter ce problème, plusieurs stratégies existent:
- Bloquer l’intégrateur si la sortie est saturée dans le même sens que l’erreur.
- Limiter directement la valeur de l’intégrateur.
- Utiliser une rétroaction anti windup plus élaborée.
Pour une grande majorité de projets embarqués, une simple limitation de l’intégrateur suffit déjà à améliorer fortement la stabilité pratique. C’est un excellent compromis entre performance et simplicité d’implémentation.
Impact du temps d’échantillonnage
Le temps d’échantillonnage est trop souvent choisi de manière approximative, alors qu’il conditionne le comportement du contrôleur. Un Ts trop grand rend la boucle lente et peut introduire un retard numérique important. Un Ts trop petit augmente le coût CPU, le bruit et la sensibilité aux imprécisions de mesure. En pratique, on cherche généralement une fréquence d’échantillonnage nettement supérieure à la dynamique dominante du procédé.
| Application | Période typique du procédé | Ts souvent utilisé | Fréquence de calcul | Commentaire pratique |
|---|---|---|---|---|
| Température four | 10 s à 300 s | 0,5 s à 2 s | 0,5 Hz à 2 Hz | Procédé lent, filtre naturel élevé |
| Vitesse moteur industriel | 0,05 s à 0,5 s | 1 ms à 10 ms | 100 Hz à 1000 Hz | Réponse rapide demandée |
| Régulation tension convertisseur | 100 µs à 5 ms | 50 µs à 1 ms | 1 kHz à 20 kHz | Forte contrainte temps réel |
| Niveau cuve | 5 s à 60 s | 0,2 s à 1 s | 1 Hz à 5 Hz | Très tolérant au bruit rapide |
Ces plages sont des ordres de grandeur couramment rencontrés dans l’industrie et en systèmes embarqués. Elles illustrent un fait très important pour le calcul d’un correcteur PI en programmation C: la même formule peut être excellente ou mauvaise selon le choix du pas d’échantillonnage.
Forme positionnelle contre forme incrémentale
La forme positionnelle calcule directement la commande absolue. Elle est facile à lire et à déboguer. La forme incrémentale, elle, calcule une variation de commande à partir des erreurs successives. Elle peut être intéressante quand on souhaite manipuler explicitement les incréments de sortie ou quand on travaille avec certains actionneurs numériques. Dans beaucoup de projets, la forme positionnelle reste cependant la plus intuitive pour débuter et pour maintenir un code fiable.
Bonnes pratiques de codage en C
- Utiliser des types cohérents, souvent float ou double selon la cible matérielle.
- Stocker la mémoire intégrale dans une variable persistante.
- Séparer acquisition, calcul et commande dans des fonctions claires.
- Ajouter des limites de sécurité sur la sortie et sur l’intégrateur.
- Consigner les valeurs de consigne, mesure, erreur et sortie pour le diagnostic.
- Tester le correcteur avec un banc de simulation avant déploiement réel.
Réglage des gains Kp et Ki
Le réglage d’un PI peut se faire de plusieurs façons: empirique, par identification du procédé, via des méthodes type Ziegler Nichols ou à partir d’un modèle. Dans les applications embarquées, on commence souvent avec un Kp modéré et un Ki faible, puis on augmente progressivement en observant la vitesse de réponse, le dépassement et la robustesse au bruit. Une bonne pratique consiste à régler d’abord le proportionnel, puis à ajouter l’intégral pour supprimer l’erreur permanente sans rendre la boucle oscillante.
Si votre système est très bruité, un Kp trop élevé fera vibrer la sortie. Si votre intégrateur est trop agressif, vous obtiendrez un dépassement important et parfois un comportement instable. Le meilleur réglage n’est pas seulement celui qui atteint vite la consigne, mais celui qui reste fiable sur toutes les conditions nominales d’utilisation.
Ressources techniques fiables
Pour approfondir la théorie du contrôle, la discrétisation et la mise en oeuvre pratique, consultez ces ressources académiques et institutionnelles:
- University of Michigan Control Tutorials for MATLAB and Simulink
- MIT OpenCourseWare, cours de contrôle et systèmes dynamiques
- NIST, référence institutionnelle sur les mesures, métrologie et systèmes
Exemple de logique C à adapter
Une routine classique suit cette logique: lire la mesure, calculer l’erreur, mettre à jour le terme intégral, calculer la sortie, saturer, mémoriser et envoyer la commande. Si vous utilisez un DSP, un ARM Cortex M ou un automate compact, le principe reste identique. Seules changent la précision numérique, la vitesse d’exécution et l’interface matérielle.
En production, on ajoute souvent des protections supplémentaires: validation de la mesure, détection de capteur hors plage, mode manuel, rampe de consigne, journalisation des défauts et stratégies de repli. Autrement dit, le calcul du PI n’est que le coeur du système. Sa réussite dépend de tout l’environnement logiciel qui l’entoure.
Conclusion
Le calcul d’un correcteur PI en programmation C repose sur une base mathématique simple, mais sa réussite opérationnelle demande une vraie rigueur d’implémentation. La formule discrète doit être cohérente avec le temps d’échantillonnage, les gains doivent être adaptés au procédé, la sortie doit être limitée et l’intégrateur doit être protégé contre le windup. Avec ces précautions, vous obtenez un contrôleur fiable, léger et performant, parfaitement adapté aux besoins des systèmes temps réel. Utilisez la calculatrice de cette page pour valider rapidement vos paramètres et générer une base de développement exploitable dans votre propre code C.