Настройка частоты считывания кода датчика тока SCT013 с помощью Arduino Uno

Я нашел этот код ниже для платформы Arduino, чтобы получить измерения тока с датчика SCT013, и мне интересно, как я могу определить «задержку» или «частоту» моих показаний? Я бы искал 200 Гц.

Код:

//
#include "EmonLib.h"                   // Включить библиотеку Emon
EnergyMonitor emon1;                   // Создать экземпляр

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

  emon1.current(5, 60);             // Ток: входной контакт, калибровка.
  //калибровка описана ниже
}

void loop()
{
  double Irms = emon1.calcIrms(1480);  // Рассчитать только Irms

  Serial.print(Irms*230.0);        // Полная мощность
  Serial.print(" ");
  Serial.println(Irms);            // Irms
}
//

, 👍0


2 ответа


1

Вы пропускаете чтение, если последнее чтение было менее 1000/200 = 5 мс назад.

unsigned long lastRead;

void loop()
{
   unsigned long currentMillis = millis();
   if(currentMillis - lastRead >= 5){

      double Irms = emon1.calcIrms(1480);  // Рассчитать только Irms

      Serial.print(Irms*230.0);        // Полная мощность
      Serial.print(" ");
      Serial.println(Irms);            // Irms
      lastRead = currentMillis;
    }

}
,

0

Если вам нужна частота дискретизации 200 Гц, этот код вам не подойдет.

В этой строке: double Irms = emon1.calcIrms(1480); вы делаете 1480 выборок так быстро, как только может Arduino.

Если вам нужна частота дискретизации 200 Гц, считывайте аналоговый пинг каждые 5 мс с помощью функции millis(). И когда у вас будет достаточно выборок, вы сможете вычислить среднеквадратичный ток https://en.wikipedia.org/wiki/Root_mean_square

Это пример кода:

unsigned int sample_time = 0;
int readings[200];  //число выборок 200
int i = 0;

setup() {
}

loop() {
    if (millis() - sample_time > 5){
        readings[i] = readAnalog(A0);
        i++;
        sample_time = millis();
    }
    if (i > 200)
         Caculate_Irms();
         i = 0;
}
,