ATTINY85 энергосбережение (спящий режим) во время выполнения pwm с Arduino IDE - PullRequest
0 голосов
/ 10 февраля 2019

Я использовал полный рабочий день с таблицей 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-контактный вывод напрямую?

1 Ответ

0 голосов
/ 11 февраля 2019

Вы правы в том, что режим ожидания находится в состоянии глубокого сна, насколько это возможно, и при этом таймер все еще работает.

При частоте 1 МГц при 5 В можно ожидать, что этот чип будет использовать около 1 мА в активном режиме..

enter image description here

На холостом ходу можно ожидать, что оно упадет примерно до 0,2 мА ....

enter image description here

Я предполагаю, что подавляющее большинство энергопотребления, которое вы видите, связано со светодиодом.

Если вам нужна визуальная обратная связь и при этом требуется низкое энергопотребление, подумайте, возможно, периодически мигать светодиодом, а не постоянно его включать.Вспышка 10 мсек раз в секунду может быть видна и использовать 1/100 мощности.

Как только вы это сделаете, вы можете начать делать предельную экономию энергии, например, отключать периферийные устройства, блокируя запуск формы ISR Arduino, чтобы продвинутый пользователь ATINY приблизился к 0,2 мА по сравнению с полной активной 1 мА.

Если вы отключили светодиод и все еще наблюдаете высокое потребление тока, то я предполагаю, что на вашей плате разработчика есть линейный регулятор, который в основном сжигает энергию.ATTINY85 может напрямую принимать напряжение до 5,5 В, поэтому, если ваше входное напряжение меньше этого, вы сможете полностью снять регулятор и затем снизить потребление энергии до ожидаемых значений.

enter image description here

Глядя на схему для вашей платы, я думаю, что вы можете подать питание через контакт 3 (VIN) JP2 и пропустить регулятор.Вы пробовали это?

enter image description here

...