Этот репозиторий содержит библиотеку C ++ C ++ для Arduino. С помощью этой библиотеки можно рассчитать среднее значение и среднеквадратичное значение (среднее квадрат корня) или эффективное значение входного сигнала ADC. Эта библиотека также рассчитывает реальную , кажущуюся мощность и коэффициент мощности как от напряжения, так и тока входных сигналов. Из версии 1.3 в проект был добавлен уровень энергии.
Напряжение и представление напряжения тока могут быть измерены с помощью ADC Arduino с использованием соответствующей входной схемы для масштабирования измеренных величин до предела соответствующего диапазона напряжения 0-5 В в АЦП. В предоставленном решении используется простой метод масштабирования измеренных величин. Пользователь должен только определить полномасштабное значение пикового пикового напряжения и тока переменного тока. Когда единицы измеренных величин определяются в вольтах и ампер, то рассчитанная мощность находится в ватте, а энергия в WS (джоулс). Эта библиотека легкая портативная для других платформ.
Внедрены следующие классы библиотеки:
AverageRmsRms2PowerPower2Среднее значение вычисляет среднее значение из ряда входных выборок (обычно) из АЦП. RMS или RMS2 предназначены для расчета среднего значения квадратного квадрата сигнала, а мощность или мощность2 предназначены для вычисления мощности как по напряжению, так и по входу тока.
RMS2 и Power2 работают лучше при использовании в подпрограмме обслуживания прерывания путем распределения бремени обработки по временным интервалам образца. Количество образцов для одного среднеквадратичного запуска (сканирование) определяется как окно . RMS2 и Power2 занимают один дополнительный промежуток времени (длина окна +1), когда включен параметр «Автоматическая базовая реставрация» (BLR_ON).
Существуют следующие методы:
begin()start()stop()update()update1()update2()publish() Для быстрого начала проверьте пример набросок Arduino, которые поставляются с библиотекой.
Это шаги, которые нужно следовать для успешной реализации:
begin() . Этот метод предназначен для инициализации, и он нуждается в вводе, чтобы установить масштабирование единиц измерения, размер окна отбора проб, количество бит использованного АДК (или входного сигнала) и режима сбора (непрерывное сканирование/однократное сканирование).start() , чтобы начать приобретение.update() (или update1() + update2() для Power2 ) многократно с постоянной скоростью.publish() , чтобы получить результаты. Для Power2 Class Update () разбито на update1() и update2() . update1() должен быть вызван первым для обработки выборки из входного напряжения и update2() для обработки выборки из входного тока или Vica Versa (ток напряжения). Напряжение отбора проб и ток обычно происходит в последовательности для мультиплексного АЦП.
Для среднего использования класса:
void begin(float range, unsigned char window, unsigned char nob, bool mode);
С:
range является максимальным ожидаемым полным поворотом входного сигнала переменного тока (значение пикового пика).window длиной окна образца, выраженное в целом количестве образцов.nob - это битовое разрешение входного сигнала (глубина бита ADC). Используйте предопределенные константы: ADC_8BIT , ADC_10BIT или ADC_12BIT .mode устанавливает режим для непрерывного сканирования или отдельного сканирования. Используйте предрассудные константы CNT_SCAN или SGL_SCAN . void start(void); Этот метод запускает получение для непрерывного сканирования и режима однократного сканирования.
void stop(void); Этот метод останавливает приобретение.
void update(int instVal); Назначьте текущее значение выборки.
void publish(void); Опубликуйте результат (ы) из последнего завершенного запуска приобретения. Результаты находятся в выходной переменной (ы), как определено дальше.
Общественные определенные переменные:
int instVal - значение последней приобретенной выборки
float average - результат среднего значения
bool acquire - бит статуса, правда, когда сканирование находится на рассмотрении.
Для использования RMS или RMS2 класса:
void begin(float range, unsigned char window, unsigned char nob, bool blr, bool mode);
С:
range является максимальным ожидаемым полным поворотом AC-сигнала (значение пикового пика).window Длина окна образца, выраженная в целом количестве образцов.nob - это битовое разрешение входного сигнала, обычно это глубина бита ADC. Используйте предопределенные константы: ADC_8BIT , ADC_10BIT или ADC_12BIT .blr устанавливает функцию автоматического базового восстановления или выключение. Используйте предрассудные константы BLR_ON или BLR_OFF .mode устанавливает режим для непрерывного сканирования или отдельного сканирования. Используйте предрассудные константы CNT_SCAN или SGL_SCAN . void start(void); Этот метод запускает получение для непрерывного сканирования и режима однократного сканирования.
void stop(void); Этот метод останавливает приобретение.
void update(int instVal); Назначьте текущее значение выборки.
void publish(void); Опубликуйте результат (ы) из последнего завершенного запуска приобретения. Результаты находятся в выходной переменной (ы), как определено дальше.
Общественные определенные переменные:
int instVal - значение последнего приобретенного образца, восстановленное в базовой линии, когда BLR_ON
float rmsVal - результат значения среднеквадратичного значения
int dcBias - значение DCBIAS в ADC -единицах. Актуально только тогда, когда BLR_ON
bool acquire - бит статуса, правда, если сканирование находится на рассмотрении
Для использования мощности класса:
void begin(float range1, float range2, unsigned char window, unsigned char nob, bool blr, bool mode);
С:
range1, range2 -это максимальный ожидаемый полной разгромы AC-сигнала (значение пика к пике) напряжения и тока.window Длина окна образца, выраженная в целом количестве образцов.nob - это битовое разрешение входного сигнала, обычно это глубина бита ADC. Используйте предсказанные константы: ADC_8BIT , ADC_10BIT или ADC_12BIT .blr устанавливает функцию автоматического базового восстановления или выключение. Используйте предрассудные константы BLR_ON или BLR_OFF .mode устанавливает режим для непрерывного сканирования или отдельного сканирования. Используйте предрассудные константы CNT_SCAN или SGL_SCAN . void start(void); Этот метод запускает получение для непрерывного сканирования и режима однократного сканирования.
void stop(void); Этот метод останавливает приобретение.
void update(int instVal1, int instVal2); Назначьте текущие значения выборки (например, напряжение и ток) одновременно.
void publish(void); Опубликуйте результат (ы) из последнего завершенного запуска приобретения. Результаты находятся в выходной переменной (ы), как определено дальше.
Общественные определенные переменные:
int instVal1 - значение последнего приобретенного образца (напряжение), восстановленное в базовой линии, когда BLR_ON
int instVal2 - значение последней приобретенной выборки (ток), восстановленное в базовой линии, когда BLR_ON
float rmsVal1 - rms value1 (напряжение)
float rmsVal2 - среднеквадратичное значение2 (ток)
int dcBias1 - значение DCBIAS1 в ADC -единицах. Актуально только тогда, когда BLR_ON
int dcBias2 - значение DCBIAS2 в ADC -единицах. Актуально только тогда, когда BLR_ON
float apparentPwr - очевидная сила
float realPwr - настоящая сила
float pf - коэффициент мощности
float energy - Netto Energy
bool acquire - бит статуса, правда, если сканирование находится на рассмотрении
Для класса Power2 Использование:
void begin(float range1, float range2, unsigned char window, unsigned char nob, bool blr, bool mode);
С:
range1, range2 -это максимальный ожидаемый полной разгромы AC-сигнала (значение пика к пике) напряжения и тока.window Длина окна образца, выраженная в целом количестве образцов.nob - это битовое разрешение входного сигнала, обычно это глубина бита ADC. Используйте предсказанные константы: ADC_8BIT , ADC_10BIT или ADC_12BIT .blr устанавливает функцию автоматического базового восстановления или выключение. Используйте предрассудные константы BLR_ON или BLR_OFF .mode устанавливает режим для непрерывного сканирования или отдельного сканирования. Используйте предрассудные константы CNT_SCAN или SGL_SCAN . void start(void); Этот метод запускает получение для непрерывного сканирования и режима однократного сканирования.
void stop(void); Этот метод останавливает приобретение.
void update1(int instVal); Назначьте текущее значение выборки, например, для напряжения.
void update2(int instVal); Назначьте текущее значение выборки, например, для текущего. Call update1() и update2() поочередно в цикле выборки.
void publish(void); Опубликуйте результат (ы) из последнего завершенного запуска приобретения. Результаты доступны из выходной переменной (ы), как определено дальше.
Общественные определенные переменные:
int instVal1 - значение последнего приобретенного образца (напряжение), восстановленное в базовой линии, когда BLR_ON
int instVal2 - значение последней приобретенной выборки (ток), восстановленное в базовой линии, когда BLR_ON
float rmsVal1 - rms value1 (напряжение)
float rmsVal2 - среднеквадратичное значение2 (ток)
int dcBias1 - значение DCBIAS1 в ADC -единицах. Актуально только тогда, когда BLR_ON
int dcBias2 - значение DCBIAS2 в ADC -единицах. Актуально только тогда, когда BLR_ON
float apparentPwr , очевидная сила
float realPwr - настоящая сила
float pf - коэффициент мощности
float energy - Netto Energy
bool acquire - бит статуса, правда, если сканирование находится на рассмотрении
Rms gridVolt;
void setup() {
...
gridVolt.begin(700, 40, ADC_10BIT, BLR_ON, CNT_SCAN);`
...
}
Аргументы означают:
Полный диапазон ADC (от 0 до 5 волнов) представляет значение сигнала пика до пика 700 В. Это равняется амплитуде сигнала 350 В или 247,5 В.
Окно RMS составляет 40 образцов, что означает, что окно покрывает два цикла 50 Гц, когда скорость отбора проб была выбрана в 1000 образцов/сек.
Разрешение битов АЦП составляет 10 -битное (arduino uno).
BLR_ON означает, что базовая реставрация включается. Чтобы захватить AC-сигнал с помощью ADC, нулевое значение сигнала должно быть сдвинуто к средней точке ADC-диапазона, добавив напряжение OFTSet DC с входной схемой ADC. Это смещение должно быть исправлено впоследствии в программном обеспечении путем вычитания постоянного значения из полученного значения ADC. Эта коррекция может быть сделана автоматически с BLR_ON, и калибровка не требуется. На рисунке 1 синяя линия указывает на максимальный масштабированный входной сигнал с качанием напряжения 5 В и смещена на 2,5 В. Зеленая линия показывает входной сигнал с амплитудой 1 В и измеряет 1 В/SQRT (2) = 0,71 дюйма.

С помощью опции CNT_SCAN приобретение установлено в непрерывном режиме. Приобретение будет перезагружаться автоматически после завершения последнего сканирования.
Вызовать gridVolt.update(adcVal); из основного цикла или из рутины службы прерывания (ISR). Убедитесь, что цикл повторяется с постоянной скоростью.
Получите результаты с gridVolt.publish() и получите среднеквадратичное значение: float Voltage = gridVolt.rmsVal;
void loop() { // loop must run at 1kHz
...
adcValue = analogRead(AN0); // read the ADC.
gridVolt.update(adcValue);
counter++;
if(counter >= 500) { // publish every 0.5s
gridVolt.publish();
Voltage = gridVolt.rmsVal;
counter = 0;
}
...
while(loop_timer_not_expired) {1}
...
}
Measure_avg.ino - Этот пример показывает, как вычислить среднее значение сигнала, измеренное с помощью АЦП.
Measure_rms.ino - В этом примере определено значение среднеквадратичного значения входного напряжения АЦП.
AC_powermeter.ino - Этот пример демонстрирует полное применение измерения переменного тока. Он нуждается в как напряжении, так и представлении напряжения тока в качестве входного ввода на двух АЦП-каналах. Он вычисляет среднеквадратичные значения напряжения и тока, кажущуюся мощность, реальная мощность и коэффициент мощности.
AC_powermeter_advanced.ino - Этот пример также демонстрирует полное применение измерения переменного тока. Он работает на основе прерывания для получения лучших стабильных показаний. Напряжение и ток отображаются при 3 кГц. Когда светодиод Arduino горит, ADC -клипы (слишком высокое пиковое напряжение входного входа) или DC смещают его из диапазона.
Energy_metering.ino показывает напряжение, ток, реальную энергию и чистую энергию в WH.
Самый простой способ взаимодействия высокого напряжения AC с Arduino ADC-это использование датчика напряжения, например, датчик напряжения LV 25-P от LEM USA Inc. Этот датчик обеспечивает гальваническую изоляцию, масштабирование и смену уровня в одном пакете. Для определения тока LEM также производит LEM_LA55-P , с теми же преимуществами, что и для датчика напряжения.
Если предпочитает создавать цепи масштабирования входных средств из дискретных компонентов, в примечании примечания примечание примечание Tiduay6c.pdf, которое принадлежит конструкции справочной конструкции инвертора источника напряжения от Texas Instruments Incorporated. Обратите внимание на предупреждения! Предлагаемые цепи могут быть легко адаптированы к диапазону 0-5 В для Arduino.
Всегда используйте изоляционный трансформатор для безопасности!
3-фадное измерение мощности.
Много времени было сохранено при разработке этой библиотеки с использованием альтернативного Slaeber Arduino-ead. Slaeber - замечательный плагин Arduino для Eclipse. Спасибо Jantje и его участникам!