Использование детектора Brown Out на Arduino Due сохранения для переменных в eeprom
Привет, я новичок и работаю над проектом с Arduino Due (Atmel3X8E). Я хочу попытаться сохранить важные переменные в eeprom во время отключения электроэнергии, используя детектор отключения питания. Возможно ли это сделать? ? Спасибо.
@Tejus Vivek, 👍3
Обсуждение4 ответа
Не очень хорошая идея: если при записи в EEPROM отключится питание, данные в EEPROM будут повреждены. Целью детектора отключения питания является отключение микроконтроллера до того, как он выйдет из строя из-за низкого напряжения питания.
Решение этой проблемы - использовать какие-то огромные конденсаторы (около 4700 мкФ) - как маленький ИБП.
Когда отключается внешнее питание, у вас остается достаточно времени и энергии для безопасного хранения ваших байтов.
Как это работает
Когда +5 В в норме, конденсатор заряжается, а светодиод (контакты 1-2) внутри PC817 горит, поэтому транзисторная часть PC817 (контакты 3-4) открыта, и сигнал POWER_GOOD НИЗКИЙ
.
При отключении питания конденсатор начинает разряжаться и подавать питание на правую часть схемы. Диод Шоттки действует как клапан, который останавливает подачу питания в левую часть. Другой диод, который находится внутри PC817, теперь гаснет, а транзистор закрывается - сигнал POWER_GOOD переходит на уровень HIGH
и ваша программа может начать сохранять данные в EEPROM.
Почему оптопара?
Нам необходимо изучить внутреннюю схему чипа AVR. У него есть пара диодов на каждом выводе:
Итак, когда мы подключаем PIN напрямую к источнику питания, +5 В, и подключаем VCC AVR к +5 В через диод Шоттки, мы получаем два диода параллельно! Эта ситуация очень плоха, потому что они могут конкурировать, кто проведет ток - и, в некоторых случаях, выигрывает внутренний (который слабый) диод микросхемы. Весь ток питания контроллера начинает течь через этот слабенький диод, нагревает его и сжигает чип! Не очень хорошо.
У меня такая же схема, но без U1 для отображения «солнечной энергии». Просто подключите 5V к контакту прерывания. Ваше решение более элегантно (но почему оптопара, а не просто мосфет?), но могло быть и проще., @Adriano
@ Адриано - обновил мой ответ, @gbg
Я думаю, что вы все равно могли бы использовать простой транзистор вместо оптопары в соответствии с комментарием Адриано. Или даже просто поставить резистор последовательно со штырьком. У вас уже есть резистор!, @user253751
Проголосуйте за ответ на вопрос и схемы. Я разделяю опасения по поводу рабочего напряжения оптопары по сравнению с фактическими уровнями питания, но это хорошее решение, которое напрямую отвечает на вопрос. FRAM и EERAM также хороши, но это зависит от варианта использования., @RDragonrydr
Альтернативным решением этого является использование "EERAM". Это EEPROM с буфером SRAM перед ним. Большой конденсатор используется для обеспечения питания, в то время как содержимое SRAM хранится в EEPROM.
Звучит сложно, но это просто, поскольку они сделаны в виде отдельного чипа. Одним из хороших примеров является 47C16 от Microchip. Резервная копия EEPROM полностью прозрачна для пользователя, и вы можете использовать ее точно так же, как микросхему SRAM, подключенную к I2C (так что не беспокойтесь об износе EEPROM из-за слишком частой записи).
Это микросхема, которую я так люблю, что сделал прошивку 3,3-вольтовой версии 47L16 ( так как я работаю в основном с устройствами на 3,3 В), и библиотека для его поддержки.
+1 Я и сам про них забыл. Это отличное предложение, а также то, что я хотел использовать. Единственным недостатком по-прежнему является то, что вы *пишете* на него, когда отключается питание; тогда все еще есть шанс, что вы получите поврежденные данные. Существуют также чипы FRAM, которые не требуют резервного копирования и имеют практически неограниченный срок службы. Adafruit продает несколько из них., @RDragonrydr
Я думаю, что схема gbg выйдет из строя во многих ситуациях. Это вызовет прерывание только тогда, когда напряжение источника питания достаточно низкое. Если нет значительной нагрузки, перед диодными фильтрующими колпачками источника питания, вероятно, будет достаточно заряда, и «5V» будет медленно падать. Arduino разряжает резервный конденсатор до того, как он получит прерывание «плохое питание».
Поскольку OP использует источник питания 12 В, лучше всего использовать простой детектор пониженного напряжения, предупреждающий, когда этот источник падает ниже некоторого разумного значения (например, 9 В). Стабилитрона и транзистора (или оптопары) должно быть достаточно, потому что значение порога не критично.
Предлагаю добавить пример схемы., @the busybee
Но мы можем напрямую подключить оптопару к сети переменного тока (разумеется, с соответствующим резистором и диодом). И измените прошивку для обнаружения импульсов 50/60 Гц вместо ВЫСОКОГО уровня., @gbg
Подключение к сети делает цепь более опасной. ОП все-таки новичок., @Jan Drasnar
Для этого я использую FRAM. Это всегда записывает байт, если он был получен, намного быстрее и безопаснее. Кроме того, вы можете использовать цепочный подход для сохранения блоков данных в EEPROM для контроля целостности данных. Попробуйте использовать MOSFET вместо диода и оптопары при питании от батареи.
- Arduino Due vs Mega 2560
- Точность часов времени Arduino
- Регистры ввода-вывода SAM3X8E (Arduino Due)
- Построение графика на Python с использованием Tkinter Canvas
- Ручная установка Arduino Due
- analogRead всегда 1023 на Arduino Due
- Как выбрать пару SDA/SCL на Arduino Due?
- Как упаковать 16-битное целое число, чтобы отправить его с помощью serial.write?
Каков ваш источник энергии?, @gbg
Мы планируем использовать сеть переменного тока 220 В 50 Гц с пониженным напряжением до 12 В., @Tejus Vivek
Хорошо, это хорошо - подробности смотрите в моем ответе, @gbg