Как напряжение питания влияет на `analogRead()` на микроконтроллерах на базе AVR?
Я использую Arduino на базе ATmega328P для создания прототипа, считывающего датчик температуры TMP36. В конечном итоге я перенесу это на плату на базе ATtiny85 с питанием от батареи. Как TMP36, так и ATtiny85 имеют диапазон напряжения Vcc от 2,7 В до 5,5 В, поэтому батарея, которая начинается, скажем, с 4,5 В и медленно падает до 2,7 В, не должна выходить за пределы диапазона.
Я ожидаю показания температуры в диапазоне от -5°C до +30°C, что должно соответствовать выходному напряжению TMP36 в диапазоне от 0,5 до 0,9 В. Я получаю 0,74 В при температуре около 23 ° C, поэтому такой диапазон кажется правдоподобным.
TMP36 выдает 10 мВ/°C независимо от Vcc (в пределах 2,7–5,5 В). Но я подозреваю, что значение AnalogRead() будет масштабироваться по напряжению питания и поэтому будет медленно меняться по мере разрядки батареи. Это правильно?
Нужно ли включать внешний регулятор напряжения/устройство опорного напряжения для подачи некоторого фиксированного напряжения (например, 2,5 В) на AREF?
Решение
Следуя ответу Эдгара Бонета, я успешно включил внутреннее опорное напряжение для АЦП.
Изначально я добавил к AREF развязывающий конденсатор емкостью 100 нФ и попробовал
#define REFS1 7
#define REFS0 6
#define REFS2 4
...
//ADMUX = (_BV(REFS1) | _BV(REFS2)); // 2.56V ATtiny85 datasheet §17.3 pp134
ADMUX = (_BV(REFS1) | _BV(REFS0)); // 1.1V ATmega328P datasheet §23.9 pp217
но не заработало, мой код не влиял на значения из analogRead()
. Поэтому после небольшого дополнительного чтения я вместо этого использовал
analogReference(INTERNAL);
Что сработало.
@RedGrittyBrick, 👍0
1 ответ
Лучший ответ:
АЦП измеряет коэффициент напряжения. Результат преобразования округляется значение 1024×V/Vref, где V — напряжение на входе, а Vref – опорное напряжение.
В конфигурации Arduino по умолчанию ссылка подключена к Vcc. Это не будет соответствовать вашему варианту использования, так как напряжение, которое вы хотите прочитать, не меняются пропорционально Vcc. Вы можете использовать внешнюю ссылку. Однако ATtiny85 имеет два внутренних источника опорного напряжения на 1,1 и 1,1 В. 2,56 В. Любой из них может хорошо подойти для вашего приложения, что избавит вас от необходимости добавлять дополнительную часть.
См. главу, посвященную АЦП, в техническом описании для получения подробной информации о как выбрать опорное напряжение.
- Отправка значения с одного Arduino на другой
- Использование аналогового входа для чтения кнопки
- Как работать с аналоговыми контактами в цикле?
- Arduino непрерывно считывает значение АЦП с помощью прерывания
- Распиновка аналога Arduino Pro Micro
- analogRead всегда 1023 на Arduino Due
- Чтение частоты ввода в цифровых выводах
- ошибка: 'analogRead' was not declared in this scope
Спасибо, это быстро привело меня к решению - к вопросу добавлены новые примечания для тех, кто заинтересован., @RedGrittyBrick