A continuación escribiré el código de un programa ejemplo donde se aplica una forma sencilla de generar ondas cuadradas. Para este ejemplo se han utlizado las interrupciones por CTC (Clear Timer on Compare) del Timer0, Timer1 y Timer 2. Con el Timer 0 generamos una frecuencia de 1kHz, con el Timer1 generamos 0.5kHz y con el Timer3 4kHz.
El programa principal o loop no hace nada, todas las acciones estan realizadas dentro de las respectivas interrupciones. Cada interrupción da vuelta 1 pin en el cual se encuentra conectado un LED.
Timer0 genera una frecuencia 2kHz/2 = 1kHz
= (16*10^6) / (2000*64) – 1 (tiene que ser <256)
Timer1 genera una frecuencia 1Hz/2 = 0.5kHz
= (16*10^6) / (1*1024) - 1 (tiene que ser <65536)
Timer2 genera una frecuencia 8kHz/2 = 4kHz
= (16*10^6) / (8000*8) - 1 (tiene que ser <256)
// Este ejemplo utiliza las 3 interrupciones de Timer. // Timer0 va a interrumpir a 2kHz // Timer1 va a interrumpir a 1Hz // Timer2 va a interrumpir a 8kHz #include < stdio.h > #include < avr/io.h > #include < avr/interrupt.h > #define F_CPU 16000000UL #include < util/delay.h > #define LEDA 0b00001000 // PTB3 #define LEDP 0b00100000 // PTB5 #define LEDV 0b00100000 // PTD5 #define LEDR 0b01000000 // PTD6 int main(void){ DDRD |= (LEDV | LEDR); DDRB |= (LEDP | LEDA); PORTD &= ~(LEDV | LEDR); // Para apagar las 3 salidas PORTB &= ~(LEDP | LEDA); // Para apagar las 3 salidas cli(); // Stop interrupts // Setea interrupciones de Timer0 para 2kHz TCCR0A = 0; TCCR0B = 0; TCNT0 = 0; OCR0A = 124; // = (16*10^6) / (2000*64) – 1 (tiene que ser <256) TCCR0A |= (1 << WGM01); // Coloca modo CTC TCCR0B |= (1 << CS11) | (1 << CS10); // Setea el bit CS10 para prescaler 64 TIMSK0 |= (1 << OCIE0A); // Habilita interrupción de CTC // Setea interrupciones de Timer1 para 1Hz TCCR1A = 0; TCCR1B = 0; TCNT1 = 0; OCR1A = 15624; // = (16*10^6) / (1*1024) - 1 (tiene que ser <65536) TCCR1B |= (1 << WGM12); // Coloca modo CTC TCCR1B |= (1 << CS12) | (1 << CS10); // Setea el bit CS10 para prescaler 1024 TIMSK1 |= (1 << OCIE1A); // enable timer compare interrupt // Setea interrupciones de Timer2 para 8kHz TCCR2A = 0; TCCR2B = 0; TCNT2 = 0; OCR2A = 249; // = (16*10^6) / (8000*8) - 1 (tiene que ser <256) TCCR2A |= (1 << WGM21); // Coloca modo CTC TCCR2B |= (1 << CS11); // Setea el bit CS11 para prescaler 8 TIMSK2 |= (1 << OCIE2A); // Habilita interrupción de CTC sei(); // Permite las interrupciones for(;;){ } } //================================================= // Genera una frecuencia 2kHz/2 = 1kHz ISR(TIMER0_COMPA_vect){ PORTD ^= LEDV; } //================================================= // Genera una frecuencia 1Hz/2 = 0.5kHz ISR(TIMER1_COMPA_vect){ PORTD ^= LEDR; } //================================================= // Genera una frecuencia 8kHz/2 = 4kHz ISR(TIMER2_COMPA_vect){ PORTB ^= LEDA; }
Hola flicitaciones por vuestra web.
Estoy buscando la manera de controlar dos transistores T1 y T2 desde un pulso PWM generado por un arduino.
Quiero usar el tiemer 1 de 16bits, usar el pin 9 para el T1 y el pin 10 para el T2.
Cuando el PWM esté alto activará el T1 y cuando el PWM esté bajo que active el T2
La frecuencia de los dos pins debe ser la misma, el pin 9 que contola el T1 es el principal.
Los pulsos del pin 10 deben estar invertidos respecto a los que salen por el pin 9.
No se si me he explicado, podeis ayudarme?
un millon de gracias por vuestra esperada respuesta.