analogReference()

Тема в разделе "Arduino & Shields", создана пользователем TeaMoor, 2 мар 2016.

  1. TeaMoor

    TeaMoor Нуб

    Здравствуйте.
    Разъясните пожалуйста по поводу analogReference()
    Имеется аналоговый вход (например А0) на который генерируется сигнал от 0 до 5 V. Микроконтроллер Atmega328. Питание от USB.
    Если я задам функцию analogReference(INTERNAL), то значения должны расчитываться относительно 0-1.1V.
    Вопросы:
    1) Можно ли подавать на пины больше 1.1V? (но меньше 5V при этом)
    2) Если да, то все что больше 1.1V будет обозначаться как значение 1023?
    3) В каком месте кода указывать функцию? Непосредственно перед функцией analogRead или можно в теле void setup()?
     
  2. Onkel

    Onkel Гуру

    1 да
    2 да
    3 достаточно одной таблэтки в теле voidsetup{} , если нигде больше ref не переназначается.
     
    TeaMoor нравится это.
  3. TeaMoor

    TeaMoor Нуб

    А если я задам analogReference(INTERNAL), то это будет относиться ко всем аналоговым пинам (A0-A5)?
     
  4. Radius

    Radius Гик

    Да, так как в микроконтроллере только один АЦП, на который могут подключаться входы А0...А5.
     
    TeaMoor нравится это.
  5. TeaMoor

    TeaMoor Нуб

    Понятно.
    При отсутствии сигнала аналоговый пин выдает значение 52 (от 0 до 1023). То есть значения принимают вид от 52 до 1023. Меньше 52 никак не удается получить. Это шумы самой платы? Возможно ли это устранить?
     
  6. Radius

    Radius Гик

    Что значит отсутствие сигнала? Вход просто висит в воздухе или подключен к цепи GND? При референсе 1,1 В, значение 52, будет равно 0,05 В. Как у вас сделаны входные цепи? Желательно входной сигнал отфильтровать низкочастотным фильтром (резистор + конденсатор на землю).
     
  7. Onkel

    Onkel Гуру

    а также ( в мини, нано и , возможно, еще каких версиях) и к пинам ADС6 и ADС7, AD6 и AD7
    чтобы увидеть весь диапазон, подключите выход потенциометра к аналоговому пину. Или , при измерении , подключите вольтметр к пину - увидите честный 0.
     
  8. Onkel

    Onkel Гуру

    не всегда.
     
  9. Radius

    Radius Гик

    Всегда нужно отсекать частоты выше частоты квантования.
     
  10. Onkel

    Onkel Гуру

    Зачем? Неточность 5 V как референс даст гораздо большую ошибку в 99.99% ситуаций. А когда питают от слабого бп или от usb - тут вообще о точности говорить не приходится, каждый включенный светодиод даст пару (а может и пять ) % погрешности, а мы тут фнч городить будем, да не мешает еще его рассчитать, а потом скорректировать показания, поскольку увх мк имеет емкость и последовательное сопротивление?
    Кроме того, неидеальность увх мк приводит к тому, что при некоторых условиях фнч даст дополнительную погрешность даже на постоянном токе. Напишите дифф. уравнение зарядки емкости увх с дополнительными емкостью и последовательным резистором, и получив решение вы увидите что НЕ ВСЕГДА.
     
  11. TeaMoor

    TeaMoor Нуб

    У меня источник сигналов (сейсмодатчик) подключен к аналоговому входу и к земле, так же есть стабилитрон (5V).
    11.jpg
    Помимо него так же есть LCD-экран, который так же подключен к той же земле и цифровым пинам.
     
  12. Radius

    Radius Гик

    Предлагаю не начинать дискуссию о том как нужно подключать АЦП, как рассчитывать входные фильтры и при чем здесь теорема Котельникова или Шенона. TeaMoor могу порекомендовать для повышения точности использовать дифференциальное подключение АЦП. Для этого использовать два входа АЦП. Один вход подключаете к цепи GND, либо к цепи относительно которой вы меряете ваш сигнал, а на второй вход АЦП подаете сигнал. Истинное значение сигнала будет разность между вторым и первым входами АЦП.
     
  13. Onkel

    Onkel Гуру

    нет, не надо. У него не дифференциальный сигнал, а несимметричная схема земля- сигнал. А наличие напряжение на входе говорит лишь о неидеальности сенсора, либо о наличии каких-либо колебаний. Если подключить gnd сенсора к одному входу, а выход сенсора к другому входу - куда мы подключим землю сенсора? И всесто "истинного значения" мы получим разницу двух наводок.
    Сенсор ведь неидеален, и 52 - это шум сенсора либо уровень колебаний, которые сенсор честно преобразует в напряжение. Тестером можете проверить напряжение на выходе сенсора без подключенной ардуины? Если будет ноль, то надо будет разбираться в схеме, возможно где петля по земле или другие траблы.
     
  14. Radius

    Radius Гик

    Дифференциальное подключение как раз и используется для компенсации наводок.
     
  15. Onkel

    Onkel Гуру

    Конечно, это абсолютная истина. Но при дифференциальном подключении должно быть три провода или 4- земля, возможно отдельно экран, и сигнал + и сигнал -. У тс только земля и сигнал. Если бы мы были уверены, что 52 - это наводки, то достаточно было бы просто пустить сигнал в экранированном проводе, в сложных случаях- в экранированном проводе плюс отдельно земля, в еще более сложных - земля, экран, и два провода в экране, в виде витой пары, с соединением экрана и земли в одной точке и с другими тонкими материями грамотного заземления. Но имхо у нас (у тс) не тот случай. В случае тс мы имеем 5 см провода и непонятной (по причине недостаточности информации) нам природы показания 52. С чего начать? Померять тестером напряжение на выходе сенсора с отключенной ардуиной.
     
  16. TeaMoor

    TeaMoor Нуб

    Проверил средствами самой Arduino через монитор порта следующим кодом:
    Код (C++):
    void setup()
      {
      analogReference(INTERNAL);
      Serial.begin(9600);
      }
    void loop()
    {
       float voltage = analogRead(A0);
       Serial.println(voltage);
    }
    При отсоединенном от всех пинов, земли и 5V LCD-экране значения 0 всегда, когда на сейсмодатчик не воздействуешь.
    А в случае же когда LCD-экран подключен то значений 0 уже нету, и минимальное уже другие значения начиная от 50. При чем заметил, что когда шевелю соединительные провода от LCD-экрана на макетке, то минимальное значение меняется возрастая вплоть до 100. Ну то есть, если наклонил проводок вправо (пазы на макетке позволяют наклонять штырьки проводов до 1-2 мм во все стороны), то минимально значение скажем 50, наклонил этот же проводок влево, то минмиальное значение уже 80 например. И так со всеми проводами.
    Так что мне кажется тут как-то LCD-экран влияет на это.
     
  17. Onkel

    Onkel Гуру

    Да, это однозначно наводка. Есть какие- либо данные по выходному сопротивлению сенсора? Неплохо согласовать его выходное сопротивление с входным сопротивлением ардуины, влепив резистор между gnd и входом A0, соответсвенно наводки снизятся. Но очень малым сопротивление быть не может - уменьшится чувствительность преобразования. Даташит на сенсор есть?
     
  18. TeaMoor

    TeaMoor Нуб

    Даташита на него найти не смог. Есть только общая информация:
    12.jpg
    Сопротивление катушки 395 Ом.
    И еще, выяснил что дает помехи - это подсветка LCD-экрана. Когда отключаю подсветку (отсоединяю проводок с пина 15 экрана отвечающий за подсветку), то сразу значения становятся "чистыми", равным 0.
     
  19. Onkel

    Onkel Гуру

    вот она -то помехи и ловит.
    Попробуйте пару приемов, если не поможет будем дальше смотреть
    0. отключите подсветку lcd
    1 включите между контактами gnd и analog1 сопротивление 410 (или около того ) Ом.
    2 дайте вибросигнал сенсору и посмотрите, какое значение с этим сопротивлением и какое без него. Cигнал должен отличаться в два раза.
    3 включите подсветку lcd и посмотрите, сколько он навел.
    дальше, если наводки большие -
    1 экранировать катушку и соединить экран с gnd. экраном может быть металлическая (лучше из магнитного материала,не нержавейка) кружка, баночка и пр.
    Подключить параллельно питанию подсветки Lcd конденсаторы электролит и керамику, соответсвенно 2000 ÷ 5000 uF, и керамику 0,1÷0.47 мкф.
    Не поможет - будем дальше думать. Но помочь должно. Еще - возьмите провод пару метров и отнесите катушку подальше от lcd и ардуины. Наводка уменьшилась?
     
    TeaMoor нравится это.
  20. Onkel

    Onkel Гуру

    о, смотрите, катушку можно зашунтировать резистором 1÷ 1,47 кОм, а не 410 Ом, как я писал выше. Попробуйте.