Непонятки с analogRead и analogReference

AntonM
Offline
Зарегистрирован: 22.10.2015

Здравствуйте!

В моей системе на Arduino Nano подается напряжение 7-14В через простой резистивный делитель так, что на входе на аналоговый порт A0 приходит 2.35-4.75В. Все это читается через analogRead().

Заметил интересную особенность - при выставлении:

analogReference(DEFAULT);

На выходе analogRead() приходит значение 854. Что соответствует 12.3В. Что не так - это значение постоянно колеблется в районе 0.2В, т.е. при постоянном напряжении 12.3В (постоянное - это значит полностью стабилизированное, без пульсации и скачков) при нескольких запросах приходит значение 846-857.

Решил попробовать подключить внешние стабилизированные 5В к порту AREF, чтобы попробовать улучшить ситуацию.

analogReference(EXTERNAL);

И тут столкнулся с такой вещью - максимальное значение (т.е. при полном соответствии Varef=Va0) не 1024 как при стандартных атрибутах "аналогового чтения", а 256! Но, при этом, значение с порта постоянное, без скачков и прыжков - 214.

Это какая то специфика данного метода? Ни в одной из книг об этом не написано.

Заранее спасибо!

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

AntonM, никакой связи. У вас в чём-то другом ошибка. Стоит привести полный скетч.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

AntonM пишет:
максимальное значение (т.е. при полном соответствии Varef=Va0) не 1024 как при стандартных атрибутах

Не знаю, а каких "стандартных атрибутах" Вы говорите, но число 1024 в десять бит просто не поместится.

 

 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

А прыганья результатов первого варианта скорее всего связаны с фиговой землей и на-водками... пейте даташит, помогает. :)

AntonM
Offline
Зарегистрирован: 22.10.2015

dimax пишет:

AntonM, никакой связи. У вас в чём-то другом ошибка. Стоит привести полный скетч.

Код примитивный - при прерывании на 2 пине в COM отправляется значение АЦП.

int z;
const int analogInput = 0;                              // объявляем пин для аккума

void setup() {
  Serial.begin(115200);
  Serial.setTimeout(15000);
  attachInterrupt(1, detect, FALLING);
  analogReference(DEFAULT);
//  analogReference(EXTERNAL);                
}

String addZeroes(const String& src, byte pad)
{
  if (src.length() >= pad)
    return src;

  String result;
  byte add = pad - src.length();
  while (add--)
    result += "0";

  result += src;
  return result;
}

void loop() {
}


void detect() {
      z++;
      String z10 = String(z, DEC);
      String z0 = addZeroes(z10, 3);
      String batchar = String(analogRead(analogInput), HEX);
      String batchar0 = addZeroes(batchar, 8);
      Serial.println("BC" + batchar0+"z0");
}


Arhat109-2 пишет:

А прыганья результатов первого варианта скорее всего связаны с фиговой землей и на-водками... пейте даташит, помогает. :)

Это исключено - устройство разведено на плате.

 

ЕвгенийП пишет:

Не знаю, а каких "стандартных атрибутах" Вы говорите, но число 1024 в десять бит просто не поместится

Почему же? Во всех справочниках диапазон АЦП 1024 имеет место быть.

Цитата со справочника этого же сайта (http://arduino.ru/Reference/AnalogRead):

Большинство плат Arduino имеют 6 каналов (8 каналов у платы Mini  и Nano, 16 у Mega) c 10-битным аналого-цифровым преобразователем (АЦП). Напряжение  поданное на аналоговый вход, обычно от 0 до 5 вольт будет преобразовано в значение от 0 до 1023, это 1024 шага с разрешением 0.0049 Вольт.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

AntonM пишет:

при прерывании на 2 пине

В скетче указано прерывание на 3-ем пине, а не на втором. Если Вы подключились на самом деле ко второму, то Вы вместо сигнала ловите наводки и грязь.

AntonM пишет:
Это исключено - устройство разведено на плате.

Антон, Вы так больше никому не говорите :))))

AntonM пишет:

Во всех справочниках диапазон АЦП 1024 имеет место быть.

Перечитайте Вашу цитату внимательно. Максимально возможное значение - 1023, а 1024 - это общее количество возможных различных значений 0 - 1023.

-----------

В строке №1 не хватает атрибута volatile. Строго формально он в данном случае не нужен, но ... неспокойно на душе и как-то тревожно. Я бы поставил просто "щоб було".

Вы в прерывании столько всего развели ... как часто приходят сигналы?

 

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Тут Евгений придрался к тому, что максимальное значеие будет 1023.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Yarik.Yar пишет:

Тут Евгений придрался к тому, что максимальное значеие будет 1023.

Ну, почему придрался? ТС явно ожидает увидеть 1024 в мониторе порта. Подсказал, что не увидит.

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Ой, я вообще опоздал, вы уже всё пояснили)

Если на плате - киньте плату)

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

AntonM, посмотрел скетч -манипуляции со стрингом -ужас, вывод в сериал из под прерывания тоже не желательно делать, хотя иногда можно. Но в целом должно работать. Ошибка не в программе. Ну и про 3й пин уже сказали.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

dimax пишет:

Ошибка не в программе. 

Это при условии, что обработчик прерывания успевает между сигналами. Я не зря его про частоту сигналов спросил.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

ЕвгенийП, ну давайте поразмыслим. Если обработчик не успевает -то по идее ничего страшного не произойдёт, как только прерывание отработает, выйдя  из прерывания уже будет ждать флажок нового прерывания. Т.е. система просто начнёт создавать прерывания с той скоростью, с которой сможет, ущерб в таких случаях обычно тем командам, что крутятся в Loop, т.к. очередь до их выполнения никогда не дойдёт. А поскольку в данном случае Loop пустой, то стало быть никаких последствий не должно быть :)

AntonM
Offline
Зарегистрирован: 22.10.2015

Частота прерывания - 1-3 раза в минуту по импульсу. Насчёт пина да, ошибся - 3ий пин на прерывании, с андроидофона набирал сообщение на форуме.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

dimax пишет:

то стало быть никаких последствий не должно быть :)

Ну, сериал (он же асинхронный) не будет успевать выедать буфер, он переполнится, а последствия переполнения непредсказуемы, опять же собъётся миллис, временные интервалы поползут, да ладно, мы поняли друг друга и в общем-то оба всё понимаем.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Никого не смутило, что ТС говорит о десятичных значениях (1023 и т.п.), а в строке 34 преобразует значение АЦП в 16-ричный вид?

Может там и нет никакой АшиПки, только невнимательность? ;)

b707
Offline
Зарегистрирован: 26.05.2017

wdrakula пишет:

Никого не смутило, что ТС говорит о десятичных значениях (1023 и т.п.), а в строке 34 преобразует значение АЦП в 16-ричный вид?

 

вряд ли это может обьяснить, почему десятибитное целое урезается до 8ми бит

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

wdrakula пишет:

Никого не смутило

Меня смутило всё вместе: "путаница с 1023 и 1024", "путаница с номерами пинов для прерывания", "заявление о том, что на разведённой плате наводок и соплей быть не может" ... всё это вместе создаёт какой-то нехороший фон. В общем, ТС, давайте сюда схему и фото сборки. Т.к. без этого говорить трудно, а доверия к тому что Вы сделали там всё правильно, простите, невелико.

Выкладывайте схему и фото.

AntonM
Offline
Зарегистрирован: 22.10.2015

wdrakula пишет:

Никого не смутило, что ТС говорит о десятичных значениях (1023 и т.п.), а в строке 34 преобразует значение АЦП в 16-ричный вид?

Может там и нет никакой АшиПки, только невнимательность? ;)


Вы не можете перевести hex в dec?)))
Сделано это для уменьшения количества символов, т.к. заложено ещё несколько информативных значений (те, что вместо нулей) в данной посылке.
Уважаемые, что может быть проще? На Vin и Varef подано питание с dc-dc 5В, который питается от аккумуляторов. Естественно, для подавления пульсации напряжения стоят кондеры. И от этих аккумуляторов идёт аналоговый сигнал через резистивный делитель напряжения 10 кОм и 5.1 кОм, после него подключено к входу А0.
Сигнал с внешнего устройства (сухой контакт) подключен к 3 контакту, и по замыканию которого и идёт посылка в Serial. Повторяю ещё раз - меняется лишь одна строка в скетче!

Фото выложить не могу (не имею возможности), схему предоставить могу. Но и там вообще нечего изображать - все уже рассказано.

b707
Offline
Зарегистрирован: 26.05.2017

AntonM пишет:
Вы не можете перевести hex в dec?))) Сделано это для уменьшения количества символов, т.к. заложено ещё несколько информативных значений (те, что вместо нулей) в данной посылке.

Какое примерно значение ожидается с аналогового пина? примерно 800, я так понял?

Число цифр в числе 800 в десятичной и в шестанцатиричной записи одинаковое. А если учесть. что в HEX обычно принято записывать знаки парами - то HEX даже длиннее . И где экономия числа символов?

AntonM
Offline
Зарегистрирован: 22.10.2015

Уважаемый, ну какое это имеет значение в данной проблеме? Проблема то не решена.

b707
Offline
Зарегистрирован: 26.05.2017

вы на AREF напрямую напряжение со стабилизированного источника подаете или через шунтирующий резистор?

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

Вот это работает, только проверил. я взял код ТС и выкинул из него бессмысленную херню. Более ничего не правил.

#include <stdio.h>
int z;
const int analogInput = 0;                              // объявляем пин для аккума
char buff[32];


void setup() {
  Serial.begin(115200);
  Serial.setTimeout(15000);
  attachInterrupt(1, detect, FALLING);
//  analogReference(DEFAULT);
   analogReference(EXTERNAL);                
}



void loop() {
}


void detect() {
      uint16_t a = analogRead(analogInput);
      z++;
      // d - dec, x - hex
      //snprintf(buff,32,"BC%08d%06d",a,z);
      snprintf(buff,32,"BC%08x%06d",a,z);
      Serial.println(buff);
      
      //Забыть эту херню, как страшный сон с ужастным концом ;)
      //String z0 = addZeroes(z10, 3);
      //String batchar = String(analogRead(analogInput), HEX);
      //String batchar0 = addZeroes(batchar, 8);
      //Serial.println("BC" + batchar0+"z0");
}


Теперь внимание! Я при опыте сжег к херам одну нанку. С ТС пиво.... ;).

Вот что написано с ДШ:

If the user has a fixed voltage source connected to the AREF pin, the user may not use the other
reference voltage options in the application, as they will be shorted to the external voltage.

--------------

То есть если на AREF что-то подано, то его нужно обязательно использовать, иначе оно коротится. Я, к стыду своему, про это забыл и использовал Vcc ref, при подключенном на aref отдельном проводе с 7805. Из нанки вышел волшебный дым, причем не сразу....

Хрен с ней, Рип Ин Пис, короче. Дело в другом: ТС тоже мог подпалить свою в аналогичной ситуации, если я забыл про это, при моем скромном опыте, то что хотеть от ТС?

Приведенный код работает как надо, при любом выборе реф. Только нужно помнить, что aref подключать только после запуска, или через очень солидный резистор ;) ;) ;) - шучу, через любой токоограничивающий - 10 К сойдет, а я - сам виноват, был уверен, что вход высокоомный.

----------------

вот кусок вывода

BC00000478000006
BC00000477000007
BC00000478000008
BC00000478000009
BC00000478000010
BC00000478000011
BC00000478000012
BC00000630000013
BC00000630000014
BC00000631000015
BC00000631000016
BC00000631000017
BC00000631000018
BC00000631000019
BC00000630000020

 

b707
Offline
Зарегистрирован: 26.05.2017

wdrakula пишет:

Теперь внимание! Я при опыте сжег к херам одну нанку. С ТС пиво.... ;).

Вот что написано с ДШ:

Вообще, я почитал ДШ еще и выяснил следующее:

 - при использовании стабилизированного источника 5в как для REF. так и для VCC - (как у ТС) - нет необходимсти использовать analogReference(EXTERNAL);. Можно использовать DEFAULT и результат будет тем же. (в этом случае AREF и VCC НЕ СОЕДИНЯТЬ!!)

- при использовании внешнего референса совпадающего с VCC. рекомендуют подавть его на AREF чрез резистор 1-5к. тогда "голубой дым" маловероятен. Надо только незабыть пересчитать получаемые значения на этот резистор.

 

Что касается проблем у ТС - думаю он накосячил в монтаже, который не хочет показывать. Ну или уже поджарил AREF способом выше и он у него теперь врет

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

wdrakula, да как пить дать Т.С. тоже спалил АЦП дуни, и теперь она ему всякую фигню и показывает.  Он же пишет, что "значение с порта постоянное, без скачков и прыжков"  а значение без скачков с АЦП меги очень непросто получить, а с референсом, снятым с dc-dc преобразователя так и вовсе невозможно.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

я, по традиции видео с этой историей на ютуб залил. Как спалил  - не снял ;) сожалею.

Смотрим.

AntonM
Offline
Зарегистрирован: 22.10.2015

b707] </p> <p>[quote=wdrakula пишет:

Что касается проблем у ТС - думаю он накосячил в монтаже, который не хочет показывать. Ну или уже поджарил AREF способом выше и он у него теперь врет

Вам знакомо понятие режимное предприятие? Поэтому фото не будет.
5.1 кОм по-моему на aref висит. Но и без него работало, сколько я помню.

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

AntonM][quote=b707 пишет:

 Вам знакомо понятие режимное предприятие?

На ардуино? Можно я "отолью это в граните", по меткому выражению одного нашего (не форумного, а ...немного выше) дурачка?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

AntonM пишет:
Вам знакомо понятие режимное предприятие? Поэтому фото не будет.
Вам знакомо выражение "трахайтесь сами". Вот этим и занимайтесь.

Тем более, что это, как я понимю не хобби, а работа за которую нам здесь никто не платит.

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

b707
Offline
Зарегистрирован: 26.05.2017

AntonM][quote=b707 пишет:

5.1 кОм по-моему на aref висит. Но и без него работало, сколько я помню.

А вы поточнее вспомните - это важно. Просто если там не 5.1к, а, к примеру, 51к или больше - это бы полностью обьяснило наблюдаемую картину.

Bront
Offline
Зарегистрирован: 05.04.2016

Режимное предприятие может быть еще и тюрьма и автор делает курсовую работу сокамернику или из охраны кому.

AntonM
Offline
Зарегистрирован: 22.10.2015

Это - попытка сделать то, что вышло из строя путем внедрения Ардуино.
Ваша позиция мне понятна. Можете не отвечать. Я здесь не с вами полемику вести пришел. А помощи попросить в непонятной мне ситуации.

AntonM
Offline
Зарегистрирован: 22.10.2015

b707] </p> <p>[quote=AntonM пишет:
b707 пишет:

5.1 кОм по-моему на aref висит. Но и без него работало, сколько я помню.

А вы поточнее вспомните - это важно. Просто если там не 5.1к, а, к примеру, 51к или больше - это бы полностью обьяснило наблюдаемую картину.


Точно не более 5.1 кОм. Либо 2, либо 5.1

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

AntonM пишет:
Это - попытка сделать то, что вышло из строя путем внедрения Ардуино. Ваша позиция мне понятна. Можете не отвечать. Я здесь не с вами полемику вести пришел. А помощи попросить в непонятной мне ситуации.

Пост мой видел? Видео видел? Все работает. Если у тебя - нет, то внимательно переделай и замени плату. Какая еще помощь тебе нужна? Горшочек не нужно выносить, надеюсь, и жопку подтирать?

b707
Offline
Зарегистрирован: 26.05.2017

AntonM пишет:

Точно не более 5.1 кОм. Либо 2, либо 5.1

тогда склоняюсь к выводу, что вы свой AREF уже поджарили.

Возьмите другую плату, запитайте ее стабильным источником 5в и используйте внутренний референс (DEFAULT). Для стабилизированного источника 5в это то же самое, как подача 5в на AREF в режиме внешнего референса.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

AntonM][quote=b707 пишет:
Вам знакомо понятие режимное предприятие?
Ой .. пилять .. а как жеж "импартозамищение"? Уж не позорились бы.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Arhat109-2 пишет:

Не знакомо чтобы на режимном предприятии пользовали нечто иносранное. 

Давненько Вы на них не были :)

AntonM
Offline
Зарегистрирован: 22.10.2015

wdrakula пишет:
Какая еще помощь тебе нужна? Горшочек не нужно выносить, надеюсь, и жопку подтирать?


Идиот. Больше я на этот форум за помощью обращаться не буду

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

AntonM пишет:
Идиот. Больше я на этот форум за помощью обращаться не буду
Первая здравая мысль за два дня!

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

ЕвгенийП пишет:

Arhat109-2 пишет:

Не знакомо чтобы на режимном предприятии пользовали нечто иносранное. 

Давненько Вы на них не были :)

Вспомните всрытие онлайн по телевизору "чёрного ящика" со сбитого турками штурмовика.
Незаряженные и севшие в прямом эфире аккумуляторы шуруповерта,
отвертки с разбитыми жалами, молоток,
кусачки которые не кусают и ими рвали провода соединяюшие платы
и как финал - пластиковые расколотые корпуса микросхем памяти
там где должна быть металлокерамика.
И видим не оторванные от платы корпуса с возможностью подключения к кристаллу, а расколотые в крошку кристаллы
При том что на плате стоял один в нормальном корпусе ( похоже на регистр шины)
Я был просто в шоке....

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

trembo пишет:
пластиковые расколотые корпуса микросхем памяти там где должна быть металлокерамика..

кому должна там быть металлокерамика?

как бы это спасло корпус микросхемы и кристалла от механического разрушения при ударных нагрузках?

Похожее изображение

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

trembo пишет:
Вспомните всрытие онлайн по телевизору "чёрного ящика" со сбитого турками штурмовика
Да, я делал про это тему в "Отвлечённых". Там еще апофеозом импортозамещения была ATMega162 :)

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Клапауций 555 пишет:

trembo пишет:
пластиковые расколотые корпуса микросхем памяти там где должна быть металлокерамика..

кому должна там быть металлокерамика?

как бы это спасло корпус микросхемы и кристалла от механического разрушения при ударных нагрузках?

Похожее изображение

 


Дитятя, вы хотя-бы слышали про военную приемку?
Как там вообще пластмасса имела право появиться?
Снабженцы впарили, и так сойдёт.....типо аналоги....
Найдите видео про это "вскрытие"и сравните с помощью ваших глаз состояние разных корпусов после этих "ударных нагрузок"

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

trembo пишет:
Дитятя, вы хотя-бы слышали про военную приемку? Как там вообще пластмасса имела право появиться? Снабженцы впарили, и так сойдёт.....типо аналоги.... Найдите видео про это "вскрытие"и сравните с помощью ваших глаз состояние разных корпусов после этих "ударных нагрузок"

trembo, как ты думаешь, сколько мне лет и какой у меня стаж радиомонтажника на предприятии, разрабатывающим и производящим девайсы для военных?

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

но... ты ответь на мой вопрос - каким образом металлокерамика спасает от механического разрушения при ударных нагрузках?

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

ЕвгенийП пишет:

Arhat109-2 пишет:

Не знакомо чтобы на режимном предприятии пользовали нечто иносранное. 

Давненько Вы на них не были :)

Да уж, давненько. Последний раз, вроде как 1986-й .. матрицы ПЗС 512х512 ещё вновинку тогда были ..

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Клапауций 555 пишет:

но... ты ответь на мой вопрос - каким образом металлокерамика спасает от механического разрушения при ударных нагрузках?

Отвечаю.
https://youtu.be/tlGsIt9fZs8?t=2322
Если точное время - то 38:42
Справа малиновый с золотом - это керамика, а слева чёрное крошево- это пластмасса.
Если-бы память была в керамике её можно было бы легко подключить даже при обрыве внешних выводов.
Кристалл в связи с его малой массой разрушить нереально.
Сам в юности работал наладчиком на зондах и на термокомпрессии....
А уж военной приёмки сколько выпускали- всё в золоте и керамике.
Когда вскрывали утром я даже на работу не поехал, смотрел до конца этот позор....

Почитайте комментарии к этому "фильму"

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Да, про этот позор я как-то и забыл уже .. спасибки что напомнили. Жесть.

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

trembo пишет:

А уж военной приёмки сколько выпускали- всё в золоте и керамике.

снова про золото и керамику...

прекращай тупить - это не та вражеская композитная керамика, которая выдерживает ударные нагрузки и не для нагрузок она предназначена, а для работы на высоких частотах.

*заливка блока компаундом - не, не слышал, у нас всё в золоте и керамике. О_О

**просто интересно понять эту совдеповскую логику о военной приёмке и скрепном золоте/керамике - у гражданского Боинга почему чёрные ящики не разбиваются? потому, что - что, плин?.. О_О

Похожее изображение

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Клапауций 555 пишет:

у гражданского Боинга почему чёрные ящики не разбиваются? потому, что - что, плин?.. О_О

 

Как бы ракета воздух-воздух и удар о землю - это немного разные нагрузки.

Клапауций 555
Offline
Зарегистрирован: 10.03.2018

andriano пишет:

Как бы ракета воздух-воздух и удар о землю - это немного разные нагрузки.

золото и керамика защищают от ракет воздух-воздух?

*алё! коматозники - вы сбили гражданский Боинг ракетой земля-воздух.

**таки, путин всем россиянам заменил мозги тампаксами.

Картинки по запросу mh17 чёрные ящики

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Эт ты с кем сейчас разговаривал?