Alternar OC1A, OC1B y OC1C usando el temporizador en modo CTC

2

La mayoría de los microcontroladores AVR tienen tres pines dedicados para cada temporizador (por ejemplo, OC1A, OC1B y OC1C) que se pueden alternar automáticamente cuando el contador alcanza el llamado valor superior en los tres registros correspondientes (OCR1A, OCR1B y OCR1C). ).

No estoy seguro de cómo esos tres pines / registros dedicados operan en modo CTC para diferentes valores superiores independientes, y esto es lo que quiero lograr. Quiero cambiar OC1A, OC1B y OC1C (aunque "comparar salida", no a través de interrupciones o algo así) a diferentes intervalos (para ver los tres registros y pines dedicados).

Digamos que quiero programar el temporizador AVR para alternar los pines OC1A, OC1B y OC1C a diferentes intervalos (por ejemplo, 1 segundo, medio segundo, cuarto por segundo), pero no funciona como esperaba. Configuré el registro de coincidencia de comparación A y B y C con los tres valores diferentes, teniendo el mayor valor en A (también intenté tenerlo en C).

Solo OC1A se alterna en la frecuencia necesaria.

Para mí, parece que si solo consiguieran que OC1A supere el contador, sería posible que los tres pines funcionen con tres valores independientes diferentes. ¿Es esto correcto?

Aquí está el segmento que puse en mi Arduino Lenoardo's (basado en ATmega32U4 ) configuración. Dejé loop() vacío.

  // Initialize timer1
  noInterrupts();           // Disable all interrupts
  TCCR1A = 0;
  TCCR1B = 0;
  TCCR1C = 0;
  TCNT1  = 0;

  OCR1A = 62500;            // Compare match register 16 MHz/256/1 Hz
  OCR1B = 31250;            // Compare match register 16 MHz/256/2 Hz
  OCR1C = 15625;            // compare match register 16 MHz/256/4 Hz

  // Toggle OC1A, OC1B and OC1C => (on Lenoardo) PB5, PB6 and PB7 => digital 9, 10, 11
  // TCCR1A = 0b01010100;
  TCCR1A |= (1 << COM1C0) | (1 << COM1B0) | (1 << COM1A0);
  // TCCR1B = 0b1100
  TCCR1B |= (1 << WGM12);   // CTC mode
  TCCR1B |= (1 << CS12);    // 256 prescaler

  interrupts();             // Enable all interrupts
    
pregunta muayyad alsadi

2 respuestas

2

Un temporizador en modo normal, Fast PWM o CTC cuenta directamente desde BOTTOM hasta TOP si no se aplica influencia externa. A medida que pasa cada valor de OC emite una interrupción y / o frobs un pin, como está configurado para hacerlo. Cada valor de OC solo se cruza una vez , lo que significa que todos los OC para el mismo temporizador se ejecutan con la misma frecuencia .

Pueden configurarse para tener diferentes fases o para operar en pares diferenciales según los valores de OCRnr y los bits COMnrb, pero la única manera de hacer que utilicen diferentes frecuencias directamente es manipular sus valores de OCR cada vez que su ISR es invocado.

La forma más fácil de hacer que los pines cambien a diferentes frecuencias sería configurar el temporizador en el GCF / LCM de los diversos períodos / frecuencias deseados, mantener un recuento de los ciclos transcurridos, y luego borrar los pines cuando el número apropiado los ciclos han pasado.

    
respondido por el Ignacio Vazquez-Abrams
2

El módulo temporizador le permite generar múltiples salidas con diferentes ciclos de trabajo, pero todos tendrán la misma frecuencia fundamental. Si desea generar diferentes frecuencias, necesitará usar un método diferente. Hay dos formas principales de hacer esto. El primer método es usar tres temporizadores, cada uno de ellos operando a una frecuencia diferente. Si está tratando de generar salidas de frecuencia relativamente baja (1 kHz o menos), puede utilizar un temporizador razonable y una rutina de interrupción. Si desea generar 1 Hz, 2 Hz y 4 Hz, puede establecer una marca de temporizador de al menos 8 Hz y luego contar las marcas y activar y desactivar los pines en el momento adecuado. Con un tic temporizador de 8 Hz, generar una salida de 4 Hz requeriría alternar el pin en cada ciclo, 2 Hz sería en cada ciclo, y 1 Hz sería cada 4 ciclos. Yo sugeriría usar una frecuencia de tictac ligeramente más alta - 1 kHz es bastante razonable y le daría la posibilidad de generar un amplio rango de diferentes frecuencias.

    
respondido por el alex.forencich

Lea otras preguntas en las etiquetas