• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

ADC (A0) на NodeMcu V3 (Ver 0.1)

AndrelaS

New member
Добрый день. Для своего проекта была приобретена плата. Установлена последняя прошивка отсюда, с модулями: adc, dht, file, gpio, http, i2c, net, node, tmr, uart, wifi. Прошил integer версию. Потихоньку начал реализацию задумки, подключил OLED экран (i2c), DHT11 (dht), подключился к точке доступа на смартфоне, поднял http сервер...Всё шло хорошо пока не дошло дело до adc...

Одна из целей - замер напряжения АКБ по средствам ADC (A0).
Для проверки, в init.lua решил инициализировать для замера системного напряжения:
Код:
adc.force_init_mode(adc.INIT_VDD33)
=adc.readvdd33()
=adc.readvdd33()
9
>
=adc.readvdd33()
=adc.readvdd33()
9
>
=adc.readvdd33()
=adc.readvdd33()
8
>
=adc.readvdd33()
=adc.readvdd33()
10
В ответ на adc.read(0) получаю что и должен
=adc.read(0)
=adc.read(0)
65535
>
=adc.read(0)
=adc.read(0)
65535
>
=adc.read(0)
=adc.read(0)
65535
Далее перевожу на замер напряжения с внешнего пина:
Код:
adc.force_init_mode(adc.INIT_ADC)
Ответ на adc.readvdd33() какой и должен быть
=adc.readvdd33()
=adc.readvdd33()
65535
>
=adc.readvdd33()
=adc.readvdd33()
65535
>
=adc.readvdd33()
=adc.readvdd33()
65535
>
=adc.readvdd33()
=adc.readvdd33()
65535
А вот нужный мне adc.read(0) выдаёт исключительно 0 или 1
=adc.read(0)
=adc.read(0)
0
>
=adc.read(0)
=adc.read(0)
1
>
=adc.read(0)
=adc.read(0)
0
>
=adc.read(0)
=adc.read(0)
0
>
=adc.read(0)
=adc.read(0)
1
На ADC (A0 на devkit) подавал напряжение 0-1В, потом попробовал 0-3,3В через подстроечник. Начал прозванивать вывод ADC на ESP8266 и выяснилось что вывод звонится с землёй. Видимо дело тут в резисторах между ADC и A0, убрал их и прозвонил повторно - опять звонится с землёй. Вывод adc.read(0) и adc.readvdd33() не изменился.
Решил содрать чёрный лак, посмотреть куда дорожки идут (малоли разводкой платы ADC на землю завели), вроде всё хорошо.
В общем, я в тупике. Может кто с таким сталкивался, или схема этой платы есть, или есть фото платы без ESP, может под модулем сопля припоя что-то замкнула, но мне ESP не спаять с платы (фена нет)...Буду рад любым идеям. Спасибо заранее.
 

Вложения

Последнее редактирование:

Jury_78

New member
А это читали?
adc.force_init_mode()
Returns
True if the function had to change the mode, false if the mode was already configured. On a true return the ESP needs to be restarted for the change to take effect.
 

pvvx

Активный участник сообщества
А это читали?
adc.force_init_mode()
Returns
True if the function had to change the mode, false if the mode was already configured. On a true return the ESP needs to be restarted for the change to take effect.
Не читайте китайских газет перед едой.
Там сказано, "Если ESP8266 настроен использовать АЦП для считывания напряжения системы, эта функция всегда будет возвращать 65535. Это аппаратное обеспечение и / или ограничение SDK."
Десять раз. Это ограничение только в LUA/NodeMCU.
-----------
Начал прозванивать вывод ADC на ESP8266 и выяснилось что вывод звонится с землёй. Видимо дело тут в резисторах между ADC и A0, убрал их и прозвонил повторно - опять звонится с землёй.
Это может быть нормально, если ваш тестер при измерении сопротивления выдает более 0.5B (что он покажет на два параллельно включенных диода в разные стороны?).
Вход ADC у ESP8266 при измерении напряжения падения как на диоде, при подаче "минус" относительно GND говорит:
ADC_Mi.gif
При подаче "+":
ADC_Pl.gif
Т.е. это равносильно включенным встречно диодам и китайские дешевые тестеры будут показывать какие-то Омы.

Проверить ADC вы можете к примеру в TCP2UART прошивке. Соединитесь, с его AP и в браузере посмотрите как он работает в режиме измерения внешнего сигнала и/или питания.
ADC_vs_VDD.gif
Там всё выбирается в меню, но показания в режиме ADC от 0 до 65535, а при измерении питания, зависят от введенной коррекции (где-то там в меню есть :)). При замере питания влияет подключенное ко входу ADC на GND сопротивление. Если не на GND, а к какому источнику, то будет показывать температуру на обратной стороне луны. При замере напряжения вывод ADC должен быть свободным (отключенным)...
Для ADC, китайцы в своем SDK, сделали настройку и переключение в esp_init_data_default.bin, который зашивается в специальную область... Если там бардак, то LUA с ADC может не работать. Но и когда всё хорошо, то в Lua вы не получите нормальных измерений (при включенном WiFi и схеме подключения входа ADC в NodeMCU - это измеритель температурной нестабильности токов утечек) и возможности переключения режимов у ADC на ходу там нет, только переписывая каждый раз flash и делая перезагрузку...
Кроме того данные с ADC там нелинейные, нормальной компенсации нелинейности там нет. Разработка ‘библиотеки’ малого webсервера на esp8266.
 
Последнее редактирование:

AndrelaS

New member
@pvvx Во-первых, спасибо за труды над TCP2UART , полезнейшая вещь - возьму на вооружение.

Теперь по порядку. Мультиметр MASTECH MY68 в режиме измерения сопротивления между ADC и GND при любом положении щупов показывает 000,0-000,1 Ом. В режиме диодного теста также показывает 0,000 В.

На ADC через подстроечник ("крайние" ноги на 3V3 и GND, бегунок на ADC) подавал 0-1В - реакции никакой, график скачет. Как это выглядит в TCP2UART:
Screenshot_2017-04-11-10-37-24.png
Screenshot_2017-04-11-10-27-53.png
Screenshot_2017-04-11-10-28-50.png

Из пояснений про "китайский" ADC понял что надо смотреть в сторону внешнего АЦП и садить его на GPIO, надёжнее и точнее будет. Или, правильно ли я понял что проблема в NodeMcu и LUA и если уйти от них то получить данные с ADC вполне реально?

UPD Вспомнил что где-то есть ESP-07, замерил сопротивление между ADC и GND, прибор показал 9.68 МОм и 5,46 МОм при разных положениях щупов. Буду его мучать, может devkit бракованый был (или стал :) ).

В init.lua прописал
Код:
adc.force_init_mode(adc.INIT_VDD33)
=adc.readvdd33()
=adc.readvdd33()
3426
>
=adc.readvdd33()
=adc.readvdd33()
3425
>
=adc.readvdd33()
=adc.readvdd33()
3424
>
=adc.readvdd33()
=adc.readvdd33()
3425
По мультиметру 3304 мВ
Код:
adc.force_init_mode(adc.INIT_ADC)
=adc.read(0)
=adc.read(0)
845
>
=adc.read(0)
=adc.read(0)
845
>
=adc.read(0)
=adc.read(0)
845
>
=adc.read(0)
=adc.read(0)
846
>
=adc.read(0)
=adc.read(0)
845
Мультиметр показывал 832 мВ
Точность для моих нужд удовлетворительная.

Видимо дело тут в моей devkit, если кто с такой же, дайте знать работает у вас или нет. Судя по выводу adc.readvdd33() ADC на плате devkit на самом деле на "земле".
 
Последнее редактирование:

pvvx

Активный участник сообщества
Мультиметр MASTECH MY68 в режиме измерения сопротивления между ADC и GND при любом положении щупов показывает 000,0-000,1 Ом. В режиме диодного теста также показывает 0,000 В.
Значит замыкание где-то...
 

nikolz

Well-known member
Nodemcu брал один раз в самом начале. После этого брал D1 mini не один раз. Все работает без проблем.
Брал и ESP1 03 12 все работают. Одну ESP01 спалил подав на нее 12 вольт по ошибке.
В nodemcu припаяна ESP-12 Возьмите ее или выпаяйте и добавьте два 1117 и USB UART - получите nodemcu но на соплях.
-------------------------
язык Lua не виноват, в том что у Вас КЗ на входе (или под шапкой).
 

pvvx

Активный участник сообщества
язык Lua не виноват, в том что у Вас КЗ на входе (или под шапкой).
язык Lua не виноват, что его обгрызли и пихнули в чип, не способный его поддерживать на базисном уровне. Читайте спецификацию к Lua.
Но это всё пофигу – на lua нет рабочих решений под данный чип. Одни тесты и куцие примеры... Какие-то, как-то реализованные проекты, за три года к ESP8266, есть только на Arduino и СИ.
 
Последнее редактирование:

nikolz

Well-known member
язык Lua не виноват, что его обгрызли и пихнули в чип, не способный его поддерживать на базисном уровне. Читайте спецификацию к Lua.
Вы бы объяснили как это связано с КЗ на плате. или Вам бы лишь прокукарекать?
 

pvvx

Активный участник сообщества
Вы бы объяснили как это связано с КЗ на плате. или Вам бы лишь прокукарекать?
А почитайте, что пишет автор. Вы у нас же писатель рекламы и ничего не читаете...
Сопротивление до 0.1 - это сопротивление шупов тестера. При сгорании входа обычно (90%) сопротивление сгоревшего кристалла чуть больше...
 

nikolz

Well-known member
pvvx,
специально для Ваc загрузиил луа и выполнил команду. Смотрите:
upload_2017-4-11_20-17-8.png
 

pvvx

Активный участник сообщества
pvvx,
специально для Ваc загрузиил луа и выполнил команду. Смотрите:
Посмотреть вложение 3911
Чего смотреть? Что вход ADC на плате NodeMCU включен через высокоомные резисторы и при данном типе ADC по этому дают дополнительные нелинейности из-за нелинейности входного тока на разных уровнях напряжения? :)
Или что не переключить на данной реализации LUA замер напряжения питания и далее замер напряжения на входе ADC?
Ссылку с враньем уже дали - там сослались на аппаратные ограничения и SDK, хотя их для данного случая нет. :)
 

nikolz

Well-known member
AndrelaS,
Относительно языка программирования. если Вы знаете СИ и Вам нужна скорость работы ESP то пишите на CИ.
Например, для ADC у меня скорость ввода максимально 900 кГц при 14 битах.
Сейчас делаю осциллограф на ESP , причем внешний интерфейс на компе делаю на луа, а на ESP - на CИ
 

nikolz

Well-known member
Чего смотреть? Что вход ADC на плате NodeMCU включен через высокоомные резисторы и при данном типе ADC по этому дают дополнительные нелинейности из-за нелинейности входного тока на разных уровнях напряжения? :)
Или что не переключить на данной реализации LUA замер напряжения питания и далее замер напряжения на входе ADC?
Ссылку с враньем уже дали - там сослались на аппаратные ограничения и SDK, хотя их для данного случая нет. :)
Поясняю, смотрите на показания ADC,
который замерил напряжение 3.3 в в мв=3265.
Т е измеряет.
 

pvvx

Активный участник сообщества
Одна из целей - замер напряжения АКБ по средствам ADC (A0).
Для проверки...
Вот тут чел решал аналогичную задачу: ESP8266 Analog to Digital Converter – How accurate? | Zephyr-Labs
Брал последний замер из нескольких, когда устаканятся показания в пачке запросов ADC, усреднял и делала замеры при выключенном WiFi.
В итоге вышло более менее. Ещё бы на питание у модуля повесил бы что получше 1117, получил бы меньше шума у внешнего ADC.
По его данным с GitHub - Maddox-zephyr/ESP8266_adc_test: Compare ESP8266 adc readings to ADS1015 reading вышло:
Снимок1362.gif
 

IKSIK67

New member
вопрос по поводу ACD,
не могли бы подсказать, читал, что ACD на модуле дает большую погрешность и лучше ставить свой внешний. Кто с ним работал, не могли бы сказать, какие с ним проблемы и пойдет он для декодирования звука?
 

Юрий Ботов

Moderator
Команда форума
@IKSIK67 в смысле adc? Проблема с ним одна: для корректной работы нужно сначала выключить wifi, померить, потом опять включить wifi. Это не всегда удобно. А причем тут декодирование звука. Это это строго наоборот?
 

IKSIK67

New member
@IKSIK67 в смысле adc? Проблема с ним одна: для корректной работы нужно сначала выключить wifi, померить, потом опять включить wifi. Это не всегда удобно. А причем тут декодирование звука. Это это строго наоборот?
у меня он должен звук передавать по wi-fi, поэтому выключать нельзя)))
 
Сверху Снизу