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? 🙂