Аналоговый вход и analogReference(INTERNAL);
- Войдите на сайт для отправки комментариев
Имеется клавиатура как на шилде LCD экран с кнопками. Принцип работы: там пять резисторов, пять кнопок. Из резисторов сделан делитель, который при нажатии кнопок выдает напряжение от 0 до 5 вольт с шагом 1в. Эта шняга подключена к аналоговому входу и прекрасно работает.
Но.....до того момента, пока в скетче мне ни понадобился внутренний источник опорного напряжения. Т.Е. analogReference(INTERNAL); Ардуинка стала видеть только две кнопки.
Минут десять ломал голову - в чем дело? Догадался. С клавиатуры подается напряжение до пяти вольт, а налоговые входы настроены на напряжение 1.1 вольт.
Вопрос - Опасно ли это для Ардуинки? Возможно ли спалить аналоговый вход, или ни чего страшного?
Спасибо.
Предельные значения указаны такие:
"Voltage on any Pin except RESET with respect to Ground: -0.5 to Vcc+0.5 V"
Напряжение на любой ноге кроме RESET, относительно "земли": от -0.5 до Vcc+0.5 В
То есть, обещают что не сгорит, насколько я понял. Но, опять же, если что - я не виноват. :)
спасибо
А где это указано?
http://www.atmel.com/Images/doc8161.pdf (страница 313)
Пока ни чё не понял по английски, но все равно спасибо. Попытаюсь перевести.
Спасибо
P.S. Подключил клавиатуру через делитель. Полет нормальный :)
Joiner, можно было и без делителя обойтись в принципе. Если перед чтением клавиатуры давать команду analogReference(DEFAULT), а потом обратно менять на INTERNAL .
Я где-то читал, что при работе с аналоговыми входами (и клавиатура тоже использует аналоговый) требуется какая-то задержка между переключениями, чтобы показания были поточнее. Мне кажется, что времени на все может не хватить. А делитетель работает без каких-либо переключений и как я проверил работает прекрасно. И всего-то всего дополнительно 2 резистора.
А еще, мне кажется есть вариант - подать на клавиатуру напряжение с выхода AREF, тогда вообще без делителя.
Об этом в даташите написано, что после смены референса или канала измерения нужно какое то число тактов подождать для стабилизации, но это совсем не много, delay(50) будет более чем достаточно
Возможно и так. А в исходниках ардуино (...\arduino-1.0.6\hardware\arduino\cores\arduino\wiring_analog.c) - ни как.
Хоть попытка вписать Delay была, но передумали. Из приведенного кода видно, что делать Delay между установкой опорного напряжения и аналоговым вводом безсмысленно.
Чем вобще закончилвсь попытка переключения опорного напряжения? А то я себе тоже такое вписал, но ещё не попробовал.
cпециально перечитал даташит, проблемы с переключением референса могут быть только если автотригеры использовать или если это значение менять внутри обработчика прерываний от ADC. Так как analogRead() не использует ни то ни то, то и проблеммы нет
can be safely updated in the following ways:
a. When ADATE or ADEN is cleared.
b. During conversion, minimum one ADC clock cycle after the trigger event.
c. After a conversion, before the Interrupt Flag used as trigger source is cleared.
When updating ADMUX in one of these conditions, the new settings will affect the next ADC conversion.
однако чуть дальше есть рекомендация "выбросить" первое считанное значение после смены опорного напряжения
after switching reference voltage source may be inaccurate, and the user is advised to discard this result.
Теперь уже попробовал.
Выдает в порт при стабильных 0.85В на входе такое
254
343
446
563
660
Выдает при каждом проходе почти стабильно. Хотя я ожидал что то в раене 1360.
Вероятно таки нада паузу после установки INTERNAL. Что интересно, после установки DEFAULT все (резистивный тачскрин например) как работало, так и работает, почти сразу без паузы. Вероятно разница внутреннего сопротивления источников опорного напряжения сказывается.
Победил проблему таким кодом
Без первого Ucc=analogRead не работает. Величену паузы не подбирал, 50 пошло с первого раза.