АЦП + Резистор + Вопрос новичка

dzmitry
Offline
Зарегистрирован: 12.08.2012

Привет всем, есть простой вопрос. 

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

Может кто-нибудь объяснить мне суть происходящего?

Заранее благодарен.

leshak
Offline
Зарегистрирован: 29.09.2011

extrasensov.net ;)

  • Как подключал - загадка
  • Что показывает вольтметр - не ведомо
  • Номинал резистора - тайна
  • Используемый скетч - а вдруг украдут
  • Какие данные выводятся - догадайтесь сами

Вообщем получился классический "Здравствуйте уважаемые ученые , у меня в подполе происходит подземный стук. Пожалуйста обьясните как он происходит".

>Может кто-нибудь объяснить мне суть происходящего?

Суть происходящего  - чудо.

Так как  digitalRead, который всю жизнь умел возвращать только 0 и 1, у вас вдруг начал показывать напряжение как вольтметр (пусть и без резистора).

 

Baltazor
Offline
Зарегистрирован: 20.07.2012

digitalRead возвращает только значения HIGH или LOW, логическую единицу или нуль, тоесть есть или нет сигнала.

Тебе нужно использовать analogRead и подавать сигнал на аналоговый пин, тогда ты сможеш получить в зависимости от входного напряжения значение от 0 к 1023.

dzmitry
Offline
Зарегистрирован: 12.08.2012

 ООО.... что ж я написал, виноват, комрады.... глупость написал.

Функцию конечно же использовал analogRead а не digitalRead.

Резистор на 57кОм. Подключал последовательно, т.е. минус батареи к пину земли, плюс батареи через резистор к аналоговму пину A0.

Скетч :) Serial.print(analogRead(0) * 0.0049);

leshak
Offline
Зарегистрирован: 29.09.2011

 Ну почему же весь скетч не дать? Это что тайна великая или за инет побайтово платите? 

Вы показали только ту строчку которая важна по вашему мнению, но ведь и в других может быть причина проблемы. Раз "что-то не работает", значит вы где-то ошибаетесь. Возможно и "что нужно процитировать" - тоже ошиблись. Ну то есть в данном случае, скорее всего проблема действительно не вскетче, но "на будущие".

Теперь по сути.

  1. Открываем школьный учебник физики и смотрим как пользоваться вольтметром (а в данном случае ардуина выступает вольтметром) - вольтметр подключается ПАРАЛЕЛЬНО нагрузке, а не в качестве нагрузки. Таким подклчением (кстати лучше нагуглить какую-то прогу  для рисования схем, а не словами - пригодится. Хотя-бы тот же fritzing) вы фактически замеряете соотношение внутреннего ризистора на порте (сотни килоом) и внутреннего сопротивления батареи+ваш резистор (гуглите "делитель напряжения"). То есть "резистор" вам нужно было втыкать между + и - самой батареи (он будет изображать нагрузку).
  2. Для перевода analogRead в вольты, можно использовать http://arduino.ru/Reference/Map  map(analogRead(0),0,1024,0,5) . Просто так "наглядней" что же именно происходит, чем догадыватся откуда взялось 0.0049 :)

 

leshak
Offline
Зарегистрирован: 29.09.2011

 Вообщем смотрите, попробую "на пальцах" что у вас получилось таким подключением:

Представте себе, что внутри, пин подключен подключен к земле через резистор ОЧЕНЬ большого номинала (не помню точно какого).  И вместе с вашем резистором на 57К получается делитель напряжения http://bsvi.ru/kalkulyator-delitelya-na-rezistorax/

Где R1 - ваш резистор, а R2 этот самый "который внутри". В идеале он должен быть "бесконечно большим". И тогда analogRead будет возвращать 1024 в не зависимости от вашего R1 (при батарее в 5-ть вольт). Но, так как идеала не бывает, то ... подставляем его настоящий номинал и нажимаем кнопку "Calculate" - выясняем что же у нас там ожидается на пине. Настоящие номинал этого R2 можно найти в даташите на AMTEL камень.

P.S. Ну и не забывает что батарея у нас "не идеальная" и тоже имеет внутренее сопротивление, которое добавляется к вашему R1

dzmitry
Offline
Зарегистрирован: 12.08.2012

Большое спасибо за ответ.

Учту на будущее все ваши замечани, спасибо.

Baltazor
Offline
Зарегистрирован: 20.07.2012

К вышеописанному добавлю:

Пин A0 имет номер 21 в ардуино нано (если не ошибаюсь), потому вам нужно делать как то так: analogRead(21).

Посмотрите нумерацию пинов у вашей моделе.

dzmitry
Offline
Зарегистрирован: 12.08.2012

 У меня arduino uno, и нумерация аналоговых пинов идет от 0 до 5. Т.е. насколько я понял, нумерация аналоговых и цифровых пинов не общая, как минимум для функции analogRead.

Baltazor
Offline
Зарегистрирован: 20.07.2012

Нумерация всех пинов в ардуине общая, в независимо от функции.

leshak
Offline
Зарегистрирован: 29.09.2011

Baltazor пишет:

К вышеописанному добавлю:

Пин A0 имет номер 21 в ардуино нано (если не ошибаюсь), потому вам нужно делать как то так: analogRead(21).

Посмотрите нумерацию пинов у вашей моделе.

Ошибаетесь. Не нужно. analogRead() принимает нумерацию именно аналоговых пинов. Так что analogRead(0) - самое правильное чтение пина A0.

Но то есть analogRead(A0) или analogRead(14) - тоже сработает. Но только потому что в реализации analogRead (файл arduino-1.0\hardware\arduino\cores\arduino\wiring_analog.c ) есть "защита от дурака".

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
	if (pin >= 54) pin -= 54; // allow for channel or pin numbers
#elif defined(__AVR_ATmega32U4__)
	if (pin >= 18) pin -= 18; // allow for channel or pin numbers
#else
	if (pin >= 14) pin -= 14; // allow for channel or pin numbers
#endif
	

То есть оно в итоге "уменьшит" значение этого пина. И вы добъетесь только потери пары тактов процессора. 

Правда "эта защита", в документации не описана. Просто, видимо, слишком часто путали, вот и "добавили" (а ведь могут и убрать в будущих версиях ;), тач что analogRead(0) - самое феншуйное.

 

Baltazor
Offline
Зарегистрирован: 20.07.2012

Не знал, спасибо что поправили.