Hola, en esta guía os enseñaré cómo cambiar la velocidad de reloj de nuestro Arduino, por lo que podremos prescindir de componentes, reducir el consumo, usarlo con menos voltaje, o incluso overclockear nuestro ATMega328p.

Originalmente Arduino funciona a 16Mhz, pero es posible cambiarlo par que funcione a frecuencias de entre 1Mhz y 20Mhz.

Requisitos

Lo requisitos son los mismos que para el circuito básico, sólo que además necesitaremos el oscilador de la frecuencia que queramos poner si esta es usando un oscilador externo.

Protoboardhttps://amzn.to/2JSaxed
https://amzn.to/2wjyGqO
Jumpers o cables de conexiónhttps://amzn.to/34igSJ5
https://amzn.to/2X8FP8k
Un chip ATMega328phttps://amzn.to/3bTocO2
Un cristal de cuarzo de 16Mhz y otro de la frecuencia que deseemos (si procede)https://amzn.to/3dEqB0l
Dos condensadores cerámicos de 22pf para 16MHzhttps://amzn.to/3c0qOcM
Un pulsadorhttps://amzn.to/2UInygj
Una resistencia de 1khttps://amzn.to/39LiM6f
https://amzn.to/2VgRy2f

Circuito básico

Para poder realizar el cambio de velocidad de reloj en nuestro chip ATMega328, tendremos que quemar el bootloader, por lo que no es posible hacerlo directamente en la placa y tendremos que montar un circuito básico externo.

Dado que hace tiempo ya expliqué como hacerlo en mi otro post, evitaré irme por las ramas explicando de nuevo cómo hacerlo. Por eso me limitaré a poneros el esquema de montaje, pero si quieres saber más te recomiendo pasarte por ese post.

Circuito básico para quemar el bootloader deseado

Cómo funciona

Arduino, internamente tiene un oscilador interno de 8Mhz, por lo que podemos usarlo con frecuencias inferiores sin oscilador externo. Por otro lado, es capaz de funcionar con frecuencias de hasta 20Mhz con oscilador externo, lo que nos dará una amplia gama de frecuencias. Esto se hará modificando los «fuses» del bootloader e instalando ese bootloader, pero dado que está ya hecho, sólo tendremos que quemar el bootloader.

Frecuencias

Os dejo una tabla de frecuencias a las que puede funcionar nuestro ATMega328p en el momento en el que hice esta entrada, ya que dicha tabla puede cambiar (ya lo hizo el mes pasado añadiendo varias frecuencias más). En dicha tabla os indico también si se puede hacer usando el oscilador interno, o si por el contrario necesitamos de uno externo. Obviamente el oscilador interno sólo funciona hasta 8Mhz, por lo que las frecuencias por encima de esa estarán fuera de su alcance.

FrecuenciaReloj InternoOscilador Externo
1XX
1.8432X
2XX
3.6864X
4XX
7.3728X
8XX
11.0592X
12X
14.7456X
16X
18.432X
20X

A tener en cuenta

Además de los dicho arriba, hay que tener en cuenta dos cosas muy importantes.
El ATMega328 tiene que funcionar para poder quemar el bootloader, ya que sino no responderá a las órdenes de quemado. No vale montar un circuito para que funcione a 4Mhz e intentar quemar el bootloader en un chip programado a 16Mhz. Dado que el microcontrolador no arrancará, no nos será posible quemar el nuevo bootloader.
Además, necesitarás tener los componentes a mano, y esto es muy importante. Si quemas el bootloader del ATMega328p a 20Mhz por ejemplo, sin tener un oscilador de 20Mhz, no podrás usarlo ni quemar otro bootloader hasta que consigas dicho cristal.

Cálculo de los condensadores

Otra cosa importante a tener en cuenta es el cálculo de los condensadores. No podemos usar un condensador de 22pf para todas las frecuencias, ya que no funcionará correctamente. Es por esto, que tenemos que conseguir un equilibrio entre la capacitancia de los condensadores en «paralelo» (sumada a la del circuito), con al capacitancia del cristal de cuarzo.

Para ello, lo primero que tenemos que saber es el CL (Load Capacitance), del cristal de cuarzo. Para encontrar este dato, tendremos que buscarlo en el datasheet de nuestro cristal de cuarzo, o ver si la tienda nos lo puede proporcionar.

Además de este dato, tendremos que saber la capacitancia de nuestro circuito, pero como eso es difícil, normalmente usaremos un valor de entre 2pf y 5pf (a esta capacitancia la llamaremos Cstray).

Conociendo estos datos, tendremos que utilizar la siguiente fórmula para calcular los condensadores:

CL = ((c1 * c2)/(c1 + c2))+Cstray

Como conocemos CL y Cstray, empezamos a resolver la ecuación moviendo Cstray a la izquierda del igual, convirtiéndolo en negativo, por supuesto.

CL – Cstray = (c1 * c2)/(c1 + c2)

Sustituyendo lo anterior por sus números reales, nos quedaría así:

20 – 2 = (c1 * c2)/(c1 + c2)

La fórmula anterior nos obliga a realizar varias veces el cálculo con distintos valores de condensadores, por lo que para simplificar, yo personalmente utilizo una hoja de cálculo.

Con esta simple hoja de cálculo, podemos fácilmente encontrar unos condensadores adecuados. Cuanto más cerca de cero este la casilla de la fórmula, más estable será.

Instalando el software necesario

Daré por hecho de que ya dispones del software de Arduino IDE, por lo que pasaré directamente a la instalación del paquete de gestión del microcontrolador. Para ello, seguiremos estos pasos.

Lo primero será añadir la URL de descarga de las tarjetas en el Arduino IDE. Para ello vamos a Archivo > Preferencias

En la nueva ventana que se abrirá daremos al botón del gestor de direcciones URL adicionales de tarjetas

Y en la nueva ventana que se abrirá, añadiremos la siguiente url:

https://mcudude.github.io/MiniCore/package_MCUdude_MiniCore_index.json

Y por último cerramos las dos ventanas abiertas dando a OK. Una vez finalizado lo anterior y añadida la URL de las placas, procederemos a instalarla. Para ello abriremos el gestor de tarjetas yendo al menú
Herramientas > Placa > Gestor de tarjetas

Ahí buscaremos el paquete MiniCore y le damos a instalar la última versión

Una vez instalado, ya podremos ver que disponemos de varias placas nuevas para seleccionar, entre las que se encuentra la ATMega328p.

Modificando la velocidad de reloj

Ahora que ya tenemos todo instalado y listo, nos falta quemar el bootloader para poder modificar la velocidad de reloj del ATMega328. Para esto, tendremos que montar el circuito básico que pongo al principio del post, y subir el sketch de ISP al Arduino que usaremos para quemarlo. Para más información te recomiendo que te pases por el post que indico al principio, acerca de cómo quemar el bootloader y programar un Arduino básico.

Una vez que lo tengamos, tendremos que seleccionar el chip que queremos modificar, que en nuestro caso será el ATMega328.

Una vez seleccionado, nos habrán aparecido varias opciones más en el menú de herramientas destinadas a la elección de la velocidad de reloj, BOD, Compiler LTO… las cuales paso a explicaros a continuación.

Opciones disponibles

  • Clock: Esta es fácil, es la velocidad de reloj que queremos que tenga nuestro chip tras quemar el bootloader. Tendremos en cuenta el seleccionar internal o external dependiendo de si usaremos el oscilador interno, o por el contrario un cristal externo.
  • BOD: O Brown-Out-Detection, es una protección de Arduino contra bajadas de voltaje. Esta protección desconecta el chip al llegar a cierto umbral para evitar que se dañe. Si underclockeas tu Arduino puedes bajar este voltaje para permitir que funcione durante más tiempo por ejemplo.
  • Compiler LTO: Esta opción activa algunas optimizaciones del compilador. Estas optimizaciones pueden ayudar a reducir el tamaño del programa e incluso mejorar la velocidad.
  • Variant: La variante de chip que estamos usando. Por norma salvo que tengas una variante especial, no debería ser necesario cambiar esta opción.
  • Bootloader: Por último veremos la opción de añadir o no añadir el Bootloader. Esta opción está más destinada a cuando programamos nuestro chip, y nos permitirá liberar el espacio que ocupa el bootloader a cambio de quitar la posibilidad de programar el chip por UART.

Quemando el bootloader

Una vez ajustadas las opciones anteriores, procederemos a quemar el bootloader. Para ello, simplemente tendremos que pulsar el botón de quemar bootloader que tenemos abajo en ese mismo menú.

Programar con la nueva velocidad de reloj

Parafraseándome de nuevo, diré que dado que ya tengo un post anterior acerca del tema, lo mejor es que te pases por él para verlo. Eso si, un detalle que no debemos olvidar a la hora de programar nuestro ATMega328 modificado, es que tenemos que hacerlo seleccionado la misma velocidad de reloj. En caso de no seleccionarla, nuestro chip funcionará con la velocidad descompensada y es probable que nuestro programa vaya muy lento, o por el contrario, muy rápido.


Espero que esta entrada os haya servido, y recordad que cualquier comentario o sugerencia constructiva es siempre bienvenido.

Daniel Carrasco

DevOps con varios años de experiencia, y arquitecto cloud con experiencia en Google Cloud Platform y Amazon Web Services. En sus ratos libres experimenta con Arduino y electrónica.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.