Я использовал полный рабочий день с таблицей ATTINY85, Google и другими форумами, но сон имеет для меня лишь частичный смысл.
Цель проекта: я строю контроллер скорости вращения диско-шара для питания и управления ШИМ крошечного двигателя постоянного тока в дешевом китайском вращателе диско-шара с батарейным питанием.
Аппаратное обеспечение: дешевый блок питания (порт USB 5 Ввывод) -> общая плата клонирования дигископарка ATTINY85 от ebay -> pwm с n-FET -> двигателем.Одна кнопка для переключения настроек скорости.
После загрузки я запускаю цикл настроек, который прослушивает нажатие клавиши (на самом деле быстрый щелчок переключателя питания в окончательной форме) и переключается между несколькими предварительно настроенными настройками ШИМ.По истечении ~ 2 минут с момента последнего нажатия клавиши используемая настройка сохраняется в EEPROM для следующей загрузки.Это все работает.
После обновления EEPROM я бы хотел минимизировать энергопотребление, потому что дискотека никогда не должна останавливаться.Из прочтения всех видов учебников и таблицы данных кажется, что только SLEEP_MODE_IDLE возможен, когда используется pwm.
Я хочу зомбировать доску настолько, насколько я могу, просто сохраняя ШИМ в том виде, в котором он установлен.Больше не нужно просыпаться.
Какие еще вещи можно отключить и как это правильно сделать?Советы и рекомендации?
Пока это моя слабая попытка.это несколько работает, светодиод отладки, который я установил, остается включенным при pwm = 30 (в основном цикле он пульсирует), но система просыпается при нажатии кнопки (переходит в основной цикл - светодиод начинает пульсировать), поэтому я подозреваю, что есть еще что сделать.
void timeout() { // this happens when settings loop has run long enough and its time for eternal sleep
analogWrite(PINLED, 30); //debug
countsmall = 0; //DEBUG, in case we wake up be ready for main loop
countbig = 0; //DEBUG, in case we wake up be ready for main loop
// save the setting
EEPROM.update(0, savedlevel);
// conserve power -- go zombie state for eternity
noInterrupts();
ACSR |= _BV(ACD); //disable the analog comparator?
ADCSRA &= ~_BV(ADEN); //disable ADC?
mcucr1 = MCUCR | _BV(BODS) | _BV(BODSE); //turn off the brown-out detector?
mcucr2 = mcucr1 & ~_BV(BODSE);
MCUCR = mcucr1;
MCUCR = mcucr2;
set_sleep_mode(SLEEP_MODE_IDLE);
//sleep_enable(); //redudant
sleep_bod_disable();
sleep_mode();
}
Вся программа: http://uvkk.kirah.fi/jotainmuutarandomia/randomfiles/liskodiskoboltsi.cpp
Добавление 1 11.2.2019:
Текущая ситуация, питание включеносветодиод удален, светодиод отладки выключен во время сна (мигание 2 мсек в секунду при зацикливании), только питание, подключенное к плате, измеренное от провода заземления:
1 МГц: зацикливание 13,8 мА, холостой ход 12,9 мА
8 МГц: петля 19,0 мА, холостой ход 15,1 мА
16,5 МГц: петля 24,7 мА, холостой ход 17,9 мА
Я думаю, что это позволяет работать на частоте 500 кГц: Настройка 1 МГц, но clock_prescale_set(clock_div_32);
в настройке ().По крайней мере, одна секунда мигания теперь длится 2 секунды, а токовая петля составляет 13,2 мА и на холостом ходу 12,6 мА.
Но это слишком большие цифры ... Если я здесь не так?Может ли встроенный регулятор отводить ток, хотя я питаю 5-контактный вывод напрямую?