Я работаю над проектом на базе AVR с низким энергопотреблением, который объединяет несколько различных устройств, включая полосу неопикселя и пикант Adafruit . Когда устройство в целом не работает, я бы хотел, чтобы оно потребляло менее 0,1 мА, чтобы продлить срок службы батареи LiPo.
У меня все это работает (измерено 0,035 мА), но я не уверен, что я обязательно сделал это «правильным» способом, и я планирую создать продукт, основанный на этом, поэтому хотел бы сделать это правильно.
(Не показано: обратный диод для реле)
Основная проблема, с которой я столкнулся, - это «паразитное» питание устройств, когда VCC отключен через ток, протекающий от выводов данных. Например, Pixie (который общается через последовательный порт), не имеет режима отключения питания, и даже когда «выключен» истощает около миллиампер. Поэтому я установил маленькое реле для отключения его VCC и обнаружил, что последовательный контакт все еще питает пикси. Подсказки в другом месте предполагают, что многие микросхемы имеют диод, шунтирующий свои выводы цифрового входа к VCC в качестве защиты питания. Чтобы решить эту проблему, мне пришлось приостановить последовательную библиотеку и фактически digitalWrite (PIN, LOW) во время сна.
То же самое с полосой WS2812b - отключение VCC все еще позволяет устройству получать питание от контакта данных. И в других конструкциях, когда я отключил GND с N-канальным MOSFET, я видел обратное - обратный поток тока через линию передачи данных на землю! (Это должно было быть решено с помощью диода в каждом посте на PJRC.) WS2812b на самом деле занимает около миллиампера каждый, даже когда не горит,
Итак, вопрос: существует ли общий, «чистый» способ отключить VCC и GND от частей проекта во время сна системы, когда в миксе есть выводы данных. Какова лучшая практика?
Некоторые идеи:
- Заставить VCC к GND (не уверен, как? Hbridge?). (Если я это сделаю, что случится с выводами данных, которые высоки?)
- Поместите буфер с тремя состояниями между всеми выводами данных и этими устройствами, и во время сна переведите буфер с тремя состояниями в состояние высокого импеданса, отсоедините VCC или GND только с помощью P или N mosfet
- Отсоединяйте GND только от N mosfet и устанавливайте диоды на все выводы данных
- Существует ли какая-то защелка питания, которая отключает как VCC, так и GND и переводит их в состояние «высокого импеданса» (например, трехфазный буфер для питания?). Таким образом, ток не может вытекать «из» линий данных.
Может ли кто-нибудь рассказать мне о самом чистом и наиболее повторяемом способе решения такого рода проблем с отключением нагрузки? (Излишне говорить, что я потратил часы на поиски этой проблемы без особой удачи, хотя я нашел эту техническую заметку о переключении нагрузки, но она не касается обратной подачи и паразитного питания)
Ответы:
Когда я делаю это, я обычно использую аналоговые переключатели CMOS на поврежденных линиях данных.
Нечто подобное ADG812 имеет 4 канала SPST-переключателей, которые легко подходят для довольно быстрой логики и обеспечивают действительно высокий импеданс между узлами коммутатора в выключенном состоянии.
Приятно то, что этот метод работает как для однонаправленных, так и для двунаправленных линий данных.
Эти части также бегут на яркой улыбке:
Обычная последовательность выключения:
Отключить переключатели пути передачи данных
Выключите домен.
Включение питания, наоборот, конечно.
[Обновить]
Они действительно известны под другими именами, такими как проходные и передающие .
Они значительно отличаются от истинного буфера с тремя состояниями (как вы можете видеть на диаграмме в ссылке выше), но для обычной логики эффект лучше (это по сути двунаправленное устройство), но с меньшей мощностью.
источник
Если сигналы данных подключены к вашему микроконтроллеру, вы можете просто сделать их с высоким импедансом, настроив эти контакты в качестве входов. (Если другой чип потребляет очень мало энергии, вы можете рассматривать его Vcc как сигнал данных.)
В противном случае вы можете использовать аналоговые переключатели (логические микросхемы 74x66) для их отключения. Для однонаправленных сигналов также будет работать 74x125.
источник
Я не думаю, что, к сожалению, есть один размер, подходящий для всех стратегий. Переключите питание на подсистемы, как вы уже сделали. В программном обеспечении выводы привода имеют малое значение для состояний с низким энергопотреблением, если только это не вызовет состояние устойчивого состояния с высоким энергопотреблением. В этом случае держите палец высоко. Никогда не позволяйте входам плавать. Последовательность власти по мере необходимости, чтобы установить безопасные начальные условия.
источник
Противная проблема, которая может заставить микроконтроллеры делать очень странные вещи.I2C
Хорошее решение - использовать выпадающий последовательный ввод-вывод, такой как . Для этого требуются подтягивающие резисторы на линиях SCK, SDA. Подтягивающие резисторы связаны с коммутируемой линией Vcc. Убедитесь, что коммутируемая линия Vcc падает до нуля вольт, когда она выключена (не позволяйте ей плавать).
У вас нет этой опции - вы вынуждены использовать асинхронный последовательный ввод-вывод. Некоторые микроконтроллеры позволяют использовать такой же подход, как и I2C, для решения проблемы. Если вы можете запрограммировать вывод последовательного выхода только для понижающего напряжения, а не для более распространенного понижающего напряжения для 1, понижающего напряжения для 0 , тогда вы можете добавить подтягивающий резистор к коммутируемому Vcc для установить высокую логику.
Это решение не так устойчиво к шуму, как ваш нынешний подход, но оно должно решить проблему с обратным питанием ваших модулей ввода / вывода от AVR. Это не совсем «чистое» решение, но гораздо безопаснее для микроконтроллеров в ваших модулях ввода-вывода.
смоделировать эту схему - схема, созданная с использованием CircuitLab
источник