Cómo generar diferentes señales PWM con un PLC basado en arduino

4 de enero de 2019 por
Cómo generar diferentes señales PWM con un PLC basado en arduino
Boot & Work Corp. S.L., Support Team


Introducción

En este ejemplo se explica cómo generar un PWM con la familia M-DUINO y equipos de la familia ARDBOX equipments.

Requisitos


Ethernet or 20 I/Os PLC:      Ethernet PLC        20 I/Os PLC


Metodología

Usando nuestro equipo puedes generar un PWM en puertos digitales/analógicos. Pero la mayoría de estos puertos tienen una limitación de frecuencia (500 Hz aprox.). (PIN3 para ARDBOX) y (PIN3 y PIN2 para M-DUINO) no tienen limitaciones y pueden generar un PWM entre 100Hz (incluso menos) y 8MHz porque están asociados a un temporizador hardware, que ayuda a calcular la frecuencia y proporciona los requisitos para generar una frecuencia mayor.

PIN3 para ARDBOX puede funcionar como una salida externa para el Timer/Counter0 Output Compare B (OC0B). Y lo mismo en M-DUINO: PIN3 puede funcionar como una salida externa para el Timer/Contador3 Output Compare C (OC3C) y PIN2 puede funcionar como una salida externa para el Timer/Contador3 Output Compare B (OC3B).

Pero, ¿cómo podemos establecer la frecuencia necesaria?

El microcontrolador tiene diferentes registros para configurar las señales PWM en OCnX. En este ejemplo se muestra cómo trabajar con Clear Timer on Compare (modo CTC).


ARDBOX:

El registro TCCR0A controla el comportamiento del pin de comparación de salida (OC0A) y el modo de funcionamiento del temporizador/contador 0.

El registro TCCR0B controla el comportamiento del pin de comparación de salida (OC0A), el modo de funcionamiento del temporizador/contador 0 y el preescalador del temporizador/contador 0.

IMPORTANTE: Con ARDBOX si se cambia el preescalador de la funcionalidad por defecto (clk/64) también cambia el tiempo de las funciones de retardo.

El modo CTC compara el registro OCR0A con TCNT0 (temporizador/contador), cuando el valor es igual el uC conmuta la señal de salida OC0A para generar el PWM.

Para más información, consulta Atmel Ficha técnica de ATmega32U4 entre las páginas 94 y 110 para Ardbox (Arduino Leonardo).

A continuación se muestra el código implementado para generar diferentes frecuencias en PIN3 utilizando un Ardbox: 

void setup() {
  cli();  //stop interrupts
 
  pinMode(3, OUTPUT);
  setFrequencytimer0(2000);

  sei(); //enable interrupts
}

void loop() {
}

void setFrequencytimer0(unsigned long freq) {
  TCCR0A &= 0b00001100; // Clear TCCR0A protecting the reserved bits for uC
  TCCR0A |= 0B00000010; // CTC Mode
  TCCR0B &= 0b00110000; // Clear TCCR0B protecting the reserved bits for uC
  TCCR0B |= 0b00000011; // Select prescaler of 64 and configure Mode operation (CTC)
  OCR0A = (16*10^6) / (freq*64) - 1; //124
} 

ISR(TIMER0_COMPA_vect) //function that calls a hardware timer
{//timer0 interrupt 2kHz toggles pin 3. It enters in this function every 1/2000 sec.
   analogWrite(3, 64); //PWM 25% Duty Cycle
}

 

M-DUINO:

El registro TCCR3A controla el comportamiento del pin de comparación de salida (OC3B y OC3C) y el modo de funcionamiento del temporizador/contador 3.

El registro TCCR0B controla el comportamiento del pin de comparación de salida (OC3B y OC3C), el modo de funcionamiento del temporizador/contador 0 y el preescalador del temporizador/contador 0.

El modo CTC compara el registro OCR3A con el TCNT3 (Temporizador/Contador), cuando el valor es igual el uC conmuta la señal de salida OC3A para generar el PWM.

Para más información, consulta Atmel Ficha técnica de ATmega2560 entre las páginas 133 y 160.

A continuación se muestra el código implementado para generar diferentes frecuencias en PIN3: 

void setup() {
  pinMode(3, OUTPUT);
  setFrequencytimer3(2000); // Value is the wished frequency, in this case 2kHz
}


void loop() {
}

void setFrequencytimer3(unsigned long freq) {
  TCCR3A &= 0b00000000; //Clear TCCR3A
  TCCR3A |= 0B01010100; // Configure OC3C (PIN3) and OC3B (PIN2) as toggle mode 
  TCCR3B &= 0b00100000; // Clear TCCR3B protecting the reserved bit for uC
  TCCR3B |= 0b11001011; // Select prescaler of 64 and configure mode operation (CTC)
  OCR3A = (16000000 / (64 * freq)) - 1;
}

ISR(TIMER3_COMPA_vect) //function that calls a hardware timer
{//timer0 interrupt 2kHz toggles pin 3. It enters in this function every 1/2000 sec.
  analogWrite(3, 192); //PWM 75% Duty Cycle
}

 

Usando estos pasos hemos generado en ambos bocetos una señal PWM de 2KHz. Pero, ¿cómo podemos configurar el ciclo de trabajo deseado del PWM? 

Ahora necesitamos definir qué ciclo de trabajo queremos para esta señal de 2KHz. Esto se hace usando el comando analogWrite().  

Usando este comando le estamos diciendo a un pin PWM que queremos poner algún porcentaje de la señal en estado ON, y el resto en estado OFF. Esto se escala desde un valor entre 0 y 256, siendo 0 al 0%, y 256 al 100%. Así que para un ciclo de trabajo del 50%, la señal cuadrada necesitaría un valor de 128. El 25% es un valor de 64 y así cada unidad añade un valor porcentual del 0,4%.

Ver también

Cómo reiniciar un PLC utilizando el Escudo Ethernet

Cliente TCP en el PLC basado en Arduino

Cómo conectar un PLC basado en Arduino con un compilador OPC Scada

Cómo utilizar MAX232 con el PLC basado en Arduino


Cómo conectar un módulo bluetooth en un PLC basado en Arduino

Buscar en nuestro blog

Cómo generar diferentes señales PWM con un PLC basado en arduino
Boot & Work Corp. S.L., Support Team 4 de enero de 2019
Compartir

¿Estás buscando tu Controlador Lógico Programable ideal?

Echa un vistazo a esta comparativa de producto de varios controladores industriales basados en Arduino.

Comparamos entradas, salidas, comunicaciones y otras especificaciones con las de los equipos de otras marcas destacadas.


Industrial PLC comparison >>>