Estoy trabajando en un proyecto basado en AVR basado en baterías de baja potencia que integra algunos dispositivos diferentes, incluida una tira de neopíxeles y un duendecillo Adafruit . Cuando el dispositivo en general está inactivo, me gustaría consumir menos de 0.1 mA para maximizar la vida útil de la batería LiPo.
Todo esto funcionó (midió 0.035mA) pero no estoy seguro de que necesariamente lo hice de la manera "correcta" y planeo construir un producto basado en esto, así que me gustaría hacerlo bien.
(No se muestra: un diodo de retorno para el relé)
La principal preocupación que tengo es la alimentación "parasitaria" de los dispositivos cuando VCC se desconecta a través de la corriente que fluye desde los pines de datos. Por ejemplo, el Pixie (que se comunica a través de serie), no tiene modo de apagado e incluso cuando "apagado" drena alrededor de un miliamperio. Así que coloqué un pequeño relé para desconectar su VCC y descubrí que el pin serial todavía estaba alimentando al duendecillo. Las sugerencias en otros lugares sugieren que muchos chips tienen un diodo que deriva sus pines de entrada digital a VCC como protección de energía. Para resolver esto, tuve que suspender la biblioteca en serie y en realidad digitalWrite (PIN, LOW) durante el sueño.
Lo mismo con la tira WS2812b: desconectar VCC aún permite que el dispositivo se alimente desde el pin de datos. Y en otros diseños, cuando desconecté GND con un MOSFET de canal N, vi lo contrario: ¡un flujo de corriente a través de la línea de datos a tierra! (Esto tenía que resolverse con un diodo por publicación en PJRC.) Los WS2812b en realidad toman aproximadamente un miliamperio cada uno, incluso cuando están apagados,
Entonces, la pregunta: ¿hay una forma general y "limpia" de desconectar VCC y GND de partes de un proyecto durante la suspensión del sistema cuando hay pines de datos en la mezcla. cual es la mejor practica?
Algunas ideas:
- Forzar VCC a GND (¿no está seguro cómo? ¿Hbridge?). (Si hago eso, ¿qué pasa con los pines de datos que son altos?)
- Coloque un búfer de tres estados entre todos los pines de datos y estos dispositivos, y durante el sueño, coloque el búfer de tres estados en un estado de alta impedancia, desconecte VCC o GND solo con mosfet P o N
- Desconecte GND solo con N mosfet y coloque diodos en todos los pines de datos
- ¿Hay algún tipo de enganche de alimentación que desconecte tanto VCC como GND y los ponga en un estado de "alta impedancia" (como un búfer de tres estados para la alimentación?) De esa manera, la corriente no tiene forma de "salir" de las líneas de datos.
¿Puede alguien iluminarme sobre la forma más limpia y repetible de manejar este tipo de problema de "desconexión de carga"? (No hace falta decir que pasé horas buscando en Google este problema con poca suerte, aunque encontré esta nota técnica sobre el cambio de carga, pero no aborda la retroalimentación y el poder parasitario)
Respuestas:
Cuando hago esto, generalmente uso interruptores analógicos CMOS en las líneas de datos afectadas.
Algo así como el ADG812 tiene 4 canales de interruptores SPST que son fácilmente adecuados para una lógica bastante rápida y proporcionan una impedancia realmente alta entre los nodos del interruptor cuando están en estado apagado.
Lo bueno de esto es que la técnica funciona tanto para líneas de datos unidireccionales como bidireccionales.
Estas partes también se ejecutan en una sonrisa brillante:
La secuencia habitual para apagar:
Apague los interruptores de ruta de datos
Apagar dominio.
Encender es lo contrario, por supuesto.
[Actualizar]
De hecho, estos se conocen con otros nombres, como puertas de paso y puertas de transmisión .
Estos son significativamente diferentes de un verdadero búfer de tres estados (como puede ver en el diagrama en el enlace de arriba), pero para la lógica ordinaria, el efecto es mejor (este es inherentemente un dispositivo bidireccional) pero con menor potencia.
fuente
Si las señales de datos están conectadas a su microcontrolador, simplemente puede hacerlas de alta impedancia configurando esos pines como entradas. (Si el otro chip usa muy poca energía, puede tratar su Vcc como una señal de datos).
De lo contrario, puede usar interruptores analógicos (chips lógicos 74x66) para desconectarlos. Para señales unidireccionales, 74x125 también funcionaría.
fuente
Desafortunadamente, no creo que haya una estrategia única para todos. Cambie la alimentación a los subsistemas como ya lo ha hecho. En el software, los pines de la unidad son bajos para estados de baja potencia, a menos que hacerlo cause una condición de estado estable de alta potencia. En ese caso, empuje el pasador alto. Nunca permita que las entradas floten. Secuencia de potencia según sea necesario para establecer condiciones iniciales seguras.
fuente
Un problema desagradable que puede hacer que los microcontroladores hagan cosas muy extrañas.I2C
La buena solución es usar E / S seriales desplegables como . Esto requiere resistencias pull-up en SCK, líneas SDA. Las resistencias pull-up están conectadas a la línea Vcc conmutada. Asegúrese de que la línea Vcc conmutada cae muy bien a cero voltios cuando está apagada (no la deje flotar).
No tiene esa opción: está obligado a usar E / S en serie asíncronas. Algunos microcontroladores permiten un enfoque similar al I2C para resolver el problema. Si puede programar el pin de salida en serie para que sea solo desplegable en lugar del más común pull-up-for-1, pull-down-for-0 , entonces puede agregar una resistencia pull-up a Vcc conmutada a establecer una lógica alta.
Esta solución no es tan resistente al ruido como su enfoque actual, pero debería resolver el problema de retroalimentar sus módulos de E / S desde el AVR. Realmente no es una solución "limpia", pero es mucho más segura para los microcontroladores en sus módulos de E / S.
simular este circuito : esquema creado con CircuitLab
fuente