sortie_analogique.ino

Arduino Opta (micro PLC, STM32H747) · Archivo : sortie_analogique.ino · Lenguaje : Arduino · Uso : Générer une consigne 0-10 V sur la sortie analogique

La salida analógica de Opta entrega 0-10 V en milivoltios: este sketch genera una rampa triangular completa, ideal para probar un variador de velocidad o una válvula proporcional. La rampa está limitada y la escritura usa la API oficial de PLC.

Hardware

Una Opta PLC de STMicroelectronics (STM32H747 en tiempo real + coprocesador seguro i.MX RT1052) programada con el entorno Arduino PLC, alimentada a 24 V DIN. Actuador 0-10 V (variador, válvula) en los bornes AO0 y GND analógico.

Cableado

AO0 a la entrada de consigna del variador, 0 V analógico a la masa de consigna (a menudo aislada de la de potencia: lee la doc del variador).

Funcionamiento

AnalogOut.write(CANAL, mv) manda un convertidor digital-analógico; la rampa incremental a 20 pasos/s evita tirones de consigna en el actuador.

Ejecución

Instala el gestor de placas Arduino PLC, selecciona «Opta PLC», conecta USB/DFU y vuelca el programa. El sketch corre por el STM32H747 en tiempo real.

Variantes

Sustituir la rampa por una consigna escrita por el SCADA vía Modbus, o regular una temperatura (PID sobre 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);
}

← Volver a la ficha