Tengo una placa Arduino ATMega328 personalizada que generalmente funciona a 5V @ 8MHz (usando el perfil Arduino Pro 3.3V 8MHz y el gestor de arranque). La razón principal por la que estoy usando esta configuración es para poder poner la placa en reposo cuando se desconecta la alimentación principal y comienza a funcionar sin batería (3V desde una celda de moneda). Las fuentes de 5V y 3V tienen diodos OR 'juntos y la entrada de 5V está vinculada a INT0. En el código, cuando detecta que INT0 se ha reducido, inicializa el modo de suspensión y todo se apaga con la excepción del temporizador de vigilancia que mantiene un ciclo de 1Hz para mantener un recuento interno y verificar que el chip debe volver a activarse. Esto funciona de maravilla cuando primero se aplica alimentación de 5 V, luego se inserta la batería y luego5V está desconectado. Se va a dormir y cuando se recuperan los 5V, se despierta y puedo ver que no ha perdido la cuenta.
Sin embargo, el problema surge cuando primero se aplica 3V . Honestamente, no estoy seguro de si incluso está arrancando. Pero lo que se supone que debe hacer es arrancar, verificar si INT0 (Digital 2) está bajo y, de ser así, ir directamente a dormir. Al observar el consumo de corriente, veo que se alimenta a unos pocos mA durante un par de segundos, luego cae a aproximadamente 0.3 mA (aún más de lo que debería estar en modo de suspensión). Pero cuando vuelvo a aplicar 5V, nada . El consumo de energía vuelve a subir pero no responde (sobre FTDI en serie).
¿Tal vez hay algo que me falta que no se puede iniciar en 3V ... en teoría debería funcionar bien.
Actualización: dejé caer un LED en D13 y probé el boceto parpadeante. Funciona bien cuando se inicia desde 3V o 5V. Sin embargo, cuando ejecuto mi firmware y lo inicio desde 3V, el LED simplemente comienza a parpadear salvajemente. No tengo idea de qué lo está causando, ya que nunca configuré D13 como algo en mi código. Pero me hace pensar que tiene algo que ver con el gestor de arranque ...
Respuestas:
Entonces ... resultó que lo que estaba sucediendo estaba todo en código. Resulta que estaba inicializando una interrupción en INT0, cuando era baja, al comienzo de mi código. El problema era que cuando se iniciaba con una alimentación de respaldo de 3V, INT0 siempre estaba bajo porque INT0 estaba conectado a la línea de 5V (así es como sabe ir a dormir). Debido a que INT0 era bajo y la interrupción se activaba en baja, estaba causando una interrupción constante, sin dar tiempo al resto del programa para ejecutarse. Cambié a habilitar esa interrupción solo una vez que ingresé al modo de vigilia completa y ahora funciona bien.
fuente
Exactamente qué está sucediendo y por qué no se puede determinar en función de la cantidad de información proporcionada. Sin embargo, veo al menos un problema potencial que explicaría al menos parcialmente los síntomas descritos.
Usted dijo que está usando diodos para seleccionar el suministro de voltaje, y un suministro es una batería de 3V. Si está utilizando diodos estándar que caen ~ 0.6V, entonces el voltaje de suministro a la MCU es solo ~ 2.4V. Si está utilizando diodos Schottky con una caída de voltaje entre 0.15-0.45, el voltaje de suministro es potencialmente tan bajo como 2.5V. Tiene el voltaje BOD establecido en 2.7 voltios, por lo que, en teoría, la MCU nunca arrancará con la batería.
En cuanto a por qué puede iniciarlo a 5v, bajar a 3v y volver a subirlo, no estoy seguro. Podría estar deshabilitando el BOD en el código ... tal vez ... No estoy seguro de por qué funciona, pero es probable que no funcione.
Configuré un circuito de interruptor de diodo con 5v y 3.3v para ver cómo se ve en mi osciloscopio cuando cambian los voltajes. Cuando a 3.3v se cambia a 5v, el voltaje oscila bastante inicialmente. Potencialmente, esto puede causar algunos problemas cuando la MCU intenta salir del sueño. Poner un límite entre VCC y GND suavizó la señal muy bien. Al cambiar de 5v a 3.3v, realmente no hubo ninguna oscilación, solo una caída limpia.
A partir de esta información, parece que debe bajar el umbral de BOD o apagar el BOD, y poner un límite de desacoplamiento entre VCC y GND. Probablemente también debería asegurarse de tener una resistencia desplegable en INT0, y leer las secciones de la hoja de datos de MCU que explican los diversos modos de suspensión, todas las consideraciones para dormir y despertar: es bastante complicado. Salud
fuente
Creo que el problema está en tu gestor de arranque, pero no en la forma en que piensas.
Cuando se inicia un Arduino, un gestor de arranque que aprovecha varias tareas, como buscar un host en serie o cargar datos del programa desde la memoria flash, requerirá mucha más energía que un Arduino dormido.
Creo que la razón por la cual su Arduino no se inicia es porque el gestor de arranque requiere una fuente de reloj precisa, pero la aplicación de 3v lo estropeará y tal vez se bloquee o espere a que se aplique 3.3v para una fuente estable.
Mirando la hoja de datos:
Vemos que el consumo de corriente mientras se despierta (ejecutando el gestor de arranque) probablemente será de alrededor de 2 mA, mientras que la corriente de reposo es de aproximadamente 0,8 microamperios . Esto ciertamente podría llevar a un apagón en el inicio sin la corriente adecuada.
Quizás solo deba encenderlo con una potencia de 5v, o tal vez necesite una batería de mayor corriente y mayor voltaje.
fuente
Intente volver a cargar su arduino yendo a Herramientas> Grabar cargador de arranque
fuente