Frecuencia Arduino Nano PWM

He estado usando un Arduino Nano como controlador PWM para un elemento calefactor.

Actualmente estoy usando D11 (PB3). Podría cambiar, aunque todos los pines con PWM están en uso, y sería necesario volver a escribir y volver a cablear.

Esto produce una señal a ~ 490Hz, pero me gustaría experimentar cambiando esto a una frecuencia más alta.

Creo que es posible variar la frecuencia cambiando el divisor de su predeterminado 64.

Mi boceto usa Usos http://playground.arduino.cc/Main/SevenSegmentLibrary y llama a millis (): ¿cambiar el divisor de PWM afectará a alguno de estos?

NOTA He leído la setPwmFrequency documentación, pero encontrar «interrumpe el funcionamiento normal» es inútil; en realidad, busco una explicación del efecto concreto. Solo uso millis() para cronometrar las pulsaciones de botones y hacer parpadear un LED, que no son críticos en cuanto al tiempo

Tenga en cuenta que cambiar la frecuencia PWM cambia Los temporizadores de Atmega e interrumpen el funcionamiento normal de muchas funciones que dependen del tiempo (delay (), millis (), biblioteca de servos).

He estado haciendo algunos estudios adicionales. http://playground.arduino.cc/Code/PwmFrequency indica Los cambios en los pines 3, 5, 6 u 11 pueden causar el retraso () y milis ( ) funciones para dejar de funcionar.

Otras referencias dicen 3, 11 use timer 2 así que hacer afectan a millis() o no a , ya que otras referencias afirman que timer 0 se utiliza para estos.

Comentarios

  • Sí y no, dependiendo del temporizador pwm utilizado.

Responder

No sé de dónde proviene esta información errónea … La respuesta es no , reconfigurar el temporizador 2 no afectan millis() ni delay(), ya que estas funciones dependen del Timer 0. AFAIK, el núcleo Arduino no usa el Timer 2 en absoluto. Pero tenga en cuenta que puede haber otras bibliotecas de Arduino o de terceros que se basan en Timer 2.

Puede ver aquí el código fuente de millis() y delay() .

Como MITU RAJ indica correctamente en su respuesta, la señal PWM en el pin 11 es proporcionada por Temporizador 2, para que pueda usarlo de forma segura.

Comentarios

  • La información errónea proviene de playground .arduino.cc / Code / PwmFrequency . Estoy seguro de que no soy el único usuario que ha sido engañado. La otra respuesta acaba de publicar un extracto de la documentación engañosa.

Respuesta

La respuesta es NO , cambiar el divisor PWM para el pin 11 no afectará la función millis() (ni delay()).


Explicación:
El Arduino Nano usa el microcontrolador ATMega328P, al igual que el Arduino Uno .

El PWM de la clavija 11 está controlado por el temporizador 2. De forma predeterminada, el temporizador 2 tiene una preescala de 64 (es decir, el ajuste 0x04). La frecuencia base del temporizador 2 es 31372,55 Hz, lo que da como resultado una frecuencia de 490,2 Hz (es decir. 31372.55 / 64 = 490.1961).

Por otro lado, el temporizador de microsegundos (es decir, el utilizado por millis(), micros(), delay() y delayMicroseconds()) está controlado por el temporizador 0.

Entonces cambiar el preescalador del Timer 2 no afectará a millis().

Sin embargo, cambiará la frecuencia PWM del Pin 3.


De vuelta a su pregunta:
Las posibles frecuencias PWM del Pin 11 (superiores a 488 Hz) son:

31373/32 = 980,4 Hz
31373/8 = 3921,6 Hz
31373/1 = 31373 Hz

Donde 32, 8, 1 son el preescalador.
Lo que equivale a un valor de configuración de 0x03, 0x02 & 0x01 respectivamente.

Agregue esta línea de código:

TCCR2B = TCCR2B & 0b11111000 | setting; 

Donde setting es el valor de la configuración para el prescaler respectivo.

============================================ || Frequency [Hz] || Prescaler || Setting || ============================================ || 31373.55 || 1 || 0x01 || || 3921.57 || 8 || 0x02 || || 980.39 || 32 || 0x03 || || 490.20 || 64 || 0x04 || || 245.10 || 128 || 0x05 || || 122.55 || 256 || 0x06 || || 30.64 || 1024 || 0x07 || ============================================ 

Código fuente : https://github.com/arduino/ArduinoCore-avr/blob/master/cores/arduino/wiring.c

Comentarios

  • Simplemente quisquilloso, pero … la frecuencia base del temporizador ' s en el modo PWM de fase correcta es F_CPU / 510 (31373 Hz), no F_CPU / 512: se necesitan 255 ciclos para contar F rom 0 a 255, luego 255 más para volver a contar hasta cero. C.f. la ecuación para la frecuencia PWM en la hoja de datos.
  • @EdgarBonet Buen punto. La respuesta ahora ha sido corregida.
  • ¿Sería posible bajar un paso más lento a 15,31 HZ?

Respuesta

Depende del pin que usaste para el PWM.

Las especificaciones de Arduino UNO / NANO dicen lo siguiente:

La frecuencia base para los pines 3, 9, 10 y 11 es 31250 Hz.

La frecuencia base para los pines 5 y 6 es 62500 Hz.

Los divisores disponibles en los pines 5, 6, 9 y 10 son: 1, 8, 64, 256 y 1024.

Los divisores disponibles en los pines 3 y 11 son: 1, 8, 32, 64, 128, 256 y 1024.

Las frecuencias PWM están unidas en pares de pines. Si se cambia uno en un par, el otro también se cambia para que coincida.

Los pines 5 y 6 se emparejan en el temporizador0.

Los pines 9 y 10 se emparejan en el temporizador1.

Los pines 3 y 11 están emparejados en el temporizador2.

Los cambios en los pines 3, 5, 6 u 11 pueden causar el retraso () y millis () para dejar de funcionar. Otras funciones relacionadas con el tiempo también pueden verse afectadas.

Comentarios

  • Ya que ' citando las especificaciones, ¿sería ' agradable si también pudiera vincularlas? 🙂

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *