Режим энергосбережения

Ardfun
Offline
Зарегистрирован: 22.05.2016

Благодарю :)

a5021
Offline
Зарегистрирован: 07.07.2013

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

parovoZZ
Offline
Зарегистрирован: 15.02.2016

ЕвгенийП пишет:

Ardfun пишет:

к сожалению я неумею в даташитах разбираться, я безнадежный новичек :)

Самое время научиться.

Ну, если в даташитах не умеете, так смотрите классическую статью Гэммона, там про экономию энергии всё написано. В частности про уменьшение частоты с примером и обсуждением (начиная со слов "Altering the processor frequency")

Слава Богу, это в одну строчку делается, если power.h включить

#include <avr/power.h>

void setup(void) {
   clock_prescale_set (clock_div_256); // уменьшаем частоту в 256 раз
   ...
}

 

А данная инструкция не во фьюзы лезет? А то после вставки этого кода пришлось менять параметры дудки.

a5021
Offline
Зарегистрирован: 07.07.2013

Не лезет. Функция просто пишет значение в регистр прескалера, что приводит к изменению всех частот МК. Возможно дудка несколько дуреет от такого авангардизЬма.

parovoZZ
Offline
Зарегистрирован: 15.02.2016

Слушайте, а такой рассуждение. При частоте в 1 МГц кристалл поедает какое-то количество энергии в течении одной секунды. Если мы увеличим частоту до 10 Мгц, то абсолютное потребление тока вырастет, но и задачу кристалл выполнит за 0.1 секунды. Так может, в высокой частоте нет ничего плохого?

Возможно не по теме. Про nRF24l01. Если в буфер выключенной платы залить данные, потом послать команду включения, затем сразу же дернуть ногу CE для передачи (согласно даташита, кристалл должен перейти в режим Stand-by-|| и, по идее, сразу же передать в эфир данные), то ногу CE надо держать до момента конца передачи? Может, достаточно дернуть на 10 микросекунд не дожидаясь, когда кристалл пройдёт через все этапы пробеждения (150+130 микросекунд)?

Где народ покупает nRF24l01? И какая дальность работы? У меня 3-4 метра. Кондер 4.7 мкФ на передатчике. Питание - 2 ААА. К тому же стабильность работы ниже плинтуса. Заливаешь прогу - работает. Еще раз залил - всё, сушим весла - связи нет.

a5021
Offline
Зарегистрирован: 07.07.2013

parovoZZ пишет:
Слушайте, а такой рассуждение. При частоте в 1 МГц кристалл поедает какое-то количество энергии в течении одной секунды. Если мы увеличим частоту до 10 Мгц, то абсолютное потребление тока вырастет, но и задачу кристалл выполнит за 0.1 секунды. Так может, в высокой частоте нет ничего плохого?

Этот вопрос совсем не прост и ответ не очевиден. Слишком уж много всяких факторов надо учитывать. По хорошему надо вычислять энергозатраты на один такт для каждой частоты при работе вашего алгоритма и уже оттуда смотреть, что выгоднее. Но это не совсем просто будет сделать.

Цитата:
Возможно не по теме. Про nRF24l01. Если в буфер выключенной платы залить данные, потом послать команду включения, затем сразу же дернуть ногу CE для передачи (согласно даташита, кристалл должен перейти в режим Stand-by-|| и, по идее, сразу же передать в эфир данные),

С таким же успехом можно дернуть себя за собственную ногу. Не знаю, какой вы даташит читали, но в таблице № 16 на странице 24 документа под названием "nRF24L01+ Product Specification" четко описано, как время Tpd2stby зависит от характеристик кварцевого резонатора используемого вместе с чипом NRF24L01. После того, как вы подняли бит PWR_UP в регистре CONFIG чипа, происходит запуск генератора стабилизированного кварцем. Генератор не начинает работать мгновенно и ему необходимо время для выхода на режим. Чем хуже кварц, тем это время больше. В упомянутой таблице речь идет о задержке от 1.5 миллисекунд до 4.5 миллисекунд, в зависимости от характеристик кварца. Если вы дернете CE раньше, чем генератор вышел на режим, то передатчик будет синтезирировать 2.4ггц из того, что ему выдает генератор, а генератор в этот момент может выдавать, что угодно. В этом случае передача или не состоится вовсе или произойдет на случайной частоте. Я с этим экспериментировал и наблюдал даже зависание передатчика, когда слишком ранний сигнал к началу передачи приводил к тому, что радио затыкалось насовсем и оживало только после передергивания питания.

У меня китайские модули, купленные в разное время и у разных продавцов, имеют разное время стабилизации генератора. Одни работают уже после 200 микросекундной задержки, другие ни в какую не работают, если не подождать 1300-1400 микросекунд. Плюс еще это время может зависеть от температуры окружающей среды.

Цитата:
то ногу CE надо держать до момента конца передачи?

Смотря чего вы хотите добиться. Если вам нужно просто выдать в эфир один пакет, заложеный ранее, то достоточнно поднять CE на 10 микросекунд и опустить. Дальше чип все сделает сам. Но передача может выполняться и по другому. Внутри чипа есть три буфера под передаваемые данные (и столько же под принимаемые). Можно заранее заполнить любое их количество данными и выстрелить одной кучей. Для этого после заполнения буферов CE поднимается и удерживается в таком состоянии до окончания передачи всех данных. Кроме этого, если отслеживать бит TX_DS, который взводится после окончания передачи данных одного буфера и по этому сигналу подбрасывать в чип новые данные, то передатчик буде строчить, пока данные будут своевременно загружаться в буфер. CE все это время должен находится в высоком состоянии. Единственное ограничение -- суммарное время непрерывной передачи таким способом не должно превышать четырех миллисекунд.

Цитата:
Где народ покупает nRF24l01?

В Китае.

Цитата:
И какая дальность работы?

По прямой на открытом пространстве не проверял, по квартире работают. Один у меня висит на улице, передает оттуда погоду. Ж/Б наружнюю стену пробивает на минимально-возможной мощности (-18dBm). Минимальная мощность выбрана из соображений минимизации энергопотребления.

Цитата:
Питание - 2 ААА.

Я сначала от двух АА питал, но где-то с середины лета перевел на солнечные батарейки, плюс ионистор. Пока ночи не очень длинные, ионистора 0.66F хватает для работы в темное время суток. Зимой будем посмотреть.

Цитата:
К тому же стабильность работы ниже плинтуса. Заливаешь прогу - работает. Еще раз залил - всё, сушим весла - связи нет.

Настройки смотрите. У меня с конца апреля функционирует без всяких нареканий. Перерывы в работе случались дважды по причине заливания дождем недостаточно герметичной конструкции и раза три я останавливал сам на доработку и/или смену прошивки. Остальное время каждую минуту отсылает данные, как из пушки.

Дома у меня стоит приемник-ретранслятор, который принимает данные с улицы и бродкастит на всю квартиру уже на полной мощности. Бродкасты принимаются двумя двумя разными устройствами. Всего, таким образом, уже долгое время работают четыре NRF24L01 и я не припомню ни одного сбоя по их вине.

parovoZZ
Offline
Зарегистрирован: 15.02.2016

Получается алгоритм такой. Закидываем в буфер данные. За 16 мс до начала передачи (у меня по собаке все события расписаны, а 16 мс - минимальная пауза) включаем чип (предварительно настроенный на передачу) и засыпаем. Через 16 мс дергаем СЕ на 10 мкс и через 130 мкс данные улетают. Но не понятен такой момент - после включения чипа (через 150мкс ... 5мс?) мы попадаем в режим StandBy-|. Если буфер чист и выключить ногу СЕ, то мы попадем в режим StandBy-||? И получается, что то, что попадает в буфер, оно сразу же выстреливает в эфир? А если ногу СЕ включаем, то переходим в режим StandBy-|.А из этого режима данные передаются через 130мкс после того, как мы дернули ногу СЕ. Вырастает дилемма - или ждать, пока чип раскачается до состояния StandBy-| (занять его полезной работой на сверхнизкой частоте), или же по собаке ждать 16 мс?

 

А что за три буфера? Как к ним подобраться? Мне казалось, что там один FIFO на 32 байта. Мне оно ни к чему сейчас - я всего 11 байт передаю, но знать хочется)))

a5021
Offline
Зарегистрирован: 07.07.2013

parovoZZ пишет:
Получается алгоритм такой. Закидываем в буфер данные. За 16 мс до начала передачи (у меня по собаке все события расписаны, а 16 мс - минимальная пауза) включаем чип (предварительно настроенный на передачу) и засыпаем. Через 16 мс дергаем СЕ на 10 мкс и через 130 мкс данные улетают.

Все правильно. Только лично меня как-то смущают эти 16мс, если нужно держать радио-чип в стендбае с 25мка-потреблением в течение этого времени. Навскидку не скажу, но нельзя исключать, что если проснувшийся МК взведет PWR_UP и приляжет в Idle на полторы миллисекунды, попутно сбросив частоту и погасив все лишнее, то это окажется поинтересней в плане снижения энергопотребления. Надо смотреть.

Жалко не предусмотрели разработчики NRF24L01 такой фичи, чтобы чип генерировал прерывание по выходу генератора на режим. Так бы можно было ложить МК в глубокий сон, пока оно там перышки расправляет.

Цитата:
Но не понятен такой момент - после включения чипа (через 150мкс ... 5мс?) мы попадаем в режим StandBy-|. Если буфер чист и выключить ногу СЕ, то мы попадем в режим StandBy-||? И получается, что то, что попадает в буфер, оно сразу же выстреливает в эфир?

Судя по диаграме на стр. 22, не сразу, а через все те же 130мкс TX Settling. В этом смысле принудительно загонять чип в Standby-II становится не интересным. По паузе перед началом передачи получается то же самое, как и из Standby-I, а по потреблению больше -- 320мка.

Цитата:
А если ногу СЕ включаем, то переходим в режим StandBy-|.А из этого режима данные передаются через 130мкс после того, как мы дернули ногу СЕ. Вырастает дилемма - или ждать, пока чип раскачается до состояния StandBy-| (занять его полезной работой на сверхнизкой частоте), или же по собаке ждать 16 мс?

Можно попробовать (сам я не проверял) сделать так: проснувшийся МК шлет сходу PWR_UP, затем тут же на максимальной скорости загоняет в чип пакет для передачи. Закончив с заполнением буфера, он сбрасывает свою тактовую по максимуму и ложится в Idle на время до конца процесса стабилизации генератора. Там останется уже меньше 1.5мс (или сколько там реально из-за параметров кварца), т.к. часть времени потрачена на передачу по SPI. Поспав до выхода генератора на параметры, МК просыпается, поднимает CE и не ожидая 10мкс, чтобы опустить ее, снова отправляется в сон, теперь уже до полного окончания передачи. С поднятой CE, передатчик выплюнув пакет, уйдет в Standby-II, но если "наказать" радио-чипу вызывать прерывание по концу передачи, то в Standby-II он сможет находится только небольшой промежуток времени, т.к. проснувшийся по прерыванию МК положит CE (а это сразу переведет радио-чип в Standby-I) и пошлет ему PWR_UP=0 через SPI, что закончит весь процесс отправлением радио в "POWER DOWN".

У меня сейчас сделано не так, но я пожалуй тоже попробую поменять процедуру вышеописанным образом. Мне пока не понятно одно -- не перехлестнется ли PWR_UP и начало заполнения буфера таким образом, что поставит чип в какое-нибудь ракообразное положение. Там эти переходные процессы -- довольно неприятная штука, а из даташита я как-то пока не разберу, можно ли одно с другим совмещать таким образом. Вобщем, надо будет проверить.

Цитата:
А что за три буфера? Как к ним подобраться? Мне казалось, что там один FIFO на 32 байта. Мне оно ни к чему сейчас - я всего 11 байт передаю, но знать хочется

Я сперва тоже никак не мог въехать, что это такое изображено на картинке.

Но рассудив, что три по тридцать два байта там нарисованы явно не для усиления художественного эффекта, начал копать. Фиг его знает, мож я мануалы читать не умею, но мне показалось, что эти буфера описаны в тексте отвратительно. Как их заполнять, как проверять каждый из них, я так и не понял. Посему взял и тупо повторил три раза одну и ту же процедуру, которую раньше использовал для заполнения единственного буфера. Для наглядности, загонял каждый раз разные данные. И, о чудо, подняв CE, без ее опускания через 10мкс, я на приемнике словил сразу три разных пакета. Тут уже стало понятно, что к чему.

Ardfun
Offline
Зарегистрирован: 22.05.2016

По поводу данного кода 

#include <avr/power.h>
void setup(void) {
   clock_prescale_set (clock_div_16); // уменьшаем частоту в 16 раз
  }

такие наблюдения:

если использовать для метеостанций, или подобных устройств то оптимальный вариант это уменьшение в 16 хотя и 24 и больше можно, работа устройсва конечно с тормозами гдето больше 3секунд включения и обновление показаний на экран при уменьшении в 16, зато энергопотребление снизилось во много раз (если раньше при 250мА/H акумулаторе моя ардуино про-мини работала где то 25 при уменьшении а 2ч раза частоты 45 часов то сейчас при уменьшении в 16 тестирую и уже прошло 60 часов а оно еще работает и акум сел только до 3,9)

Зато другое устройство которое использует сервопривод начинает дуреть, серва на низкой частоте неадекватно работает.

если надо прежняя частота для быстрой работы автоматики  то можно делать так


void setup(void) 
{
   clock_prescale_set (clock_div_16); // уменьшаем частоту в 16 раз
if (temperature >= 30 )//  если температура выше или равна 30 градусов
{
clock_prescale_set (clock_div_1); // стандартная частота работы
   } 

     }

 

 

 

To
Offline
Зарегистрирован: 21.02.2015

День (или вечер) добрый! Я потерял мысль, а за какое снижение энергопотребления боремся? И в чем смысл? У меня датчики работают от CR2032 все лето с мая, правда посылают данные раз в 2 мин. 328p настроена на 1.8 В питания, nrf24L01 питается от нее же. От двух АА год уж точно проработают, а то и больше. Кстати как выяснилось напряжение на CR2032 сильно зависит от температуры окружающей среды.

a5021
Offline
Зарегистрирован: 07.07.2013

To пишет:
День (или вечер) добрый! Я потерял мысль, а за какое снижение энергопотребления боремся?

Общее, какое же еще.

Цитата:
И в чем смысл?

То вы не знаете, в чем смысл.

Цитата:
У меня датчики работают от CR2032 все лето с мая, правда посылают данные раз в 2 мин.

Это по нынешним меркам не показатель.

Цитата:
328p настроена на 1.8 В питания,

И откуда вы его берете, такое питание?

Цитата:
nrf24L01 питается от нее же.

Если вы подцепили NRF24L01 прямо на CR2032, то это не очень удачное решение. Оно своим импульсным потреблением добъет батарейку раньше, чем та отдаст в нагрузку свою полную емкость. Часовые батарейки не особо любят токи в десятки миллиампер.

Цитата:
От двух АА год уж точно проработают, а то и больше.

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

Цитата:
Кстати как выяснилось напряжение на CR2032 сильно зависит от температуры окружающей среды.

Оно у всех зависит. Но это даже и хорошо. Чем ниже температура, тем ниже напряжение и стало быть ток нагрузки. Дольше продержится.

parovoZZ
Offline
Зарегистрирован: 15.02.2016

Кстати, нашел почему не было связи на nrf... - после программирования по SPI надо было сбросить питание с nrf... /  Хм ....

Имеет ли смысл в коде повторно инициализировать nrf... , если она виснит и ресетится только питанием? 

При инициализации hardSPI вывод MISO является входом. Имеет ли смысл перед сном этот пин делать выходом и подтягивать к питанию?

Вопрос - а как быть с #define F_CPU при работе с clock_prescale_set (clock_div_xxx); ? Ведь функция _delay_us зависит от значения этого макроса? А протокол OneWire от точных интервалов _delay_us.

Имеет ли смысл ногу питания DS18B20 вешать на пин, а не на питание? Много оно жрет в режиме покоя? Замерял кто?

А чем народ замеряет токи? У меня есть UNI-T UT71C - я так понимаю, не самый лоховской... Но на пределе mA он показывает 00.000, а на пределе uA связка 328p (8МГц) + nrf24L01 + DS18B20 отказывается работать от 3.0 вольт. Да и от 3.3 вольт тоже((((

a5021
Offline
Зарегистрирован: 07.07.2013

parovoZZ пишет:
Кстати, нашел почему не было связи на nrf... - после программирования по SPI надо было сбросить питание с nrf... /  Хм ....

Сколько копался с нрф, никогда такого не видел.

Цитата:
Имеет ли смысл в коде повторно инициализировать nrf... , если она виснит и ресетится только питанием?

Она не должна виснуть. У меня месяцами работают несколько модулей и я не припомню ни единого зависа. Завесить мне удавалось нфр только специальными экспериментами, когда нарушались требования по процедуре инициализации. Например, если при инициализации на прием записать PWR_UP=1 и сразу дернуть CE, то в случае, когда в это время в эфире передавался пакет и модуль сходу пытался его принимать, радио виснет и более не функционирует. Выход простой -- следовать рабочей циклограмме и выполнять все процедуры с необходимыми задержками.

Цитата:
При инициализации hardSPI вывод MISO является входом. Имеет ли смысл перед сном этот пин делать выходом и подтягивать к питанию?

Подтягивать к питанию его можно и не делая выходом. Режим входа с подтяжкой для этого и существует.

Цитата:
Вопрос - а как быть с #define F_CPU при работе с clock_prescale_set (clock_div_xxx); ? Ведь функция _delay_us зависит от значения этого макроса? А протокол OneWire от точных интервалов _delay_us.

Либо переписывать дилей, либо выходить на полную частоту в такие моменты.

Цитата:
Имеет ли смысл ногу питания DS18B20 вешать на пин, а не на питание? Много оно жрет в режиме покоя? Замерял кто?

По даташиту, меньше микроампера. Вешать на ногу не вижу смысла. Оно отожрет свое или даже больше на инициализациях при каждом включении.

energokom
Offline
Зарегистрирован: 31.07.2016

Приветствую.

Адруино про мини 5V 16МГЦ

Задействован wachDog

Работает от 5V, при переходе на питание 3.7V на литионном аккуме, датчик DS18b20 начинает показывать -127.

Без wachDog - темпереатуру показывает нормально.

Как сделать что бы и с wachDog - при понижении питания до 3.7 так же показывал нормально температуру?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

energokom пишет:

Приветствую.

Приветствую

energokom пишет:

Как сделать 

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

2. Сделать нормальное питание

3. Впредь при посте вопросов на форуме использовать слово "пожалуйста".

 

parovoZZ
Offline
Зарегистрирован: 15.02.2016

energokom пишет:

Приветствую.

Адруино про мини 5V 16МГЦ

Задействован wachDog

Работает от 5V, при переходе на питание 3.7V на литионном аккуме, датчик DS18b20 начинает показывать -127.

Без wachDog - темпереатуру показывает нормально.

Как сделать что бы и с wachDog - при понижении питания до 3.7 так же показывал нормально температуру?

Хм. У меня и собака, и питание 3 вольта - все чики чики

 

Sevast
Offline
Зарегистрирован: 23.06.2017

Здравствуйте.
Я очень мало разбираюсь в Ардуинах, по этому прошу помощи у Гуру.
У меня простой скейч. ШД крутит 5 секунд и простой 55 секунд. Эти 55 секунд Ардуино жрет 25мА, что не есть хорошо. Ардуино НАНО. Как уменьшить потребление?
Мой скейч. Что не так делаю, подскажите пожалуйста.

#include <LowPower.h>
#include <CustomStepper.h>            // Подключаем библиотеку управления шаговым двигателем. По умолчанию настроена на двигатель 28BYJ-48-5V
CustomStepper stepper(8, 9, 10, 11);  // Указываем пины, к которым подключен драйвер шагового двигателя

int example = 1;                      // Переменная, отвечающая за смену режимов
void setup()
{
  stepper.setRPM(10);                 // Кол-во оборотов в минуту
  stepper.setSPR(4096);               // Кол-во шагов на полный оборот.
}

void loop()
{
   {
    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); // Enter power down state for 8 s with ADC and BOD module disabled  
  }  
      if (stepper.isDone() and example == 1)
  {
    delay(55000);      
    example = 2;
  }
  if (stepper.isDone() and example == 2)
  {
    stepper.setDirection(CW);                   
    stepper.rotateDegrees(216);                 // Поворот вала в градусах
    example = 1;
    }
    stepper.run();                     
}

 

To
Offline
Зарегистрирован: 21.02.2015

Sevast пишет:

Здравствуйте.
Я очень мало разбираюсь в Ардуинах, по этому прошу помощи у Гуру.
У меня простой скейч. ШД крутит 5 секунд и простой 55 секунд. Эти 55 секунд Ардуино жрет 25мА, что не есть хорошо. Ардуино НАНО. Как уменьшить потребление?
Мой скейч. Что не так делаю, подскажите пожалуйста.

#include <LowPower.h>
#include <CustomStepper.h>            // Подключаем библиотеку управления шаговым двигателем. По умолчанию настроена на двигатель 28BYJ-48-5V
CustomStepper stepper(8, 9, 10, 11);  // Указываем пины, к которым подключен драйвер шагового двигателя

int example = 1;                      // Переменная, отвечающая за смену режимов
void setup()
{
  stepper.setRPM(10);                 // Кол-во оборотов в минуту
  stepper.setSPR(4096);               // Кол-во шагов на полный оборот.
}

void loop()
{
   {
    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); // Enter power down state for 8 s with ADC and BOD module disabled  
  }  
      if (stepper.isDone() and example == 1)
  {
    delay(55000);      
    example = 2;
  }
  if (stepper.isDone() and example == 2)
  {
    stepper.setDirection(CW);                   
    stepper.rotateDegrees(216);                 // Поворот вала в градусах
    example = 1;
    }
    stepper.run();                     
}

Так нельзя. Посмотрите, у Вас контроллер спит всего 8 сек, а остальные 55000 мС работает. delay - такая же функция, которая загружает проц, считая тики.  Если Вы используете эту библиотеку, то смотрите здесь:

http://www.rocketscream.com/blog/2011/07/04/lightweight-low-power-arduino-library/

пример

#include "LowPower.h"
 
void setup()
{
    // No setup is required for this library
}
 
void loop()
{
    // Sleep for 8 s with ADC module and BOD module off
    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
    // Do something here
    // Example: read sensor, log data, transmit data
}

Здесь написано, что спим только 8 секунд. Отсюда видно, что бы увеличить время сна можно организовать цикл, и просыпаясь увеличивать переменную на +1, а по достижении числа 56/8=7 (56секунд сна), выходить из цикла, обнуляя переменную. Никаких  delay(55000);

 

int a=0;
while (a<7) {
 LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
a++;
}

Вообще старайтесь на больших временах delay() не пользоваться, это простой расход энергии и загрузка процессора.

Sevast
Offline
Зарегистрирован: 23.06.2017

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

 

To
Offline
Зарегистрирован: 21.02.2015

Sevast пишет:

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

 

Я же написал как. Вместо сна 8 сек поставить этот цикл, а delay(55000)  выбросить.

С if сами разберитесь. После цикла со сном что должно работать. Ориентируйтесь на пример.

Sevast
Offline
Зарегистрирован: 23.06.2017

To пишет:

Sevast пишет:

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

 

Я же написал как. Вместо сна 8 сек поставить этот цикл, а delay(55000)  выбросить.

С if сами разберитесь. После цикла со сном что должно работать. Ориентируйтесь на пример.

Пол дня капаюсь, ну не програмист я. Как не сделаю, горит один светодиод, и ни какого движения. Пожалуйста, если не затруднит, напишите скейч как он должен быть.

Sevast
Offline
Зарегистрирован: 23.06.2017

При таком раскладе только при включении крутит ШД один раз.

Потом тишина. Нет смены режима. Если а= больше 7 то ШД постоянно крутит.

#include <LowPower.h>
#include <CustomStepper.h>            // Подключаем библиотеку управления шаговым двигателем 28BYJ-48-5V
CustomStepper stepper(8, 9, 10, 11);  // Указываем пины, к которым подключен драйвер шагового двигателя

int example = 1;                      // Переменная, отвечающая за смену режимов
void setup()
{
  stepper.setRPM(10);                 // Кол-во оборотов в минуту
  stepper.setSPR(4096);               // Кол-во шагов на полный оборот.
}

void loop()
{
    
  if (stepper.isDone() and example == 1)      
   {
    stepper.setDirection(CW);                   
    stepper.rotateDegrees(216);                 // Поворот вала в градусах
    example = 2;
    } 
    if (stepper.isDone() and example == 2)
    {
    int a=0;
    while (a<7) 
    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);   // Enter power down state for 8 s with ADC and BOD module disabled
  a++;
      example = 1;
    } 
      stepper.run();                     
}

 

To
Offline
Зарегистрирован: 21.02.2015

Вот простой пример, который работает. Попробуйте разобраться:

#include "LowPower.h"
void setup() {
   pinMode(8, OUTPUT);     // D8 на выход 
}

void loop() {
 
  digitalWrite(8, HIGH);   // Включить светодиод
  delay(300);              // пауза 300 mSecond
  digitalWrite(8, LOW);    // выключить светодиод
                           
// Дальше конструкция эквивалентная delay(16000) только со сном. 
 int a=0;
 while (a<2) 
 {
    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
    a++;
   }          // Здесь она заканчивается
}

Светодиод на D8 выводе мигает, потом проц засыпает на 16 сек, потом все повторяется. Или Вы учитесь, или нет. Больше помочь нечем. Извиняйте. Проще не бывает. на 328 все работает.

Sevast
Offline
Зарегистрирован: 23.06.2017

Спасибо, буду учиться.