Страница 1 из 1

измерение переменного тока

Добавлено: 16 сен 2018, 19:40
qbq
есть ESP8266 esp12f к ней через делитель подключен датчик тока ACS712 на 20А

есть модуль
Датчик_тока_ACS712_(CODE).ubi
в модуле прописываю контакт 0 так как аналоговый вход всего один -А0
на выходе блока всегда 00.0 что бы я не делал

пробовал делать как в проекте КНС -
kns.jpg
с разными вариациями - результат - прыгают показания в очень широких пределах

читал в спецификации на модуль, что при работающем радиомодуле возможны проблемы с АЦП, пробовал отключать - результат тот же
надежды все же возлагаю на готовый блок пользователя Датчик_тока_ACS712_(CODE) - помогите его запустить на ESP8266 - что там не так?


самоделка очень простая реле, датчик тока, датчик температуры (то же блок на С - сразу нормально пошел!)

измерение переменного тока

Добавлено: 16 сен 2018, 22:41
kalobyte
так это же датчик холла, он не может измерять переменный ток, его от магнитного поля калбасит
ну и в есп ацп какой-то кривой что ли, неправильно напряжение измеряет после запятой, вроде погрешность 200мв была, точно не помню уже

измерение переменного тока

Добавлено: 16 сен 2018, 23:41
qbq
форма напряжения на выходе датчика повторяет форму тока
дело в ПО

ацп не айс это точно опорник не очень и помехи от радиочасти

все же нужно попробовать = нужно разобратся что бы блок работал с esp8266

измерение переменного тока

Добавлено: 17 сен 2018, 18:17
Skull
Переменное напряжение меряется совершенно не так, как постоянка. Однозначно нужны или прерывания или большая выборка. Почитать принцип можно тут: https://habr.com/post/321008/

измерение переменного тока

Добавлено: 17 сен 2018, 20:04
qbq
как я понял в пользовательском блоке это реализовано

но не работает почему то

Код: Выделить всё

int sensorValue;
    int sensorMax = 0;
    uint32_t start_time = millis();
    while((millis()-start_time) < Interval)
    {
        sensorValue = analogRead( Input );
        if (sensorValue > sensorMax) 
        {
          sensorMax = sensorValue;
        }
    }
    return sensorMax;

это то что в этом блоке - номер пина Input время выборки Interval

расчет эффективного значения и от значения АЦП - 512 - постоянное напряжение на датчике отнимается

Код: Выделить всё

if ( EN ) {
int sensor_max;
    sensor_max = getMaxValue();
    amplitude =(float)(sensor_max-512)/1024* value *1000000;
    effective = amplitude /1.414;
value коэффициент для датчиков на 5 20 30а он разный





вот ссылка для информации - http://mysensors.ru/forum/viewtopic.php ... %D0%B0#p87

измерение переменного тока

Добавлено: 17 сен 2018, 20:31
Skull
Такой расчет (512- середина значений АЦП 10 бит)связан с тем, что аналоговые датчики дают половину напруги питания при нуле тока. Это позволяет отследить как положительную, так и отрицательную полуволну.
А методика расчета в кусочке программы больше похожа на поиск максимума амплитуды напряжения. Это очень неточный метод измерения тока. Потому как работает только на идеальной синусоиде. Чтобы правильно вычислить ток или напряжение нужно применять TrueRMS метод, это по сути вычисление площади, описаной кривой тока или напряжения.

измерение переменного тока

Добавлено: 17 сен 2018, 20:46
qbq
да я это понимаю - я реализовать не могу
поэтому прошу помощи


нужно вычислить амплитудное значение - пусть даже для синуса дальше уже проще

там что то в коде не то

измерение переменного тока

Добавлено: 17 сен 2018, 21:58
Skull
Это надо просить кого из местных, кто шарит в Си-подобном языке Ардуины. Я сиим шаманством не владею)) Поэтому, могу помочь только с теорией и схемотехникой )
Не понятно, что такое value и мульйон и откудова они берутся

измерение переменного тока

Добавлено: 17 сен 2018, 22:00
qbq
вот скетч из примера работает

помогите его в блок пользовательский упаковать

Код: Выделить всё

/****************************************************************************/
 // Function: Measure the amplitude current of the alternating current and
 // the effective current of the sinusoidal alternating current.
 // Hardware: Grove - Electricity Sensor
 // Date: Jan 19,2013
 // by www.seeedstudio.com
 #define ELECTRICITY_SENSOR A0 // Analog input pin that sensor is attached to
 float amplitude_current; //amplitude current
 float effective_value; //effective current
 void setup()
 {
 Serial.begin(9600);
 pins_init();
 }
 void loop()
 {
 int sensor_max;
 sensor_max = getMaxValue();
 Serial.print("sensor_max = ");
 Serial.println(sensor_max);
 //the VCC on the Grove interface of the sensor is 5v
 amplitude_current=(float)sensor_max/1024*5/800*2000000;
 effective_value=amplitude_current/1.414;//minimum_current=1/1024*5/800*2000000/1.414=8.6(mA)
 //Only for sinusoidal alternating current
 Serial.println("The amplitude of the current is(in mA)");
 Serial.println(amplitude_current,1);//Only one number after the decimal point
 Serial.println("The effective value of the current is(in mA)");
 Serial.println(effective_value,1);
 }
 void pins_init()
 {
 pinMode(ELECTRICITY_SENSOR, INPUT);
 }
 /*Function: Sample for 1000ms and get the maximum value from the SIG pin*/
 int getMaxValue()
 {
 int sensorValue; //value read from the sensor
 int sensorMax = 0;
 uint32_t start_time = millis();
 while((millis()-start_time) < 1000)//sample for 1000ms
 {
 sensorValue = analogRead(ELECTRICITY_SENSOR);
 if (sensorValue > sensorMax)
 {
 /*record the maximum sensor value*/
 sensorMax = sensorValue;
 }
 }
 return sensorMax;
 }

измерение переменного тока

Добавлено: 17 сен 2018, 22:27
Skull
Таким способом мерить переменку все равно не получится )
Это неправильное вычисление ))
Вернее, правильное, но в идеальнейшем случае )
Предполагают, что при использовании analogRead () аналоговое опорное напряжение равно 5.0В, но в действительности оно может быть другим.
на разных ПК при питании от USB напряжение пина 5V на Arduino составляет около 4.5В; при питании от аккумулятора типа «Крона» (8.4В) — 4.97В. А измерения в представленном коде пляшут от питания, как опорного напряжения.
Можно использовать встроенный опорный генератор. , предварительно его откалибровав.
Делается это так:
Сначала устанавливаем опорное (reference) напряжение в значение Vcc
Измеряем внутреннее опорное напряжение
Рассчитываем величину Vcc
Наше измеренное напряжение:
Vcc * (АЦП-измерение) / 1023
которое, как мы знаем равно 1.1В. Согласно даташиту на ATMEGA 328 оно может быть равно:
минимально 1.0В,
обычно 1.1В,
максимально 1.2В.
Далее рассчитываем Vcc и получаем:
Vcc = 1.1 * 1023 / АЦП-измерение
Другими словами, вся фишка в том, чтобы выяснить реальное напряжение питания Vcc, читая internal 1.1V reference и используя Vcc в качестве эталона. Затем с помощью простой математики высчитываем реальное Vcc.Это эталонное значение будет индивидуальным для конкретного AVR чипа и будет зависеть от колебаний температуры. А вообще, для таких измерений нужен внешний источник опорного напряжения)

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

измерение переменного тока

Добавлено: 18 сен 2018, 00:33
qbq
датчик_тока_(CODE).ubi
вот что слепил

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

Отправлено спустя 25 минут 1 секунду:
Датчик_тока_ACS712work_(CODE).ubi
исправил вроде

Отправлено спустя 18 минут 17 секунд:
максимальное_с_AI_(CODE).ubi
без привязки к датчику - просто выход амплитудного значения и эффективного с выбранного AI

измерение переменного тока

Добавлено: 18 сен 2018, 08:00
Sancho
[spoiler]
Skull писал(а): 17 сен 2018, 22:27Предполагают, что при использовании analogRead () аналоговое опорное напряжение равно 5.0В, но в действительности оно может быть другим.
на разных ПК при питании от USB напряжение пина 5V на Arduino составляет около 4.5В; при питании от аккумулятора типа «Крона» (8.4В) — 4.97В. А измерения в представленном коде пляшут от питания, как опорного напряжения.
Можно использовать встроенный опорный генератор. , предварительно его откалибровав.
Делается это так:
Сначала устанавливаем опорное (reference) напряжение в значение Vcc
Измеряем внутреннее опорное напряжение
Рассчитываем величину Vcc
Наше измеренное напряжение:
Vcc * (АЦП-измерение) / 1023
которое, как мы знаем равно 1.1В. Согласно даташиту на ATMEGA 328 оно может быть равно:
минимально 1.0В,
обычно 1.1В,
максимально 1.2В.
Далее рассчитываем Vcc и получаем:
Vcc = 1.1 * 1023 / АЦП-измерение
Другими словами, вся фишка в том, чтобы выяснить реальное напряжение питания Vcc, читая internal 1.1V reference и используя Vcc в качестве эталона. Затем с помощью простой математики высчитываем реальное Vcc.Это эталонное значение будет индивидуальным для конкретного AVR чипа и будет зависеть от колебаний температуры. А вообще, для таких измерений нужен внешний источник опорного напряжения)

И вот когда это получится, кто-нибудь из местных переведет или объяснит как перевести программу в пользовательский блок.
То, что в программе сейчас- это не измеритель, а показометр. С не сильно отличающейся точностью, от результата, который Вас не удовлетворил.
[/spoiler]
Не совсем согласен, а именно:
При питании датчика(пост 1) от того-же источника напряжения, 5 вольт, он (датчик) при нуле на входе выдаёт половину напряжения питания, какое-бы оно не было, 4-5в, середина диапазона, 512, также соответствуют Vcc/2. При понижении питания изменяется и размерность выходного напряжения мВ/А, также, как и у входного АЦП ардуинки. Как итог - почти неизменные показания при изменении питания в разумных пределах. Опорное = Vcc.
Поправьте, если не прав.

измерение переменного тока

Добавлено: 18 сен 2018, 08:49
Skull
Поправлю)
Предложенный Вами вариант будет работать, если питание с датчика завести на ножку Aref контроллера и включить внешнюю опору. У Ардуины на нем просто висит конденсатор. Это если не учитывать разное, типа запаздывания реакции датчика на ток и ацп на дрейф напруги, кои постоянно есть в датчике из-за переменки и внутри проца при изменении тока потребления ядра )
Можете для эксперимента подключить к аналоговому входу батарейку и померить ее несколько раз при Vref=Vcc))
В лучшем случае получите неравномерность в 4 отсчета АЦП, что будет соответствовать дрейфу напряжения в 0.0195 В. Пересчитайте это в А через крутизну передачи для нужной модели ACS712.
ЗЫ. Почитайте, что у людей на постоянке от солнечной батареи происходит:
viewtopic.php?f=44&t=2723

измерение переменного тока

Добавлено: 21 сен 2018, 07:08
qbq
есть проблема

при обработке блока чтения с аналогового входа - виснет wifi!!!!!!!!!!!!!!!

пришлось мудрить с интервалами опроса - и то каждый 5-10 пинг пропадает!!!

измерение переменного тока

Добавлено: 21 сен 2018, 08:50
aidar_i
Почитайте
здесь