¿Cuáles son las implicaciones de ejecutar un ATmega328P a 8 MHz y 3.3 V con el sistema Arduino?


8

Estoy trabajando en un arduino personalizado que funcionará a 3.3 V sin reguladores ni chips USB (para consumo de energía). Escuché que overclocking del chip a 16 MHz / 3.3 V generalmente está bien, pero de todos modos me gustaría estar dentro de las especificaciones.

Primero: para ejecutar a 8 MHz, ¿solo necesito reemplazar el cristal? ¿O hay algo más que deba hacer?

Segundo: ¿Necesito hacer algún cambio en el código para reflejar la nueva velocidad? Estoy usando conexiones serie, SPI e I2C en este proyecto, junto con el sistema operativo NilRTOS y las funciones millis / delay. ¿Alguno de estos se romperá? ¿El código se ejecutará notablemente más lento?

Tercero: ¿Cómo puedo programar el chip? ¿Está bien programarlo en un Arduino Uno a 16 MHz y luego trasplantarlo al arduino personalizado?

Cuarto: ¿cambiará el consumo de energía a 8 MHz?

¡Gracias!


2
Hay muchas placas compatibles con Arduino de 3.3V, Sparkfun Pro mini es un ejemplo. Es compatible con el IDE, por lo que todos los ajustes específicos del reloj se realizarán una vez que lo elija en el menú desplegable 'tableros'.
Oleg Mazurov

A 8MHz probablemente estarás bien usando el oscilador interno en lugar de un cristal. Tenga cuidado cuando compila código que cuando, por ejemplo, elige "Pro Mini 328p a 8MHz" ese 8 se aplica al código, por lo que no sugeriría compilar para 16MHz y luego trasplantar o puede encontrar que un retraso (1000) toma dos segundos como un simple ejemplo. Y echa un vistazo al ahorro de energía / suspensión en el código H2OhNo. (Otro momento en el que sugiero que obtenga cualquier programador en lugar de limitarse a las cargas en serie, busque "ISP" en Tindie)
Patrick Tudor

Respuestas:


7

La fórmula parece ser volt * 5.9-6.6 = mhz (válido entre 1.8v y 4.5v), por lo que a 3.3v, esto daría 12.8mhz. Tenga en cuenta que, si está ejecutando a 12.8mhz, CUALQUIER caída por debajo de 3.3v PUEDE causar problemas (¡y muy difícil de diagnosticar también!) O PUEDE salirse con la suya.

Sin embargo, los chips Arduino Atmega328p tienen una detección de "caída de voltaje" establecida en 4.3v; cualquier caída por debajo de eso, el chip se apaga. Puede obtener un ISP (AKA ICSP) para cambiar los fusibles; vaya a http://www.engbedded.com/fusecalc/ para averiguar en qué configurar los fusibles. También puede usar el ISP para leer los fusibles actuales, o reprogramar el chip sin una placa Arduino: todos mis proyectos tienen un encabezado de 6 pines. Si hace esto, antes de reprogramar usando la placa Arduino, tendrá que "Grabar Bootloader" (en el menú de herramientas). Tenga en cuenta que la programación aún se puede hacer a través de Arduino IDE.

Alternativamente, si desea ir "ligero" (y tener un ISP), puede cambiar los fusibles para usar el reloj interno de 8 mhz, ¡esto también libera 2 pines adicionales! Sin embargo, tenga en cuenta que el reloj interno puede derivar 1.2 horas por día (= 5%), en comparación con 1.7 segundos por día (= 20 partes por millón) en un cristal de cuarzo típico. Si no lo usa para medir el tiempo, esto probablemente no importe.

Tendrá que hacer cambios en el tiempo, para su código, debe agregar un tablero. Texto con la configuración correcta para su chip / velocidad de reloj, etc. - puede copiar la configuración de la entrada para el tablero, cambiar el nombre y cambiar la configuración "build.f_cpu"; reinicie (o inicie) su IDE Arduino, vaya a "Herramientas-> Tablero" y seleccione el tablero que agregó.

Puede mover el chip dentro / fuera del tablero y reprogramarlo allí (tenga en cuenta que el tablero seleccionado en Herramientas-> Tablero es el tablero FINAL, no el tablero de programación). Tenga cuidado al enchufarlo / desenchufarlo; eventualmente, ¡doblará los pines! Alternativamente, puede usar ISP (ICSP), como se mencionó anteriormente, muy recomendable. La programación del ISP también funcionará si el chip es el predeterminado de fábrica, siempre que tenga un reloj que funcione.

La cantidad de energía que utiliza el chip depende en gran medida de lo que haga con él, no solo las velocidades del reloj, la fuente del reloj, etc., sino también los modos de suspensión. Si está durmiendo mucho, puede consumir menos cuando corre más rápido que correr más lento, si casi todo su tiempo está dormido, entonces el consumo de energía debe contarse por ciclo de reloj, no por segundo, si su reloj es la mitad de la velocidad, y media corriente, luego dibuja la misma corriente por instrucción. Como el resto del tiempo lo pasas dormido, no obtienes ningún beneficio. Consulte http://www.gammon.com.au/power para obtener un desglose muy bueno del uso de energía, consejos sobre cómo ahorrar energía, etc.

Si ralentiza demasiado su reloj, el serial e i2c pueden volverse poco confiables (a menos que disminuya la velocidad), pero esperaría poder bajar a 1 mhz antes de que esto sea un problema: un chip de 1 mhz que intenta hacer 9600 bps tiene 104 instrucciones por bit de datos transferidos. i2c se ejecuta a 100khz, por lo que obtienes 10 instrucciones por bit (a 1mhz), posiblemente empujándolo. 8mhz debería estar bien. Prueba, prueba, prueba.

ACTUALIZACIÓN: Hay 3 configuraciones posibles para la detección de oscurecimiento: hay 3 valores posibles para AtMega328p: deshabilitado, 1.8v, 2.7v y 4.3v. Tenía la impresión (arriba) de que los Arduinos normalmente estaban configurados en 4.3v; aparentemente ese no es el caso (ver comentario más abajo). Recuerdo haber visto en alguna parte que hubo detección de apagones. Esto es algo a tener en cuenta, si su arduino se reinicia, especialmente al colocar cargas más grandes en la batería (motores en funcionamiento, leds múltiples, etc.)


Gracias por esta respuesta! Estoy un poco desconcertado por lo que dijo sobre el detector de apagón que se apaga por debajo de 4.3 V. Ahora estoy funcionando a 3.7 V y funciona bien; no tuvo que hacer ningún cambio en los fusibles.
Vulcano

@ user40, consulte la sección "ACTUALIZACIÓN" al final de mi publicación.
AMADANON Inc.

4

Primero: para ejecutar a 8 MHz, ¿solo necesito reemplazar el cristal? ¿O hay algo más que deba hacer?

No, ejecute en el oscilador interno como lo sugiere AMADANON Inc.

Alternativamente, configure el fusible "dividir el reloj por 8" (que lo haría funcionar a 2 MHz desde un cristal de 16 MHz) y luego, en el código, cambie la división de nuevo a 2. es decir.

#include <avr/power.h>

void setup ()
  {
  // slow clock to divide by 2
  clock_prescale_set (clock_div_2);
  } // end of setup

O para programar en otro Uno, deje el fusible solo, programe a 16 MHz y luego deje caer el reloj en el chip de destino, con la esperanza de que funcione lo suficiente a 3.3V para ejecutar esa primera instrucción. Lo más seguro sería instalar un cristal o resonador de 8 MHz en la placa de destino. Sin embargo, si el tiempo no es crítico, ejecute con el oscilador interno.

Segundo: ¿Necesito hacer algún cambio en el código para reflejar la nueva velocidad? Estoy usando conexiones serie, SPI e I2C en este proyecto, junto con el sistema operativo NilRTOS y las funciones millis / delay.

Si le dice al IDE que tiene un procesador de 8 MHz (por ejemplo, un Lilypad), entonces debe ajustar los retrasos, los cálculos de velocidad de transmisión, etc.

¿Alguno de estos se romperá?

I2C y SPI son automáticos. Se pueden ejecutar a una variedad de tasas. Dudo que haya algún problema con ellos. En cuanto a la serie, siempre que los cálculos se realicen correctamente, todavía debería estar disponible una amplia gama de velocidades de transmisión.

¿El código se ejecutará notablemente más lento?

Bueno, sí, funcionará a media velocidad en comparación con 16 MHz.

Tercero: ¿Cómo puedo programar el chip? ¿Está bien programarlo en un Arduino Uno a 16 MHz y luego trasplantarlo al arduino personalizado?

Usted puede hacer eso. O puede conectar un encabezado ICSP o un encabezado FTDI y programarlo in situ.

Ejemplos aquí: http://www.gammon.com.au/breadboard

Cuarto: ¿cambiará el consumo de energía a 8 MHz?

Sí, se reduce un poco.

Puede reducirlo considerablemente más utilizando otras técnicas como se describe en http://www.gammon.com.au/power , y AMADANON Inc.


Gracias Nick! De hecho, he leído su sitio web antes y me ayudó a reducir mi consumo de energía radicalmente. Como resultado, los AA y los AAA son ahora una fuente de energía viable para este dispositivo, lo cual es un gran problema porque el peso es importante. Así que gracias por ese sitio web también: es un gran servicio para la comunidad y realmente útil para personas como yo.
Vulcan
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.