Почему показания analogRead меняются при питании Arduino от USB?
Обновлено Редакция GAW
Функция analogRead() по умолчанию сравнивает вход с опорным напряжением AVCC — то есть с питанием 5 В самой платы. Результат N = Uвх · 1024/Uоп (DS40002061B, разд. 24): если опорное «уехало», уехали и все показания, хотя измеряемое напряжение не менялось.
Откуда берутся колебания
- Порт компьютера. По USB 2.0 с изменением ECN порт выдаёт от 4,75 до 5,5 В, маломощный — от 4,4 В.
- Цепь питания платы. На схеме UNO R3 питание от USB идёт через самовосстанавливающийся предохранитель MF-MSMF050-2 и ключ FDN340P. Сопротивление такого предохранителя по Bourns — от 0,15 до 1,0 Ом, и падение на нём растёт вместе с током платы.
- Нагрузка. Включили реле или светодиоды — ток вырос, питание просело.
Наш расчёт: вход 2,50 В при опорном 5,00 В даёт код 512, при 4,75 В — 539, при 5,25 В — 488. Разница ±5 % без всякой ошибки самого АЦП.
| Опорное, В | Код для 2,50 В на входе | Если считать опорное равным 5 В |
|---|---|---|
| 4,75 | 539 | 2,63 В |
| 5,00 | 512 | 2,50 В |
| 5,25 | 488 | 2,38 В |
Что делать
- Измерять питание и вносить поправку. Внутренний источник 1,1 В можно подать на вход АЦП (канал 1110 в ADMUX) и измерить относительно AVCC: UCC = 1,1 · 1024/N. Источник от 1,0 до 1,2 В у разных экземпляров (табл. 29-15), поэтому его значение один раз уточняют мультиметром. После переключения канала дайте источнику установиться и отбросьте первое измерение.
- Измерять относительно внутреннего источника 1,1 В —
analogReference(INTERNAL)и делитель на входе: опорное перестаёт зависеть от USB. - Внешнее опорное на AREF — самый точный вариант.
- Логометрические датчики — потенциометры, резистивные делители с питанием от того же 5 В — от колебаний питания не страдают: их выход меняется в той же пропорции.
Сколько всего набегает ошибок, разобрано в ответе «С какой точностью Arduino измеряет напряжение?», коды и опорные для AVR пересчитает калькулятор АЦП AVR. Устройство АЦП и регистр ADMUX описаны на странице ATmega328P, распиновка плат — в разделе «Платы разработки».
Похожие вопросы
Как измерить напряжение питания Arduino без делителя?
Измерьте АЦП внутренний источник 1,1 В относительно питания — канал 1110 в регистре ADMUX — и пересчитайте: VCC = 1,1 · 1024 / N. Поскольку у конкретного экземпляра этот источник от 1,0 до 1,2 В, константу 1,1 один раз уточняют по мультиметру.
Будет ли стабильнее, если питать UNO от разъёма 7–12 В?
Да: тогда 5 В делает стабилизатор на плате, и опорное не зависит от порта компьютера. Но точность всё равно определяется допуском этого стабилизатора; для измерений лучше отдельный источник опорного напряжения на AREF.
Почему показания меняются, когда включается реле или светодиоды?
Ток платы растёт, и на предохранителе и ключе в цепи USB падает больше напряжения — питание, а с ним и опорное АЦП, проседает. Наш расчёт: при 200 мА на предохранителе с сопротивлением 0,15–1 Ом теряется 0,03–0,2 В.
Источники
- Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet, DS40002061B — разд. 24 — результат = VIN · 1024 / VREF; опорное — AVCC, внутреннее 1,1 В или AREF; табл. выбора канала — MUX 1110 подключает к АЦП внутренний источник 1,1 В (VBG); табл. 29-15 — VINT 1,0–1,1–1,2 В; разд. 11.7 — после включения источнику нужно время установления
- Arduino. UNO R3 schematic (A000066) и UNO R3 Product Reference Manual (A000066, изм. 21.10.2026) — схема — питание от USB через самовосстанавливающийся предохранитель MF-MSMF050-2 500 мА и ключ FDN340P; от разъёма питания — стабилизатор 5 В
- Bourns. MF-MSMF Series PTC Resettable Fuses (REV. BE) — MF-MSMF050: ток удержания 0,50 А, срабатывания 1,00 А, сопротивление от 0,15 Ом (минимальное) до 1,0 Ом (наибольшее через час после срабатывания)
- USB-IF. USB 2.0 Engineering Change Notice «VBUS Max Limit» — VBUS порта 4,75–5,50 В (маломощный порт — от 4,4 В)
Нашли ошибку?
Смотрите также
- С какой точностью Arduino измеряет напряжение?АЦП — около 0,2 %, опорное — до 7–9 % без калибровки
- АЦП AVR: ADPS и кодЧастота АЦП, время преобразования, код по напряжению, ADMUX и ADCSRA
- ПлатыArduino, ESP32-DevKitC, Raspberry Pi Pico: распиновка и питание
- ATmega328PРаспиновка, фьюзы, Optiboot, периферия, питание, схема и код на C