Я исследовал варианты сна ATmega328 и прочитал несколько статей об этом, и я хотел бы понять, есть ли еще варианты.
Поэтому я хотел бы получить как можно более низкий ток, чтобы все, что меньше, чем 100uA, было бы хорошо - до тех пор, пока я могу слушать uart и прерывания для пробуждения.
Я использую пользовательскую плату (не UNO) с ATmega328p.
Установка чипа в глубокий сон:
set_sleep_mode (SLEEP_MODE_PWR_DOWN);
sleep_enable();
sleep_cpu ();
не проснулся бы с последовательной связью, согласно этому .
Вам нужно будет перевести его в IDLE
режим, чтобы прослушивать сериал, но это потребует нескольких мА-бад.
я нашел эту ссылку, где вы можете подключить аппаратно последовательный порт к прерыванию - это опасно, так что вы можете потерять данные, и, кроме того, мне нужны эти 2 контакта прерываний.
Я также читал эту статью о Gammon , где вы можете отключить некоторые вещи, чтобы вы могли бездействовать с гораздо меньшим энергопотреблением - но он не упомянул, как именно вы получаете от этого:
power_adc_disable();
power_spi_disable();
power_timer0_disable();
power_timer1_disable();
power_timer2_disable();
power_twi_disable();
Итак, суть в том, есть ли какая-либо опция, чтобы получить не менее 0,25 мА и прослушивать последовательный порт без каких-либо аппаратных манипуляций? Например, просыпаться с длинным последовательным вводом данных ?
Ответы:
Доска, которую мы делаем, делает это.
В режиме сна прерывание по низкому уровню INT0 включено
Процедура обслуживания прерывания INT0 устанавливает флаг и отключает прерывание
При пробуждении мы проверяем флаг (есть другие источники прерываний)
Что касается связи, мы используем протокол сообщений, который имеет начальный
>
и конечный символы\r
. например>setrtc,2015,07,05,20,58,09\r
. Это дает некоторую базовую защиту от потери сообщений, так как входящие символы не обрабатываются до получения a>
. Чтобы разбудить устройство, мы отправляем фиктивное сообщение перед передачей. Один персонаж сделает это, но мы отправим>wakeup\r
хе-хе.Устройство остается без сна в течение 30 секунд после получения последнего сообщения в случае появления новых сообщений. Если получено новое сообщение, 30-секундный таймер сбрасывается. Программное обеспечение интерфейса ПК отправляет фиктивное сообщение каждую секунду, чтобы держать устройство в активном состоянии, пока пользователь подключил его для настройки и т. Д.
Этот метод не дает абсолютно никаких проблем. Плата с несколькими периферийными устройствами потребляет около 40 мкА во время сна. Фактический ток, потребляемый ATMega328P, составляет около 4 мкА.
Обновить
При взгляде на таблицу видно, что вывод RX также является выводом прерывания смены контакта 16 (PCINT16)
Таким образом, другой метод без проводов может быть
Перед сном: установите бит маски прерывания смены порта в PCMSK2 для PCINT16, очистите флаг порта смены контактов 2 в PCIFR, активируйте прерывание порта смены контактов 2 (PCINT16-PCINT23), установив PCIE2 в PCICR.
Установите ISR для прерывания порта 2 смены контактов и продолжайте, как и раньше.
Единственное предупреждение, связанное с прерыванием смены порта, состоит в том, что прерывание является общим для всех 8 контактов, которые включены для этого порта. Таким образом, если у вас есть более одной смены контактов, разрешенной для порта, вы должны определить, кто вызвал прерывание в ISR. Это не проблема, если вы не используете другие прерывания смены контактов на этом порту (в данном случае PCINT16-PCINT23)
В идеале именно так я и разработал бы нашу доску, но у нас все работает.
источник
Код ниже достигает того, что вы просите:
Я использовал прерывание смены выводов на выводе Rx, чтобы заметить, когда поступают последовательные данные. В этом тесте плата переходит в спящий режим, если в течение 5 секунд не происходит никаких действий (светодиод «проснулся» гаснет). Входящие последовательные данные вызывают прерывание смены штырька, чтобы разбудить плату. Он ищет номер и мигает «зеленым» светодиодом столько раз.
Измеренный ток
Работая при 5 В, я замерял около 120 нА тока во время сна (0,120 мкА).
Пробуждение сообщение
Проблема, однако, заключается в том, что первый поступающий байт теряется из-за того, что последовательное оборудование ожидает падения уровня на Rx (начальный бит), который уже прибыл к моменту полного пробуждения.
Я предлагаю (как в ответе геометрического), чтобы вы сначала отправили «пробужденное» сообщение, а затем сделали паузу на короткое время. Пауза состоит в том, чтобы убедиться, что оборудование не интерпретирует следующий байт как часть активного сообщения. После этого все должно работать нормально.
Поскольку для этого используется прерывание смены штырька, никакое другое оборудование не требуется.
Исправленная версия с использованием SoftwareSerial
Версия ниже успешно обрабатывает первый байт, полученный в последовательном. Это делает это:
Использование SoftwareSerial, которая использует прерывания смены контактов. Прерывание, вызванное начальным битом первого последовательного байта, также пробуждает процессор.
Установка предохранителей, чтобы мы использовали:
Вдохновленный FarO в комментарии, это позволяет процессору просыпаться за 6 тактов (750 нс). При скорости 9600 бод каждый бит равен 1/9600 (104,2 мкс), поэтому дополнительная задержка незначительна.
Потребляемая мощность во время сна была измерена как 260 нА (0,260 мкА), так что это очень низкое потребление, когда не требуется.
Обратите внимание, что с такими предохранителями процессор работает на частоте 8 МГц. Таким образом, вы должны сообщить об этом IDE (например, выберите «Lilypad» в качестве типа платы). Таким образом, задержки и SoftwareSerial будут работать с правильной скоростью.
источник