Добрый вечер! Подключил датчик тока 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 С чем могут быть связаны такие большие погрешности?
При диапазоне датчика 0...30А вы пытаетесь измерить в диапазоне 0...0,44 А. На грани чувствительности. Надо было брать датчик на 5 А.
Гм, попробую другими словами. 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 измерений назад), во-вторых, расчеты, основанные на таких грубых исходных данных, не могут гарантировать достоверность (нужную вам точность).
Все понятно. Но еще вопрос. Почему а analogRead без нагрузки выдает какие то значения. В моем случае получается 0,131 А?
по отзывам, сам датчик acs712 нестабилен в выдаче показаний, плавают они от любых внешних электромагнитных воздействий.
Попробуйте встречное включение 2 ACS712 и АЦП 1115. Это конечно немного более громоздко в аппаратном плане, но точность измерения не соизмерима с Ардуино АЦП:
Не забывайте, что нулевой ток дает на выходе 712 почти половину питания. И эту погрешность надо калибровать. Отключите нагрузку, замерьте напряжение на 712 и это значение потом всегда берите за референсное, т.е. отнимайте его от всех измерений.