Датчик тока ACS756 измерение переменного тока.

zhuki
Offline
Зарегистрирован: 12.10.2011

Собрал такой девайс. Датчик тока ACS756-100  ,DS2450 (АЦП 1-ware).

Всё вроде работает,но замеры здорово различаются. Датчик выдаёт синусоиду с осью в 2,5 вольта. Все выборки АЦП (100 замеров подряд) складываю в массив ,затем выбираю большее. Каждые 5 сек повторяю.

От цикла к циклу замеры тока нагрузки(ТЭН 2 Квт) отличаются на 10-15 % . Слишком много на мой взгляд.

Что я не так делаю. Если кто в теме подскажите, что делать

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
step962
Offline
Зарегистрирован: 23.05.2011

zhuki пишет:
Все выборки АЦП (100 замеров подряд) складываю в массив ,затем выбираю большее. Каждые 5 сек повторяю.

От цикла к циклу замеры тока нагрузки(ТЭН 2 Квт) отличаются на 10-15 % . Слишком много на мой взгляд.

Что я не так делаю. Если кто в теме подскажите, что делать


С какой частотой производите выборки?
С какой частотой изменяется измеряемый сигнал?
Вы уверены, что ваши 100 выборок покрывают хотя бы один полный цикл изменения сигнала? Другими словами, что время одной серии выборок больше или хотя бы равно периоду изменения измеряемого сигнала?

zhuki
Offline
Зарегистрирован: 12.10.2011

Ток меняет направление 50 раз в секунду. Понятно. Выборки имеют значения и >2.5 и <2.5 . Значит можно утверждать ,что цикл покрывается,да ещё и не один раз. Понятно по содержимому массива. Выборки без паузы поэтому ,через сколько времени сказать сложно. Тем более это 1-ware ,а не аналоговый пин.

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

Bim_Sony
Bim_Sony аватар
Offline
Зарегистрирован: 03.10.2012

zhuki пишет:

Собрал такой девайс. Датчик тока ACS756-100  ,DS2450 (АЦП 1-ware).

Всё вроде работает,но замеры здорово различаются. Датчик выдаёт синусоиду с осью в 2,5 вольта. Все выборки АЦП (100 замеров подряд) складываю в массив ,затем выбираю большее. Каждые 5 сек повторяю.

А можно код выложить сюда, да и схему подключения ICS - DS - Arduino

step962
Offline
Зарегистрирован: 23.05.2011

zhuki пишет:
Ток меняет направление 50 раз в секунду.

И еще раз: с какой частотой производится опрос значений?
Ведь можно банально в эффект Муара вляпаться, если частота сигнала и частота опроса имеют общие делители.
Цитата:
Выборки без паузы поэтому ,через сколько времени сказать сложно.

1. Засеките время, когда опрашивается первое значение.
2. Засеките время, когда опрашивается последнее значение. 3. Вычислите интервал, вычтя одно значение времени из другого.
4. Поделите количество промежутков между выборками (n-1, в вашем случае 99) на интервал времени. Частота получена.
5. Ну, и напоследок: ткните пальцем в пункт, вызывающий непреодолимые сложности. ;)
Цитата:

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

А что по этому поводу (по достижимой точности) говорит даташит? Там, вообще-то, обычно и содержится самая что ни на есть конкретная информация.

zhuki
Offline
Зарегистрирован: 12.10.2011

Спасибо за советы. Попробую со временем,но тут еще есть время преобразование АЦП и время на 1-ware. Но все равно попробовать не сложно и нужно. Что касается точности то в даташите указано 0,8% ,а у меня 10-15.Вот здесь и есть сложность.
Вечером код и схему выложу,сейчас никак на работе нахожусь.

step962
Offline
Зарегистрирован: 23.05.2011

zhuki пишет:
но тут еще есть время преобразование АЦП и время на 1-ware.

Эти накладные расходы также находятся в интервале времени Tbegin...Tend и естественным образом учитываются при расчете частоты выборки.

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Что Вам мешает выпрямить сигнал пред АЦП? Если сложно самому найти/придумать, могу нарисовать, Там 2 диода, 2 конденсатора и резистор. Если достаточно половины диапазона измерения, то 1 диод, 1 конденсатор, 1 резистор.  

zhuki
Offline
Зарегистрирован: 12.10.2011

Чего выпрямлять? Сигнал синусоиды колеблется от 1,5 до 3,5 вольта , а сгладишь в итоге 2,5 в получишь.Или я что то не понял?

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Конечно не понял :) Собирается обычный пиковый детектор. Если "однополупрериодный", то выходной сигнал будет в диапазоне 2.5-3.5 вольта, если "двуполупериодный", то 0-2 вольта (в этом случае постоянная состовляющая отфильтровывается).

Ладно, не буду тянуть себя за хвост ;). Сейчас нарисую. 

Вот:

zhuki
Offline
Зарегистрирован: 12.10.2011

Мне постоянная составляющая вовсеи не мешает. Не вижу смысла выпрямлять и тем более сглаживать. Датчик выдает напряжение в соответствии с током через него протекающий отношенмп 20мв/А , но ток за 1 период меняется с -12 А до +12А соответственно на выходе должно быть 12*0,02=0,24в к этому прибавляется еще смещение 2,5в . В итоге напряжение за один период меняется от 2,74 до 2,26. Оцифровав его с неким периодом и сделав 100 выборок получаю некую апроксимацию изменения тока. Если выбирать максимальные значения из этой массы ,то разница колеблется 10-15%. По даташиту датчика 0,8% .Так вот мой вопрос почему такое расхождение.

step962
Offline
Зарегистрирован: 23.05.2011

Пока вы на работе, сообщите хотя бы, какое Vref используете для измерения напряжения, изменяющегося в диапазоне 2,26...2,74?
Параметры вашего АЦП тоже не мешало бы выложить: разрядность? Точность? Vпит? Скорость преобразования?

zhuki
Offline
Зарегистрирован: 12.10.2011

Измеряет АЦП 1-ware микросхема DS2450 там нет опоры все внутри . Преобразование 12 бит питание 5в . Там все просто .

step962
Offline
Зарегистрирован: 23.05.2011

Там программируемое опорное напряжение 2,56 или 5,12 В ("Input Range" по даташиту). Сколько каналов используется? Один?

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

В том то ии дело, что постоянная составляющая мешает. Вы вынуждены пользоваться опорой 5,12В, а могли бы 2,56 (считайте, на 1 бит больше). Потом еще биения частоты выборки с частотой сети.  Сделайте выборку в массив за 1 секунду, постройте график, узнаете точную частоту выборки и увидете, у Вас биения частоты, или просто показания плавают. 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

 Я начинающий в Ардуино... Но не в радиоэлектронике. Что надо замерить-то ? Амплитуду ? Действующее значение ?

Мощность мгновенную на ТЭНе ? Тогда надо сто выборок синхронизировать с сетью, наверное ? Тока - не бейте !

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

 из #10 - можно и ток в нагрузке, и потребляемую мощность усреднить, сгладить - высчитать. Нет ?

zhuki
Offline
Зарегистрирован: 12.10.2011

Вот сделал выборку с временем получилась такая таблица. Всего 25 значений .

 

 

 

Как видно из графика достаточно стабильно. Но выборка идёт через 12-13 мс, быстрее никак 1-ware.

На самом деле ток замерянный токовыми клещами колеблется 7,35 - 7,65 Ампер,но это действующее значение ,а в таблице пиковое. И всё равно никак не совпадает  (коэф. 0.707).

Вот код который использую. Библиотек нет.


void setup(){
  Serial.begin(9600);
}


void GET_ACP()
{
   int  _1W_Pin, CRCRead, LowByte, HighByte, ADVal;
   _1W_Pin = 10;
   digitalWrite(_1W_Pin, LOW);
   pinMode(_1W_Pin, INPUT);
   Configure_2450(_1W_Pin);

   {
      OneWireReset(_1W_Pin);
      OneWireOutByte(_1W_Pin, 0xcc, 0);
      OneWireOutByte(_1W_Pin, 0x3c, 0);  // convert
      OneWireOutByte(_1W_Pin, 0x0f, 0);  // all channels
      OneWireOutByte(_1W_Pin, 0x01, 0);  // preset to all zeros

      CRCRead = FetchCRCBytes(_1W_Pin);

      while(1) // wait for conversion to complete
      {
         if(OneWireInByte(_1W_Pin) == 0xff)
         {
             break;
         }
      }

     // delay(1);

      OneWireReset(_1W_Pin);
      OneWireOutByte(_1W_Pin, 0xcc, 0);
      OneWireOutByte(_1W_Pin, 0xaa, 0);  // read memory
      OneWireOutByte(_1W_Pin, 0x00, 0);  // channel A
      OneWireOutByte(_1W_Pin, 0x00, 0);  // locations 0000 and 0001

      LowByte = OneWireInByte(_1W_Pin);
      HighByte = OneWireInByte(_1W_Pin);
      ADVal = HighByte*16 + LowByte/16;
      
      

       delay(25);
      Serial.print("Channel A  ");
      Serial.print(ADVal);
      Serial.print("  Current  ");
      Serial.print ((( ADVal / 4096.0 * 5.12)-2.5)/0.02);
      Serial.println(" A");
      
     
      LowByte = OneWireInByte(_1W_Pin);
      HighByte = OneWireInByte(_1W_Pin);
      ADVal = HighByte*16 + LowByte/16;

      Serial.print("?n");
      Serial.print("Channel B ");
      Serial.println(ADVal);

      LowByte = OneWireInByte(_1W_Pin);
      HighByte = OneWireInByte(_1W_Pin);
      ADVal = HighByte*16 + LowByte/16;

      Serial.print("?n");
      Serial.print("Channel C ");
      Serial.println(ADVal);

      LowByte = OneWireInByte(_1W_Pin);
      HighByte = OneWireInByte(_1W_Pin);
      ADVal = HighByte*16 + LowByte/16;

      Serial.print("?n");
      Serial.print("Channel D ");
      Serial.println(ADVal);
   
      //Volts = CSng(ADVal) / 4096.0 * 5.12

      delayMicroseconds(1);  // as appropriate
   }
   
}

void Configure_2450(int _1W_Pin)
{
   int CRCRead, Dummy;

   OneWireReset(_1W_Pin);
   OneWireOutByte(_1W_Pin, 0xcc, 0);
   OneWireOutByte(_1W_Pin, 0x55, 0);
   OneWireOutByte(_1W_Pin, 0x1c, 0);  // write to 001c
   OneWireOutByte(_1W_Pin, 0x00, 0);
   OneWireOutByte(_1W_Pin, 0x40, 0);  // Vcc operation

   CRCRead = FetchCRCBytes(_1W_Pin);
   Dummy = OneWireInByte(_1W_Pin); // readback the data

   OneWireReset(_1W_Pin);
   OneWireOutByte(_1W_Pin, 0xcc, 0);
   OneWireOutByte(_1W_Pin, 0x55, 0);
   OneWireOutByte(_1W_Pin, 0x08, 0);  // write beginning at  0008
   OneWireOutByte(_1W_Pin, 0x00, 0);

   OneWireOutByte(_1W_Pin, 0x0b, 0);  // channel A - 12 bits

   CRCRead = FetchCRCBytes(_1W_Pin);
   Dummy = OneWireInByte(_1W_Pin); // readback the data

   OneWireOutByte(_1W_Pin, 0x01, 0);	// 5.12 VDC range
   CRCRead = FetchCRCBytes(_1W_Pin);
   Dummy = OneWireInByte(_1W_Pin);

   OneWireOutByte(_1W_Pin, 0x0b, 0);	 //set up Channel B for 12 bit
   CRCRead = FetchCRCBytes(_1W_Pin);
   Dummy = OneWireInByte(_1W_Pin);

   OneWireOutByte(_1W_Pin, 0x01, 0);	// 5.12 VDC range
   CRCRead = FetchCRCBytes(_1W_Pin);
   Dummy = OneWireInByte(_1W_Pin);

   OneWireOutByte(_1W_Pin, 0x0b, 0);	 //set up Channel C for 12 bit
   CRCRead = FetchCRCBytes(_1W_Pin);
   Dummy = OneWireInByte(_1W_Pin);

   OneWireOutByte(_1W_Pin, 0x01, 0);	// 5.12 VDC range
   CRCRead = FetchCRCBytes(_1W_Pin);
   Dummy = OneWireInByte(_1W_Pin);

   OneWireOutByte(_1W_Pin, 0x0b, 0);	 //set up Channel D for 12 bit
   CRCRead = FetchCRCBytes(_1W_Pin);
   Dummy = OneWireInByte(_1W_Pin);

   OneWireOutByte(_1W_Pin, 0x01, 0);	// 5.12 VDC range
   CRCRead = FetchCRCBytes(_1W_Pin);
   Dummy = OneWireInByte(_1W_Pin);
}

int FetchCRCBytes(int _1W_Pin)
{
   int x, y, CRC;

   x = OneWireInByte(_1W_Pin);
   y = OneWireInByte(_1W_Pin);
   CRC = CRC * y + x;
   return(CRC);
}


void OneWireReset(int _1W_Pin) // reset.  Should improve to act as a presence pulse
{
     digitalWrite(_1W_Pin, LOW);
     pinMode(_1W_Pin, OUTPUT); // bring low for 500 us
     delayMicroseconds(500);
     pinMode(_1W_Pin, INPUT);
     delayMicroseconds(500);
}

void OneWireOutByte(int _1W_Pin, byte d, byte strong) // output byte d (least sig bit first).
{
   byte n;

   for(n=8; n!=0; n--)
   {
      if ((d & 0x01) == 1)  // test least sig bit
      {
         digitalWrite(_1W_Pin, LOW);
         pinMode(_1W_Pin, OUTPUT);
         delayMicroseconds(5);
         pinMode(_1W_Pin, INPUT);
         delayMicroseconds(60);
      }
      else
      {
         digitalWrite(_1W_Pin, LOW);
         pinMode(_1W_Pin, OUTPUT);
         delayMicroseconds(60);
         pinMode(_1W_Pin, INPUT);
      }

      d=d>>1; // now the next bit is in the least sig bit position.
   }
   if(strong)
   {
       digitalWrite(_1W_Pin, HIGH); // One sec of strong +5 VDC
       pinMode(_1W_Pin, OUTPUT);
       delay(1000);
       pinMode(_1W_Pin, INPUT);
       digitalWrite(_1W_Pin, LOW);
   }
}

byte OneWireInByte(int _1W_Pin) // read byte, least sig byte first
{
    byte d, n, b;

    for (n=0; n<8; n++)
    {
        digitalWrite(_1W_Pin, LOW);
        pinMode(_1W_Pin, OUTPUT);
        delayMicroseconds(5);
        pinMode(_1W_Pin, INPUT);
        delayMicroseconds(5);
        b = digitalRead(_1W_Pin);
        delayMicroseconds(50);
        d = (d >> 1) | (b<<7); // shift d to right and insert b in most sig bit position
    }
    return(d);
}
void loop()
{
 GET_ACP(); 
}

 

 

zhuki
Offline
Зарегистрирован: 12.10.2011

Вот после некоторых манипуляций с выбросами значений ,приведения к действующему значению и передачи за пределы Ардуино.Внешняя программа сформировала график потребления тока, период примерно 6 сек. На графике примерно 30 мин Параллельно на столе стоят включённые токовые клещи. Клещи показывают более стабильно в пределах 7,16  7,81 ,больших значений я не замечал,меняется примерно раз в секунду. График выглядит так.

Всё таки несовпадение есть ,кто врёт сложно сказать. Но считаю ,что пользоваться этим можно.

Цель, измерение потребляемого тока на входе в частный дом, а также по веткам потребления при относительном удалении от контроллера(10-15м). В последствии планиуется сделать приоретизацию по потреблению в случаях перегрузок.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

 Зависимости от удаления потребителя тока не может быть ! ...не считая потери на кабелях !

Сначала надо усреднить по схеме #10 - потом анализировать, моя мнение.....

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

 Вы же измеряете случайном образом амплитудное значение тока....

Усредните, умножте на 0,707 - и совпадёт со значением клещей контрольных.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

 Никто не врёт ! 

Мгновенные значения и усреднённые с клещей - сравнивать нельзя...

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

 Вы оцифровываете мгновенными значениями ток в нагрузке. Это будет синусоида. Зачем ? Чтобы потом тратить время на вычисления ? Диоды и кондёр ( и резистор ) эту задачу решают быстрее.... Или я не понял задачу..... :(

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

 Вам нужно знать ток, потребляемый ТЭНом, и мощность ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

 На графике из #19 вы видите БИЕНИЯ частоты сети и частоты Ваших измерений тока.... Трудно анализировать :(

zhuki
Offline
Зарегистрирован: 12.10.2011

1.По поводу удаления. Вы сидите у сервера в своей квартире, но хотите знать потребляемый ток на входе в дом. Ваши действия.
2.Пиковые значения выдает датчик вместе с АЦП ,там никак сгладить нельзя будет ошибка, пробовал.
3.На графике с красной линией уже действующее значение т.е. пиковое умноженное на 0,707 и оно практически совпадает с замерами клещами. За исключением неаоторых выбросов 10 -15 %.
Если есть конкретные предложения или реальные схемные решения буду рад .

carduino.ru
Offline
Зарегистрирован: 06.12.2011
AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

Метод из #27 - правильный, но только для варианта синуса, для случая, когда не используется фазовое управление нагрузкой. И  подходит для нашего случая косвенно, т.к. используется внешний АЦП. Нужно аналогичным образом ловить середину полупериода и как-то запускать внешний АЦП. На счет "быстрее никак" - не соглашусь. Нужно смотреть даташит на АЦП, а ускорить 1-wire можно, попадалась где-то библиотечка "быстрого 1wire" на прямом управлении портами. Поищите.