🛠 Watchdog et conception faille-sûre en environnement industriel

Arduino Opta (micro automate, STM32H747) · avance · Schéma : IMG-opta-plc-avance-2-opta-watchdog-surete.svg — chronogramme d'un watchdog matériel redémarrant l'Opta après un blocage du sketch avec bascule des relais en état sûr contact ouvert

Objectifs

Rendre un programme Opta robuste en production : un watchdog matériel (IWDG du STM32H747) redémarre la carte si la boucle de contrôle se fige, et la conception faille-sûre garantit qu'au redémarrage les relais reprennent un état sûr (contacts ouverts). Vous couvrirez aussi les contraintes d'environnement : −20…+50 °C, IP20, pollution degré 2, MTBF 766 205 h.

Matériel

Code complet

// opta_watchdog.ino — IWDG STM32H7 : reset si la boucle gelle
// Registres IWDG (RM0399) ; API Arduino standardisee non exposee sur ce core.
#define IWDG_KR  (*(volatile uint32_t*)0x58004800)
#define IWDG_PR  (*(volatile uint32_t*)0x58004804)
#define IWDG_RLR (*(volatile uint32_t*)0x58004808)
#define IWDG_SR  (*(volatile uint32_t*)0x5800480C)
#define IWDG_KEY_RELOAD 0xAAAAu
#define IWDG_KEY_ENABLE 0xCCCCu
#define IWDG_KEY_ACCESS 0x5555u

void watchdog_init(uint32_t delai_ms) {
  IWDG_PR  = 4;                      // diviseur /64 => 32 kHz/64 = 500 Hz
  IWDG_RLR = delai_ms / 2;           // rechargement en ms (500 Hz -> 2 ms/unité)
  while (IWDG_SR);
  IWDG_KR = IWDG_KEY_ENABLE;         // démarre le watchdog : ne s'arrete plus
}

void watchdog_refresh { IWDG_KR = IWDG_KEY_RELOAD; }

void setup {
  Serial.begin(9600);
  pinMode(RELAY1, OUTPUT);
  digitalWrite(RELAY1, LOW); // état sur : contact ouvert au démarrage
  watchdog_init(2000);       // reset si inactif > 2 s
}

void loop {
  digitalWrite(RELAY1, HIGH);
  delay(500);
  digitalWrite(RELAY1, LOW);
  watchdog_refresh;        // « je suis vivant »
  // Test : remplacez refresh par delay(5000) -> la carte redemarre.
}

Vérification attendue

En fonctionnement normal, le cycle tourne indéfiniment. En commentant watchdog_refresh (ou en bouclant à l'infini), la carte se réinitialise sous ~2 s et les relais retombent ouverts. >

Erreurs fréquentes

Autres tutoriels pour cette carte

Exemples de code pour cette carte

← Retour à la fiche 🛠 Tous les tutoriels