ATTINY13A просыпается из-за АЦП

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 9
Зарегистрирован: Вт янв 21, 2025 10:55:42

Сообщение shevmax »

Народ, подскажите как быть. АЦП настроен на работу в ручном режиме:

Код: Выделить всё

    DIDR0 |= ADC_PIN;

    // REFS0 - внутрений источник опорного напряжения
    // ADLAR - выравнение по старшему байту
    // ADC_CHANNEL - ADC1
    ADMUX = (1 << REFS0) | (1 << ADLAR) | ADC_CHANNEL;
   
    // ADPS2 - Делитель на 16, при частоте 1.2 МГц (т.к. CKDIV8 фьюз) выйдет 75 кГц (как раз в рекомендованном диапазоне)
    // ADEN - АЦП включен
    // ADIE - Разрешить прерывание
    ADCSRA = (1 << ADPS2) | (1 << ADEN) | (1 << ADIE);
когда нужно, то запускаю преобразование через ADCSRA |= (1 << ADSC)

Ну так вот проблема - АЦП запускается сам по себе при каждом переходе в сон (SLEEP_MODE_IDLE) и наглым образом пробуждает.
Какой вообще смысл автоматически запускаться при переходе в сон если ADSC сброшен или это ошибка в микроконтроллере?

Получается что есть только 2 выхода:
1) делать замер без прерывания - не очень подходит т.к. хочется всё же в SLEEP_MODE_ADC чтобы это происходило
2) каждый раз включать АЦП (со снятым битом ADSC) и сразу уходить в SLEEP_MODE_ADC сон. - но тут есть сомнения - пишут что первое преобразование после включения обычно не очень точное. А получается что каждый раз будет "первое" преобразование.

Как лучше поступить?
P.S. просто так будить МК нельзя т.к. логика завязана на том, что он будет пробуждаться через определенные интервалы.
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

В документации это вполне описано. Можно стартовать преобразование при уходе контроллера в сон, чтобы внутренние шумы не мешали. А на счет первого преобразования - так какая разница будет ли оно первым после включения камня или первым после выхода из сна. Так и так аналоговые сигналы будут не такими, как при последующих преобразованиях.
Вложения
Снимок экрана_2025-01-21_13-54-58.png
(90.88 КБ) 50 скачиваний
Реклама
Родился
Сообщения: 9
Зарегистрирован: Вт янв 21, 2025 10:55:42

Сообщение shevmax »

[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4673892#p4673892"]А на счет первого преобразования - так какая разница будет ли оно первым после включения камня или первым после выхода из сна. Так и так аналоговые сигналы будут не такими, как при последующих преобразованиях.[/uquote]
Ну так когда просыпается МК, проходит еще пару сотен инструкций прежде чем будет АЦП использован, по этому всё уже будет в норме.
А вот если включать АЦП прям перед использованием, то придется делать паузу специально.


Вчитался по подробнее в datasheet и вычитал что если выставлен бит ADIE, то преобразование начнется сразу после перехода в сон.
Получается что бит ADSC игнорируется.

Тогда алгоритм получается такой:
1) настроили АЦП (со сброшенными битами ADSC и ADIE)
2) обработчик прерывания ADC_vect - пустой
3) проснулись по какому-либо своему событию (внешнее прерывание или таймер)
4) когда нужно замерять напряжение, то:
- сохранили MCUCR
- выставили в MCUCR биты для SLEEP_ENABLED + SLEEP_MODE_ADC
- выставили в ADCSRA бит ADIE
- ушли в сон
- как проснулись убрали в ADCSRA бит ADIE и обработали ADCH
5) далее уже программа работает по остальной логике и засыпает как нужно.

Тесты показали что после ухода в сон для замера напряжения мы просыпаемся через 0,19 мс.
Если же включать АЦП перед тестом и потом выключать его (бит ADEN), то время замера 0,36 мс
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Ну так и включайте АЦП сразу по пробуждении. А перед уходом в сон отключайте. Может быть, хватит бита ADIE (лучше проверить. И не забывать, что это скажется на потреблении), а может и ADEN.
Тесты показали что после ухода в сон для замера напряжения мы просыпаемся через 0,19 мс.
Если же включать АЦП перед тестом и потом выключать его (бит ADEN), то время замера 0,36 мс
Это те самые 13 / 26 тактов, о которых говорит даташит?
Реклама
Эиком - электронные компоненты и радиодетали
Родился
Сообщения: 9
Зарегистрирован: Вт янв 21, 2025 10:55:42

Сообщение shevmax »

[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4673917#p4673917"]Это те самые 13 / 26 тактов, о которых говорит даташит?[/uquote]
Получается что да. АЦП выставлен на 75 кГц, как раз примерно такое время и будет + затраты на выход из спящего режима.

[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4673917#p4673917"]И не забывать, что это скажется на потреблении[/uquote]
Ну с этим проблем нет, потому что большинство времени будет сон в PWR_DOWN (с отключенным сторожевым таймером) и только изредка IDLE.
Так что не думаю что при сне в IDLE АЦП слишком много будет жрать по сравнению с ШИМ (для которых как раз IDLE и будет).
Реклама
Родился
Сообщения: 9
Зарегистрирован: Вт янв 21, 2025 10:55:42

Сообщение shevmax »

[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4673917#p4673917"]Может быть, хватит бита ADIE (лучше проверить. И не забывать, что это скажется на потреблении), а может и ADEN.[/uquote]
Тут вы оказались правы, бита ADIE не хватило. Почему-то в PWR_DOWN МК потреблял 500 uA.
По этому сделал на оборот - бит ADIE всегда установлен, а бит ADEN ставится когда нужно замерять напряжение. И сразу потребление во сне упало в 10 раз.
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

До 50 мкА в самом экономичном режиме? Все равно многовато, там единицы микроампер должны получаться. Но, может, ток через другие компоненты на плате добавляется.
бит ADEN ставится когда нужно замерять напряжение.
Насколько я понимаю, выставление ADEN это "первое включение", которое может быть неточным. Может, все-таки лучше включать его сразу по выходу из сна?
Родился
Сообщения: 9
Зарегистрирован: Вт янв 21, 2025 10:55:42

Сообщение shevmax »

[uquote="COKPOWEHEU",url="/forum/viewtopic.php?p=4674234#p4674234"]До 50 мкА в самом экономичном режиме?[/uquote]

Да тут всё нормально. Стоит резистивный делитель который потребляет 47 мкА. По хорошему его бы отключать, но уже просто ножек не осталось под это дело.

Насчет "первое включение" - тесты показала что погрешности нет, либо она настолько мала что можно не учитывать. Ну а то, что замер в 2 раза дольше - это не страшно.
Ответить

Вернуться в «AVR»