sortie_analogique.ino

Arduino Opta (micro automate, STM32H747) · Fichier : sortie_analogique.ino · Langage : Arduino · Usage : Générer une consigne 0-10 V sur la sortie analogique

La sortie analogique de l'Opta délivre 0-10 V en millivolts : ce programme génère une rampe triangulaire complète, idéale pour tester un variateur de vitesse ou une vanne proportionnelle. La rampe est bornée et l'écriture passe par l'API PLC.

Matériel requis

Une Opta PLC STMicroelectronics (STM32H747 temps réel + coprocesseur sécurisé i.MX RT1052) programmée avec l'environnement Arduino PLC, alimentée en 24 V DIN. Actionneur 0-10 V (variateur, vanne) sur les bornes AO0 et GND analogique.

Câblage

AO0 vers l'entrée de consigne du variateur, 0 V analogique vers la masse de consigne (souvent isolée de la puissance : lire la doc du variateur).

Fonctionnement

AnalogOut.write(CANAL, mv) pilote un convertisseur numérique-analogique ; la rampe incrémentale à 20 pas/s évite les à-coups de consigne sur l'actionneur.

Exécution

Installez le gestionnaire de cartes Arduino PLC, sélectionnez « Opta PLC », câblez en USB/DFU puis téléversez. Le programme tourne sur le STM32H747 côté temps réel.

Variantes

Remplacer la rampe par une consigne issue d'un registre Modbus écrit par le SCADA, ou asservir une température (PID sur AI + AO).

sortie_analogique.ino

// Opta PLC : rampe de consigne 0-10 V sur AO0 (sortie analogique).
// Usage typique : consigne de variateur, vanne 0-10 V, potentiomètre numérique.
#include "PLCContainer.h"

PLCContainer PLC;

const int CANAL = OPTA_AO_0;        // sortie analogique 0 (0-10 000 mV)
const unsigned long PAS_MS = 50;    // 20 pas/s
int mv = 0;                          // valeur courante en millivolts
int sens = 100;                      // +100 mV par pas
unsigned long t0 = 0;

// Rampe douce : on limite aussi la dérivée pour ne pas brusquer l'actionneur.
void ecrire_mv(int v) {
  v = constrain(v, 0, 10000);
  PLC.AnalogOut.write(CANAL, v);     // API officielle : millivolts
}

void setup() {
  Serial.begin(115200);
  PLC.begin();
  ecrire_mv(0);
  Serial.println("Rampe 0-10 V sur AO0 (Ctrl/Reset pour arreter)");
}

void loop() {
  if (millis() - t0 < PAS_MS) return;
  t0 = millis();
  mv += sens;
  if (mv >= 10000) { mv = 10000; sens = -100; }   // sommet de rampe
  if (mv <= 0)     { mv = 0;     sens = 100; }    // pied de rampe
  ecrire_mv(mv);
  if ((mv % 1000) == 0) Serial.printf("AO0 = %d mV (%.1f V)\n", mv, mv / 1000.0f);
}

← Retour à la fiche