Introducción
El PLC ESP32 es un controlador industrial potente y versátil que ofrece una amplia gama de funcionalidades. En este artículo, aprenderás más sobre sus características de pin-out, midiendo cosas como la frecuencia máxima de conmutación y los tiempos de subida o bajada.
Comprender estos aspectos es crucial para interactuar con periféricos externos y desarrollar aplicaciones que requieran una temporización precisa.
Requisitos
Los sketches utilizados en este blog han sido probados con el PLC ESP32 21+, pero pueden funcionar con otro PLC industrial siempre que sus entradas/salidas utilizadas coincidan con sus funciones.
Si deseaa medir las características del PLC basado en hardware open source, también necesitarás un osciloscopio preciso capaz de leer en la escala de 100ns.
Salidas digitales
El PLC ESP32 utiliza un multiplexor de pines conocido como PCA9685A, que es un circuito integrado que utiliza la comunicación I2C. Este componente permite muchas más salidas que un ESP32 solo, pero añade cierta latencia que puede ralentizar la velocidad a la que se pueden conmutar las salidas.
TaskHandle_t Task1;
void setup() {
pinMode(Q0_0, OUTPUT);
xTaskCreate(Task1code,"Task1",10000,NULL,25,&Task1);
}
void loop() {}
void Task1code( void * parameter ) {
for(;;) {
digitalWrite(Q0_0, HIGH);
delay(10);
digitalWrite(Q0_0, LOW);
delay(10);
}
}
Usando este código sin retardo puedes obtener hasta 406,5 Hz de frecuencia de conmutación en cualquier salida digital con un ciclo de trabajo del 82,11%. Si quieres un ciclo de trabajo del 50% o menos, tendrás que subir a 10ms de retardo para una frecuencia de 50 Hz 59,4%.
El tiempo de subida de estos pines es de 0,5µs, mientras que el de bajada es de 92,4µs.
Frecuencia de saliday | Period | Pulse Width | Delay |
406.5Hz | 2.46ms | 2.02ms | 0ms |
100Hz | 10ms | 5.98ms | 5ms |
50Hz | 20ms | 11.88ms | 10ms |
Entradas digitales
Para las entradas digitales, el PLC ESP32 utiliza un multiplexor de pines conocido como MCP23008, que es un circuito integrado que utiliza la comunicación I2C. Aunque este componente tiene 8 puertos generales de E/S, se utiliza para proporcionar el PLC de entradas digitales.
TaskHandle_t Task1;
unsigned long t1, t2, t_max, t_average;
#define PIN I0_5
#define READ_TYPE digitalRead
#define N_AVERAGE 10000
void setup() {
Serial.begin(115200);
pinMode(PIN, INPUT);
xTaskCreate(Task1code, "Task1", 10000, NULL, 25, &Task1);
}
void loop() {}
void Task1code( void * parameter ) {
t_max = 0;
t_average = 0;
for (long i = 0; i < N_AVERAGE; i++) {
t1 = micros();
READ_TYPE(PIN);
t2 = micros();
t_average += (t2 - t1);
if (t_max < t2 - t1) t_max = t2 - t1;
}
Serial.print("Max time: ");
Serial.println(t_max);
Serial.print("Average time: ");
Serial.println(t_average / (float)N_AVERAGE);
vTaskDelete(NULL);
}
El tiempo de respuesta de las entradas digitales optoaisladas promedia 458 µs, con un máximo de hasta 888 µs.
Los pines de interrupción, gracias a no estar optoaislados y estar directamente conectados al ESP32, son mucho más rápidos. El tiempo promedio de lectura de una interrupción es de solo 1 µs, con un tiempo máximo de 48 µs.
En cuanto a las entradas digitales no optoaisladas, el retardo entre lecturas es de 1500µs de media, con un máximo de 2365µs.
Salidas analógicas
Las salidas analógicas reales están disponibles gracias a la conversión del PWM del PCA9685A (salidas digitales) con un convertidor PWM a CC y algunos circuitos adicionales para la adaptación de voltaje.
TaskHandle_t Task1;
void setup() {
pinMode(A0_5, OUTPUT);
xTaskCreate(Task1code,"Task1",10000,NULL,25,&Task1);
}
void loop() {}
void Task1code( void * parameter ) {
for(;;) {
analogWrite(A0_5, 4095);
delay(150);
analogWrite(A0_5, 0);
delay(150);
}
}
Como la frecuencia PWM máxima del PCA9685A es de unos 1,5 kHz, la frecuencia de conmutación de estas salidas es baja, de unos 2,26 Hz. El tiempo de subida de estos pines es de 157,6 ms, mientras que el tiempo de bajada es de 221,6 ms.
Entradas analógicas
En el PLC ESP32, las entradas analógicas se realizan con ADS1015IDGST, un chip ADC de 12 bits que se comunica a través de I2C. Tiene una frecuencia de muestreo de 3,3kHz.
TaskHandle_t Task1;
unsigned long t1, t2, t_max, t_average;
#define PIN I0_7
#define READ_TYPE analogRead
#define N_AVERAGE 10000
void setup() {
Serial.begin(115200);
pinMode(PIN, INPUT);
xTaskCreate(Task1code, "Task1", 10000, NULL, 25, &Task1);
}
void loop() {}
void Task1code( void * parameter ) {
t_max = 0;
t_average = 0;
for (long i = 0; i < N_AVERAGE; i++) {
t1 = micros();
READ_TYPE(PIN);
t2 = micros();
t_average += (t2 - t1);
if (t_max < t2 - t1) t_max = t2 - t1;
}
Serial.print("Max time: ");
Serial.println(t_max);
Serial.print("Average time: ");
Serial.println(t_average / (float)N_AVERAGE);
vTaskDelete(NULL);
}
Debido a la sobrecarga de la comunicación I2C, la frecuencia de muestreo máxima desciende a unos 400-666Hz (un tiempo de ejecución de 1500µs y un máximo de 2393µs).
Pins directos
TX1
Este pin digital se puede utilizar sólo como salida, siempre que no se esté utilizando Serial1 o RS-232. Este pin tiene una frecuencia de conmutación de 1.026MHz, con tiempos de subida y bajada de 100ns cada uno..
RX1
Este pin digital puede utilizarse sólo como entrada, siempre que no se esté utilizando Serial1 o RS-232. Este pin tiene un tiempo máximo de lectura de 48µs con 0,8µs de media.
Pins SPI (SO, SI, SCK)
Estos pines digitales pueden utilizarse como entrada o salida, siempre que no se utilicen SPI o Ethernet. Tienen tiempos de subida de 100 ns y de bajada de 100ns. Estos pines tienen un tiempo máximo de lectura de 48µs con una media de 0,8µs.
GPIO 0
Este pin funciona a 5V y puede utilizarse como entrada o salida digital. Tiene un tiempo de subida y bajada de 5µs cada uno. Este pin tiene un tiempo máximo de lectura de 888µs con una media de 485,3µs.
SCL/SDA
Estos pines digitales tienen una resistencia externa de pull-up de 2,2kOhm y funcionan a 5V. El tiempo de subida de estos pines es de 2µs, mientras que su tiempo de bajada es de 200ns.
Aunque ambos pueden actuar como entrada o salida, esto no es recomendable ya que todos los periféricos I2C que controlan entradas y salidas dejarían de funcionar correctamente.
Resumen
Entradas
Tipo de entrada | Frecuencia de muestreo - Media | Frecuencia de muestreo - Tiempo máximo de lectura |
Interrupción digital (IX.5-6) | 1.25MHz (0.8µs) | 20.833kHz (48µs) |
Digital Optoaislada (IX.0-4) | 2183.4Hz (458µs) | 1126.1Hz (888µs) |
Digital No Optoaislada (IX.7-12) | 666.67Hz (1500µs) | 422.3Hz (2365µs) |
Analógica (IX.7-12) | 666.67Hz (1500µs) | 418.06Hz (2393µs) |
RX1 | 1.25MHz (0.8µs) | 20.833kHz (48µs) |
SPI | 1.25MHz (0.8µs) | 20.833kHz (48µs) |
GPIO 0 | 2060.6Hz (485.3µs) | 1126.1Hz (888µs) |
Salidas
Tipo de salida | Frecuencia máxima estable | Frecuencia de señal - Máxima | Tiempo de subida | Tiempo de bajada |
Digital (QX.0-7) | 50Hz (59.4%) | 406.5Hz (82.11%) | 0.5µs | 92.4µs |
Analógica (AX.5-7) | 2.26Hz (50%) | 2.64Hz (37.31%) | 157.6ms | 221.6ms |
TX1 | 1.026MHz (50%) | 1.026MHz (50%) | 100ns | 100ns |
SPI | 1.026MHz (50%) | 1.026MHz (50%) | 100ns | 100ns |
GPIO 0 | 200kHz (50%) | 200kHz (50%) | 5µs | 5µs |
Conclusión
En resumen, el PLC ESP32 tiene muchas características y opciones de temporización precisas, que lo convierten en una opción sólida y flexible para diferentes usos. Es importante conocer las características de los pines, como la velocidad máxima de conmutación, los tiempos de subida y bajada, y los tiempos de lectura, para trabajar bien con dispositivos externos.
Cada una de las salidas digitales, entradas digitales, salidas analógicas y entradas analógicas del PLC tiene características de rendimiento específicas que deben tenerse en cuenta a la hora de crear y desarrollar aplicaciones.
Con la configuración adecuada y una cuidadosa atención a estos detalles, el PLC ESP32 puede proporcionar resultados consistentes y precisos para tus necesidades de automatización y control industrial.
Análisis de la respuesta temporal del pinout del PLC ESP32