Измерение напряжения

ArtHome
ArtHome аватар
Offline
Зарегистрирован: 19.05.2018

Приобрёл на алиэкспрессе "voltage sensor Vcc<25" Описание http://henrysbench.capnfatz.com/henrys-bench/arduino-voltage-measurements/arduino-25v-voltage-sensor-module-user-manual/

Сделал всё по описанию по толковой ссылке выше, после увидел такую картинку.

Напряжение у меня действительно меняется в течение суток от 12,1V до 11,3V (это АКБ с солнечной панелью). Две недели мне потребовалось на то, чтобы выяснить, что дрезебг порождает не контроллер солнечной батареи, а погрешность измерения - осциллограф никакого разброса в 0,1V не показывает, а ардуина его выдаёт при каждом обращении к `analogRead(A0);`

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

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ArtHome пишет:

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

А зачем мерить напряжение "несколько десятков тысяч раз в течение одной секунды"?

sadman41
Offline
Зарегистрирован: 19.10.2016

АЦП шумит. Ардуины разведены как учебные пособия, а не как измерительные инструменты. Можно еще какой-нить MAX7219 подключить напрямую и такой шабаш получить...

ArtHome
ArtHome аватар
Offline
Зарегистрирован: 19.05.2018

DetSimen пишет:

А зачем мерить напряжение "несколько десятков тысяч раз в течение одной секунды"?

Подскажите способ усреднения.

 

sadman41 пишет:

АЦП шумит. Ардуины разведены как учебные пособия, а не как измерительные инструменты. Можно еще какой-нить MAX7219 подключить напрямую и такой шабаш получить...

Ясно, то есть аппаратно это не решается, спасибо.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ArtHome пишет:

DetSimen пишет:

А зачем мерить напряжение "несколько десятков тысяч раз в течение одной секунды"?

Подскажите способ усреднения.

Я про то, что, а нельзя, например, 5 раз в секунду мерить?  Нада обязательно несколько десятков тысяч раз? 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Аппаратно как раз и решается - правильным разведением питания, применением отдельных АЦП (PCF8591), в том числе и специализированных (INA219).

А в текущем случае можно только снизить девиацию - делать перерасчёт не к 5в, а к текущему питанию (см. "секретный вольтметр на Arduino"), применением внешнего рефренсного источника напряжения (analogRefrence()) огрублением показаний и т.п.

nik182
Offline
Зарегистрирован: 04.05.2015

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

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

ArtHome пишет:

Подскажите способ усреднения.

школьную математику помните? - берете 10 значений, складываете, делите на 10

Почему обязательно надо "десятки тысяч" усреднять? и с усреднением по 10 значениям получите результат сушественно лучше, чем сейчас

ArtHome
ArtHome аватар
Offline
Зарегистрирован: 19.05.2018

DetSimen пишет:

Я про то, что, а нельзя, например, 5 раз в секунду мерить?  Нада обязательно несколько десятков тысяч раз? 

На самом деле на скрине в первом фото и есть результат такого подхода - каждые 100 мс измеряется значение, потом раз в секунду все складываются и делятся на 10. Как результат - уменьшение амплитуды, но в то же время появление артефактов с провалом левее надписи "3:00 РМ" - то есть стало только хуже. @b707 - тут школьной математики недостаточно, тут вузовская специализированная дисциплина "статистика" нужна, я так тоже пробовал, есть какая-то гармоника с периодом длиннее времени съёма 10 значений и внешне результат примерно такой же. Причина - нерепрезентативная выборка, то есть школьное усреднение работает только когда _все_ значения участвуют.

@sadman41, @nik182- спасибо!

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

В генераторе для катушки Мишина испробовал всё, вплоть до цифровых фильтров, остановился на INA219

ArtHome
ArtHome аватар
Offline
Зарегистрирован: 19.05.2018

ua6em пишет:

В генераторе для катушки Мишина испробовал всё, вплоть до цифровых фильтров, остановился на INA219

Хм, выглядит заманчиво - за ту же цену примерно в $1 я получу вместо аналогового датчика напряжения цифровой датчик и тока и напряжения и без проблем с шумом?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

ArtHome пишет:

ua6em пишет:

В генераторе для катушки Мишина испробовал всё, вплоть до цифровых фильтров, остановился на INA219

Хм, выглядит заманчиво - за ту же цену примерно в $1 я получу вместо аналогового датчика напряжения цифровой датчик и тока и напряжения и без проблем с шумом?

на токе 1 ампер пульсации в районе 4миллиампер, но это смотря какой выбрать метод усреднения (средствами INA219), по напряжению особо не заморачивался, не было надобности, одна десятая меня вполне устроила, насколько точно измеряет в цепях с постоянной нагрузкой не испытывал (шумы)

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

1.Возьмите голый микроконтроллер и разведите АЦП как написано в даташите (в ардуине сильно упрощено).

2. Возьмите хороший фильтр (например Чебышева 4-го порядка) с частотой среза скажем в 40 герц, чтобы отрезать помехи от сети питания и примените. Будет гладенькая кривая. Фильтр можно сделать аппаратный или программный (ссылка на программный была здесь на форуме).

SLKH
Offline
Зарегистрирован: 17.08.2015

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

1.Возьмите голый микроконтроллер и разведите АЦП как написано в даташите (в ардуине сильно упрощено).

2. Возьмите хороший фильтр (например Чебышева 4-го порядка) с частотой среза скажем в 40 герц, чтобы отрезать помехи от сети питания и примените. Будет гладенькая кривая. Фильтр можно сделать аппаратный или программный (ссылка на программный была здесь на форуме).

"Вызывает антирес" : а на фига всё это? Только для красивой картинки?

"Напряжение у меня действительно меняется в течение суток от 12,1V до 11,3V (это АКБ с солнечной панелью)." - ну и будет меняться. Любые наши фильтры напряжение аккумулятора не изменят. Если мы не собираемся как-то использовать результаты измерений - просто игнорировать разброс показаний, пока он в приемлемых пределах.

Был бы стрелочный вольтметр - никаких проблем не было бы...

https://ae01.alicdn.com/kf/HTB1dKV1XfjsK1Rjy1Xaq6zispXar.jpg

 

SLKH
Offline
Зарегистрирован: 17.08.2015

sadman41 пишет:

Аппаратно как раз и решается - правильным разведением питания, применением отдельных АЦП (PCF8591), в том числе и специализированных (INA219).

А в текущем случае можно только снизить девиацию - делать перерасчёт не к 5в, а к текущему питанию (см. "секретный вольтметр на Arduino"), применением внешнего рефренсного источника напряжения (analogRefrence()) огрублением показаний и т.п.

Точность ардуинского АЦП - порядка 0,2%. В обсуждаемом случае этот параметр усугубляется делителем с К==0,18, т.е. получаем допустимое отклонение +/- 50 мв без учета нестабильности питания, помех и прочего. В любом случае лучше МЗР (~25 mv) мы не получим.

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

ArtHome пишет:

Приобрёл на алиэкспрессе "voltage sensor Vcc<25" Описание http://henrysbench.capnfatz.com/henrys-bench/arduino-voltage-measurements/arduino-25v-voltage-sensor-module-user-manual/

Сделал всё по описанию по толковой ссылке выше, после увидел такую картинку.

 

Напряжение у меня действительно меняется в течение суток от 12,1V до 11,3V (это АКБ с солнечной панелью). Две недели мне потребовалось на то, чтобы выяснить, что дрезебг порождает не контроллер солнечной батареи, а погрешность измерения - осциллограф никакого разброса в 0,1V не показывает, а ардуина его выдаёт при каждом обращении к `analogRead(A0);`

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

"Простейшее усредненее" - двоешик! А 10% погрешности? Или Вы не на али покупали?

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

ArtHome пишет:

На самом деле на скрине в первом фото и есть результат такого подхода - каждые 100 мс измеряется значение, потом раз в секунду все складываются и делятся на 10. Как результат - уменьшение амплитуды, но в то же время появление артефактов с провалом левее надписи "3:00 РМ" - то есть стало только хуже. 

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

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

ArtHome пишет:

На самом деле на скрине в первом фото и есть результат такого подхода - каждые 100 мс измеряется значение, потом раз в секунду все складываются и делятся на 10. Как результат - уменьшение амплитуды, но в то же время появление артефактов с провалом левее надписи "3:00 РМ"

с чего вы взяли. что провал левее надписи 3РМ - это артефакт округления? судя по масшатбу графика, длительность этого "артефакта" - минуты. если не десятки минут. совершенно очевидно, что секундное округление такого эффекта не даст. Ищите другое обьяснение этим скачкам - скорее всего физическое, если это солнечная батарея - может в это время тучка набежала или кто-то тряпку на панель повесил

vlad072
Offline
Зарегистрирован: 01.08.2017

Боролся c шумом так. Делаю 8 измерений, каждому измерению присваиваю номер диапазона. Каждое очередное значение измерения сравнивается с предыдущими, и если оно отличается от какого то менее чем на заданную величину, то ему присваивается тот же номер диапазона. Потом значения самого "многочисленного" диапазона усредняются. 

    int adc(int pin) {
      int  _readings[8] = {0,0,0,0,0,0,0,0};
      byte _ranges[8]   = {0,1,2,3,4,5,6,7};
      for (byte _readnum = 0; _readnum < 8; _readnum++) {
        _readings[_readnum] = analogRead(pin);
        if (_readnum)
          for (byte _prev = 0; _prev < _readnum; _prev++)
            if (abs(_readings[_readnum] - _readings[_prev]) < 5) {
              _ranges[_readnum] = _ranges[_prev];
              break;
            }
      }
      byte _toprange = 0; byte _topcount = 0;
      for (byte _rangenum = 0; _rangenum < 8; _rangenum++) {
        byte _counter = 0;
        for (byte _readnum = 0; _readnum < 8; _readnum++)
          if (_ranges[_readnum] == _rangenum) _counter++;
        if (_counter > _topcount) _topcount = _counter, _toprange = _rangenum;
      }
      int  _average  = 0;
      for (byte _readnum = 0; _readnum < 8; _readnum++)
        if (_ranges[_readnum] == _toprange) _average += _readings[_readnum];
      _average /= _topcount;
      return _average;
    }

Ну и само собой R-C фильтр никто не отменял. Но в моём случае он не спасает, сходит сума датчик тока на эффекте холла, и внешние помехи приводят к шумам сопоставимым с самим измеряемым значением.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

vlad072 пишет:

Ну и само собой R-C фильтр никто не отменял. Но в моём случае он не спасает, сходит сума датчик тока на эффекте холла, и внешние помехи приводят к шумам сопоставимым с самим измеряемым значением.

Как-то все очень сложно. Да АЦП у ардуины не верх совершентсва, но у вас скорее проблемы в железе. При нормальных условиях и не слишком быстро меняющейся величине обычного усреднения вполне достаточно.

Во-первых ваш делитель рассчитан на 25 вольт а вы меряете в районе 12. Подберите делитель на 15 вольт. И сделайте сопротивления с минимально допустимой величиной. Высокое сопротивление на входе приводит к повышенной ловли шумов. 

Во-вторых, а как именно все подключено? Длинные ли провода? Экранирование есть?

В-третьих причем здесь датчик тока? И даже если он есть, как наличие, скажем, небольшого керамического кондесатора паралельно входу АЦП может сводить сума датчик тока подключенный к другому каналу? 

sadman41
Offline
Зарегистрирован: 19.10.2016

А у него датчик на ACS712. Он сам по себе вещь специфическая.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

sadman41 пишет:

А у него датчик на ACS712. Он сам по себе вещь специфическая.

Вроде речь шла об измерении напряжения на аккумуляторе? Да и даже если еще меряется и ток по другому каналу, то как RC фильтр на канале напряжения повлияет на ACS712 который в другое место подключен?

ArtHome
ArtHome аватар
Offline
Зарегистрирован: 19.05.2018

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

1.Возьмите голый микроконтроллер и разведите АЦП как написано в даташите (в ардуине сильно упрощено).

Дайте пожалуйста ссылку на нужный даташит/схему? Я просто не могу оценить адекватность результатов поиска (я программист и совсем начинающий радиолюбитель).

 

SLKH пишет:

 "Вызывает антирес" : а на фига всё это? Только для красивой картинки?

Данные используются для построения логики т.н. "умного дома", где триггеры запускают цепочки событий. А если даже на таком низовом уровне обстакановка состоит из, как говорится в одной поговорке: "мусор на входе -> мусор на выходе", то доверять свой быт и комфорт такому интернету вещей опасно.

 

asam пишет:

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

Спасибо за готовность читать код, общая схема подключения и простой скетч тут https://github.com/ArtHome12/ha_arduino_sh Именно на этой прошивке получен скриншот с первого поста. Как видно, там ещё есть аналогичный датчик тока с теми же болезнями. В правом нижнем углу Raspberry Pi с системой Home Assistant на борту обеспечивает доступ к данным через интернет и обновление на лету прошивки ардуины ну и другое.

b707 пишет:

с чего вы взяли. что провал левее надписи 3РМ - это артефакт округления? судя по масшатбу графика, длительность этого "артефакта" - минуты. если не десятки минут. совершенно очевидно, что секундное округление такого эффекта не даст. Ищите другое обьяснение этим скачкам - скорее всего физическое, если это солнечная батарея - может в это время тучка набежала или кто-то тряпку на панель повесил

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

vlad072 - спасибо за алгоритм, как я понял из обсуждения, сначала сделаю упор в аппаратную часть, а потом недостигнутое буду допиливать алгоритмически.

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

ArtHome пишет:

Дайте пожалуйста ссылку на нужный даташит/схему? Я просто не могу оценить адекватность результатов поиска (я программист и совсем начинающий радиолюбитель).

Самое лучшее решение  -даже не вытравить свою плату с грамотными разведёнными аналоговыми цепями. Лучшее решение существенно проще -купите нормальный модуль. Монитор тока и напряжения  INA226 идеален для вашей задачи. Имеет свой внутренний референс,  16 бит дельта-сигма АЦП, входное напряжение до 36 вольт без всяких делителей.  Ток измеряет как в минусовой цепи так и в плюсовой.   И всего 100 рублей.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

dimax пишет:

Самое лучшее решение  -даже не вытравить свою плату с грамотными разведёнными аналоговыми цепями. Лучшее решение существенно проще -купите нормальный модуль. Монитор тока и напряжения  INA226 идеален для вашей задачи.   И всего 100 рублей.

это да, по видимому еще и мощность считает )))

ArtHome
ArtHome аватар
Offline
Зарегистрирован: 19.05.2018

dimax, ua6em Спасибо, заказал

SLKH
Offline
Зарегистрирован: 17.08.2015

ArtHome пишет:

общая схема подключения тут https://github.com/ArtHome12/ha_arduino_sh

Жуть (я про "0").

 

 

ArtHome
ArtHome аватар
Offline
Зарегистрирован: 19.05.2018

SLKH пишет:

ArtHome пишет:

общая схема подключения тут https://github.com/ArtHome12/ha_arduino_sh

Жуть (я про "0").

Громоздко нарисовано или неграмотно скоммутировано?

anatoli_nik
Offline
Зарегистрирован: 17.01.2019

http://we.easyelectronics.ru/Theory/chestno-prostoy-cifrovoy-filtr.html

Нормально все усредняется. На моем стабилизаторе сетевого напряжения скачет не более 1 МЗР (около 0.5В при диапазоне до 400В).

Частота выборок около 1 ksps, постоянная фильтра около 0,5сек. 

SLKH
Offline
Зарегистрирован: 17.08.2015

ArtHome пишет:

SLKH пишет:

ArtHome пишет:

общая схема подключения тут https://github.com/ArtHome12/ha_arduino_sh

Жуть (я про "0").

Громоздко нарисовано или неграмотно скоммутировано?

Неграмотно. См. #19 и #21.

RC-фильтры не должны влиять на показания на чужих пинах.

 

/2 в файле ha_arduino_sh.ino

перед считыванием напряжения и тока (строки 102 и 103) поставь аналогреад с соответствующих пинов без использования считанных значений.

И константа 25.0 в стр. 137 весьма сомнительна.

sadman41
Offline
Зарегистрирован: 19.10.2016

asam пишет:

Да и даже если еще меряется и ток по другому каналу, то как RC фильтр на канале напряжения повлияет на ACS712 который в другое место подключен?

Я же не пишу, что на него именно RC влияет. Просто этот ACS712 реагирует на всё подряд.