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%.
Cómo generar diferentes señales PWM con un PLC basado en arduino