Показания acs712

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем user999, 22 мар 2017.

  1. user999

    user999 Гик

    Добрый вечер!

    Подключил датчик тока acs712 на 30А.
    Скетч взял отсюда: http://circuits4you.com/2016/05/13/ac-current-measurement-acs712/
    Код (C++):
    /*
    Measuring AC Current Using ACS712
    www.circuits4you.com
    */

    const int sensorIn = A0;
    int mVperAmp = 185; // use 100 for 20A Module and 66 for 30A Module

    double Voltage = 0;
    double VRMS = 0;
    double AmpsRMS = 0;

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

    void loop(){

    Voltage = getVPP();
    VRMS = (Voltage/2.0) *0.707;  //root 2 is 0.707
    AmpsRMS = (VRMS * 1000)/mVperAmp;
    Serial.print(AmpsRMS);
    Serial.println(" Amps RMS");
    }

    float getVPP()
    {
      float result;
      int readValue;             //value read from the sensor
      int maxValue = 0;          // store max value here
      int minValue = 1024;          // store min value here
     
       uint32_t start_time = millis();
       while((millis()-start_time) < 1000) //sample for 1 Sec
       {
           readValue = analogRead(sensorIn);
           // see if you have a new maxValue
           if (readValue > maxValue)
           {
               /*record the maximum sensor value*/
               maxValue = readValue;
           }
           if (readValue < minValue)
           {
               /*record the minimum sensor value*/
               minValue = readValue;
           }
       }
     
       // Subtract min from max
       result = ((maxValue - minValue) * 5.0)/1024.0;
         
       return result;
    }
    Проверил на различной нагрузке, получились следующие результаты при напряжении 225V
    С чем могут быть связаны такие большие погрешности?
     
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    При диапазоне датчика 0...30А вы пытаетесь измерить в диапазоне 0...0,44 А. На грани чувствительности.
    Надо было брать датчик на 5 А.
     
  3. user999

    user999 Гик

    Согласен, но все же. Это особенность датчика или в чем то еще дело?
     
  4. Tomasina

    Tomasina Сушитель лампочек Модератор

    Гм, попробую другими словами.
    analogRead(sensorIn); это диапазон всего в 1024 единицы, т.е. дискретность измерений равна 30:1024=0,029 А.
    Это означает, что показания могут быть только такими: 0 А; 0,029 А; 0,059 А; 0,088 А; 0,117 А и т.д.
    Промежуточных значений НЕТ.
    Точность можно повысить, если взять Arduino классом выше, где analogRead имеет диапазон 0...4096 (вроде это Arduino Duo / Zero).
    Математически можно "притянуть" показания в промежуточные значения (сглаживание или овересемплинг), но это, во-первых, увеличит инерционность системы (отображение показаний не в реале, а которые были 5-50 измерений назад), во-вторых, расчеты, основанные на таких грубых исходных данных, не могут гарантировать достоверность (нужную вам точность).
     
    Последнее редактирование: 22 мар 2017
    user999 нравится это.
  5. user999

    user999 Гик

    Все понятно. Но еще вопрос. Почему а analogRead без нагрузки выдает какие то значения. В моем случае получается 0,131 А?
     
  6. Tomasina

    Tomasina Сушитель лампочек Модератор

    по отзывам, сам датчик acs712 нестабилен в выдаче показаний, плавают они от любых внешних электромагнитных воздействий.
     
  7. user999

    user999 Гик

    есть такое, но без нагрузки 0,131 стабильно
     
  8. Onkel

    Onkel Гуру

    Это какие поля должны быть! Я ни разу не замечал, чтобы какая- либо помеха срубила asc712.
     
  9. Sergey_555

    Sergey_555 Нуб

    Попробуйте встречное включение 2 ACS712 и АЦП 1115. Это конечно немного более громоздко в аппаратном плане, но точность измерения не соизмерима с Ардуино АЦП:

     
  10. sslobodyan

    sslobodyan Гик

    Не забывайте, что нулевой ток дает на выходе 712 почти половину питания. И эту погрешность надо калибровать. Отключите нагрузку, замерьте напряжение на 712 и это значение потом всегда берите за референсное, т.е. отнимайте его от всех измерений.