Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Измерение любого переменного тока с помощью ACS712

Компоненты и расходные материалы

Arduino UNO
× 1
OLED i²c 128x32
× 1
ACS712 30A
× 1
ЖК-дисплей 16x2 i²c
× 1

Об этом проекте

ПОЖАЛУЙСТА, БУДЬТЕ ОСТОРОЖНЫ, ЕСЛИ ВЫ ИСПОЛЬЗУЕТЕ ЛИНИЮ ПИТАНИЯ

Здравствуйте, и добро пожаловать в другой учебник, это об измерении переменного тока (AC) с использованием ACS712. Я использую версию на 30 ампер, которая представляет собой ACS712 30A, и нашу прекрасную плату Arduino Uno, я пытался добавить OLED-экран, но, к сожалению, закончился. я сломал его во время съемки учебника, поэтому я переключился на ЖК-дисплей, но ниже вы найдете проводку и коды для обеих версий.

И под «Any AC…» я имею в виду, что мы увидим код / ​​библиотеку, которая работает для всех типов сигналов, а не только для синусоидального сигнала, и наш амперметр сможет вычислить ИСТИННЫЙ СРЕДНИЙ КВАДРАТ корня. И обратите внимание, что датчик использует эффект Холла (создание разности напряжений на электрическом проводнике, поперек электрического тока в проводнике и приложенного магнитного поля, перпендикулярного току)

Вы можете объединить этот проект с этим:Простое измерение напряжения переменного тока с помощью Arduino и ZMPT101B

Испытания будут проводиться на лампе накаливания, управляемой диммером, последовательно соединенным с эталонным мультиметром и модулем датчика тока ACS712.

Вот план:

  • Сначала нам нужно связать наш модуль с платой Arduino и проверить форму сигнала, когда диммер включен - полный цикл - полупериод.
  • Затем мы проверим простой код, который не требует какой-либо библиотеки, но работает только с сигналом Sinewaves (он будет протестирован).
  • После этого мы увидим код, который будет измерять TRMS переменного тока и использовать ЖК-дисплей.

Детали

Пожалуйста, будьте осторожны при выборе ACS712, не пытайтесь перестраховаться, как это сделал я (купив версию на 30 А), это приведет к большим колебаниям, когда вы попытаетесь использовать его для домашнего использования или для небольших усилителей, так что вот для меня подойдет версия 5A или 10A. Также обратите внимание, что 30A или 20A… также повлияют на вашу калибровку, но это объясняется в видео и в комментариях к кодам.

Это те детали, которые я использовал, вы можете заменить UNO любой совместимой платой или этот ЖК-дисплей i²c на OLED или любой другой дисплей, который вам больше нравится.

Тест 1

Электропроводка и код

Схема подключения для проверки 1 приведена ниже (Схема 1) вместе с кодом (Код 1).

Результаты

Загрузите код и запустите последовательный плоттер, вы должны увидеть синусоидальный сигнал, красная линия покажет, когда я выключил диммер, и ток начал принимать ту форму, которую вы обычно обнаруживаете в симисторе.

Тест 2

Теперь, если вы хотите измерить ток, используя только приведенный выше код, вы получите значения около 512–511, они вообще не отражают среднеквадратичное значение. Итак, чтобы измерить среднеквадратичное значение сигнала, мы будем использовать ту же схему подключения, что и выше, но теперь нам нужен другой код, который может вычислить среднеквадратичное значение.

Подключение и код

Схема такая же, как (Подключение 1), но с другим кодом, который можно найти ниже (Код 2).

Результаты

Как вы можете видеть, значения слева (RMS) такие же, как и значение, измеренное мультиметром, справа это значения от пика до пика, и обратите внимание, что диммер находится в полном цикле, поскольку я использую лампу мощностью 75 Вт и 230 В переменного тока / 50 Гц.

!!!!!!!!!!!!!!!! НО !!!!!!!!!!!!!!!!!!!!!

Здесь я полностью выключил свой диммер, что означает, что у меня примерно 1/4 цикла, мультиметр дает мне 0,21 А, но мой код дает мне 0,36 А, код все еще измеряет от пика до пика, но как вы можете видеть выше, мой сигнал не является линейным, когда я полностью убираю диммер.

И в этом разница между измерением TRMS и измерением, которое работает только с синусоидальным сигналом.

Тест 3

Теперь вы видите проблему в приведенном выше коде, но, к счастью, здесь есть библиотека, я очень ценю эту библиотеку за всю работу, которую она выполняет, потому что, как вы знаете, если вы хотите рассчитать значение RMS, вам нужно использовать интегральное исчисление, и этого сложно добиться на электронной плате разработки, вы можете проверить файл cpp библиотеки, чтобы увидеть, какие методы используются, например, «Среднее», «Сигма»… Вещи, связанные со статистикой / вероятностями…

Электропроводка код и библиотека

Электропроводка такая же, как и проводка, использованная выше (Электропроводка 1), а ниже вы можете найти код (Код 3).

А здесь вы можете скачать библиотеку фильтров:Загрузите библиотеку здесь

Результаты

Правильные результаты находятся посередине, левые без калибровки, а правые используются для демонстрации того, как калибровать (посмотрите видео).

Как вы видели, огромная разница между двумя кодами в ответ на нелинейный сигнал, но второй действует как мультиметр TRMS.

Тест с ЖК-экраном / OLED

Здесь мы сохраняем те же вещи, что и все, что мы делаем, это вместо использования последовательного монитора мы можем использовать ЖК-дисплей или OLED

Электропроводка коды и библиотеки

Подключения можно найти ниже (Wiring_LCD) и (Wiring_OLED), коды также ниже (Code_ACS712_LCD) и (Code_ACS712_OLED).

Вот библиотеки OLED

https://github.com/adafruit/Adafruit_SSD1306https://github.com/adafruit/Adafruit-GFX-Library

А вот LCD_i2c_library

https://drive.google.com/file/d/1Oc56q2GPs5SOA-PdbVHHSxKCnI9KY5xd/view

Результат

Это единственный тест, который я смог провести, потому что я сломал свой OLED-экран, пытаясь снять видеоурок. В целом это работает так же, как мы видели раньше, просто отображается на ЖК-экране i²c. (Да, значения TRMS, а не метод размаха).

Это все, ребята, я надеюсь, вам понравился этот урок, не забудьте полюбить видеоурок и подписаться на канал SurtrTech, если вы хотите выразить поддержку, большое вам спасибо.

Любой вопрос оставляйте в комментариях.

Код

  • Code_1.ino
  • Code_2.ino
  • Code_3.ino
  • Code_ACS712_LCD.ino
  • Code_ACS712_OLED.ino
Code_1.ino Arduino
Этот код предназначен для тестирования модуля и визуализации формы сигнала
 / * Этот код работает с датчиком тока ACS712, он позволяет считывать необработанные данные. Лучше использовать его с последовательным плоттером. Подробнее на www.surtrtech.com * / #define Current_sensor A0 // Датчик аналогового входа pinfloat i; void setup () {Serial.begin (9600); pinMode (Current_sensor, INPUT);} void loop () {i =analogRead (Current_sensor); Serial.println (i); задержка (100); // Изменение или удаление задержки изменит способ отображения сигнала // установите его, пока не получите правильную форму синусоиды} 
Code_2.ino Arduino
Этот код использует метод измерения размаха для вычисления RMS синусоидального сигнала
 / * Этот код работает с датчиком тока ACS712, он позволяет рассчитать RMS синусоидального переменного тока * он использует размах до пика метод вычисления RMS * Для получения дополнительной информации посетите www.surtrtech.com * / #define SAMPLES 300 // Количество выборок, которые вы хотите брать каждый раз при выполнении цикла # define ACS_Pin A0 // Вывод данных ACS712 для входного потока High_peak, Low_peak; // Переменные для измерения или вычисления плавучести Amps_Peak_Peak, Amps_RMS; void setup () {Serial.begin (9600); pinMode (ACS_Pin, ВХОД); // Определяем режим вывода} void loop () {read_Amps (); // Запускаем функцию read_Amps Amps_RMS =Amps_Peak_Peak * 0.3536 * 0.06; // Теперь у нас есть значение от пика до пика. Обычно формула требует умножения только на 0,3536 // но поскольку значения будут очень большими, вы должны умножить их на 0,06, вы можете сначала не использовать его, // сделайте свои вычисления и сравните их с реальные значения, измеренные амперметром. например:0,06 =Действительное значение / Измеренное значение Serial.print (Amps_RMS); // Здесь я показываю среднеквадратичное значение и значение от пика до пика, вы можете распечатать все, что хотите, и добавить символ "A" ... Serial.print ("\ t"); Serial.println (Amps_Peak_Peak); delay (200);} void read_Amps () // функция read_Amps вычисляет разницу между высоким и низким пиками {// получает значение от пика до пика int cnt; // Счетчик High_peak =0; // Сначала мы предполагаем, что наш высокий пик равен 0, а низкий пик равен 1024, да, инвертированный Low_peak =1024; for (cnt =0; cnt  High_peak) // Если это значение выше верхнего пика (сначала 0) {High_peak =ACS_Value; // Верхний пик изменится с 0 на найденное значение} if (ACS_Value  
Code_3.ino Arduino
Этот код использует статистические формулы для вычисления TRMS сигнала независимо от sape и отображает его на последовательном мониторе
 / * Этот код работает с датчиком тока ACS712, он позволяет вычислять TRMS сигнала * Посетите www.surtrtech.com для более подробной информации * / # include  // Эта библиотека выполняет огромную работу по проверке наличия файла .cpp #define ACS_Pin A0 // Вывод данных датчика на аналоговом входе A0 float ACS_Value; // Здесь мы сохраняем значения необработанных данных float testFrequency =50; // частота тестового сигнала (Гц) float windowLength =40.0 / testFrequency; // как долго усреднять сигнал, для statististfloat intercept =0; // настраивается на основании калибровочного тестирования float slope =0,0752; // для настройки на основе калибровочного тестирования // Пожалуйста, посмотрите обучающее видео по ACS712 от SurtrTech, чтобы узнать, как их получить, потому что это зависит от вашего датчика, или посмотрите ниже float Amps_TRMS; // расчетный фактический ток в амперахunsigned long printPeriod =1000; // в миллисекундах // Отслеживаем время в миллисекундах с момента последнего чтения unsigned long previousMillis =0; void setup () {Serial.begin (9600); // Запускаем последовательный порт pinMode (ACS_Pin, INPUT); // Определяем режим вывода} void loop () {RunningStatistics inputStats; // создаем статистику для просмотра необработанного тестового сигнала inputStats.setWindowSecs (windowLength); // Устанавливаем длину окна while (true) {ACS_Value =analogRead (ACS_Pin); // считываем аналог в значении:inputStats.input (ACS_Value); // регистрируемся в функции статистики if ((unsigned long) (millis () - previousMillis)> =printPeriod) {// каждую секунду мы выполняем расчет previousMillis =millis (); // время обновления Amps_TRMS =intercept + slope * inputStats.sigma (); Serial.print ("\ t Ампер:"); Serial.print (Amps_TRMS); }}} / * О наклоне и пересечении * Сначала вам нужно знать, что все вычисления TRMS выполняются функциями из библиотеки, это значение "inputStats.sigma ()" * Сначала вы можете отобразить этот "inputStats.sigma" () "в качестве значения TRMS, затем попробуйте измерить его, используя его, когда входной сигнал составляет 0,00A * Если измеренное значение равно 0, как у меня, вы можете оставить точку пересечения как 0, иначе вам нужно будет добавить или вычесть, чтобы сделать это значение, равное 0 * Другими словами «уберите смещение» * Затем включите питание до известного значения, например, используйте лампочку или светодиод, мощность которых вам известна, и вы уже знаете свое напряжение, так что немного вычислим вы получите теоретические значения ампер * вы разделите это теоретическое значение на измеренное значение, и вот вы получили наклон, теперь разместите их или измените их * / 
Code_ACS712_LCD.ino Arduino
Этот код использует метод расчета TRMS и отображает его на ЖК-дисплее i²c
 / * Этот код работает с ACS712 и ЖК-ic * Он измеряет TRMS переменного тока и отображает значение на экране * Посетите www.SurtrTech.com для более подробной информации * / # include  // Эта библиотека проделывает огромную работу, проверяет свой .cpp файл # include  // Библиотека ЖК-микросхем # define ACS_Pin A0 // Вывод данных ACS712 # define I2C_ADDR 0x27 // Адрес I2C, вы должны использовать код для сканирования адреса сначала (0x27) здесь # define BACKLIGHT_PIN 3 // Объявление выводов ЖК-дисплея # define En_pin 2 # define Rw_pin 1 # define Rs_pin 0 # define D4_pin 4 # define D5_pin 5 # define D6_pin 6 # определить D7_pin 7LiquidCrystal_I2C lcd (I2C_ADDR, En_pin, Rw_pin, Rs_pin, D4_pin, D5_pin, D6_pin, D7_pin); // Объявление lcdfloat testFrequency =50; // частота тестового сигнала (Гц) float windowLength =40.0 / testFrequency; // как долго усреднять сигнал, для statististfloat intercept =0; // настраивается на основании калибровочного тестирования float slope =0,0752; // для настройки на основе калибровочного тестирования // Пожалуйста, посмотрите обучающее видео по ACS712 от SurtrTech, чтобы узнать, как их получить, потому что это зависит от вашего датчика, или посмотрите ниже float Amps_TRMS; float ACS_Value; беззнаковый длинный printPeriod =1000; беззнаковый длинный previousMillis =0; void setup () {digitalWrite (2, HIGH); lcd.begin (16,2); lcd.setBacklightPin (BACKLIGHT_PIN, ПОЛОЖИТЕЛЬНЫЙ); lcd.setBacklight (ВЫСОКИЙ); // Подсветка подсветки lcd.home (); } void loop () {RunningStatistics inputStats; // создаем статистику для просмотра необработанного тестового сигнала inputStats.setWindowSecs (windowLength); while (истина) {ACS_Value =analogRead (ACS_Pin); // считываем аналог в значении:inputStats.input (ACS_Value); // регистрируемся в функции статистики if ((unsigned long) (millis () - previousMillis)> =printPeriod) {// каждую секунду мы выполняем расчет previousMillis =millis (); // время обновления Amps_TRMS =intercept + slope * inputStats.sigma (); // Калибровка значений lcd.clear (); // очищаем ЖК-дисплей и печатаем в определенной позиции lcd.setCursor (2,0); lcd.print (Amps_TRMS); lcd.print («А»); }}} / * О наклоне и пересечении * Сначала вам нужно знать, что все вычисления TRMS выполняются функциями из библиотеки, это значение "inputStats.sigma ()" * Сначала вы можете отобразить этот "inputStats.sigma" () "в качестве значения TRMS, затем попробуйте измерить его, используя его, когда входной сигнал составляет 0,00A * Если измеренное значение равно 0, как у меня, вы можете оставить точку пересечения как 0, иначе вам нужно будет добавить или вычесть, чтобы сделать это значение, равное 0 * Другими словами «уберите смещение» * Затем включите питание до известного значения, например, используйте лампочку или светодиод, мощность которых вам известна, и вы уже знаете свое напряжение, так что немного вычислим вы получите теоретические значения ампер * вы разделите это теоретическое значение на измеренное значение, и вот вы получили наклон, теперь разместите их или измените их * / 
Code_ACS712_OLED.ino Arduino
Этот код использует метод расчета TRMS и отображает значение на OLED.
 / * Этот код работает с ACS712 и OLED ic * Он измеряет TRMS переменного тока и отображает значение на экране * Посетите www.SurtrTech. com для более подробной информации * / # include  // Эта библиотека выполняет огромную работу по проверке своего .cpp файла # include  // Библиотеки OLED # include  #define ACS_Pin A0 # define SCREEN_WIDTH 128 // Ширина OLED-дисплея в пикселях # define SCREEN_HEIGHT 32 // Высота OLED-дисплея в пикселях #define OLED_RESET -1 // Сброс вывода № (или -1, если используется общий вывод сброса Arduino) float testFrequency =50; // частота тестового сигнала (Гц) float windowLength =40.0 / testFrequency; // как долго усреднять сигнал, для statististfloat intercept =0; // настраивается на основании калибровочного тестирования float slope =0,0752; // для настройки на основе калибровочного тестирования // Пожалуйста, посмотрите обучающее видео по ACS712 от SurtrTech, чтобы узнать, как их получить, потому что это зависит от вашего датчика, или посмотрите ниже float Amps_TRMS; float ACS_Value; беззнаковый длинный printPeriod =1000; unsigned long previousMillis =0; отображение Adafruit_SSD1306 (SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); // Объявление отображаемого имени (display) void setup () {display.begin (SSD1306_SWITCHCAPVCC, 0x3C); // Запускаем OLED-дисплей display.clearDisplay (); display.display ();} void loop () {RunningStatistics inputStats; // создаем статистику для просмотра необработанного тестового сигнала inputStats.setWindowSecs (windowLength); while (истина) {ACS_Value =analogRead (ACS_Pin); // считываем аналог в значении:inputStats.input (ACS_Value); // регистрируемся в функции статистики if ((unsigned long) (millis () - previousMillis)> =printPeriod) {// Выполняем вычисления каждые 1 с previousMillis =millis (); // время обновления Amps_TRMS =intercept + slope * inputStats.sigma (); display.clearDisplay (); display.setTextSize (3); display.setTextColor (БЕЛЫЙ); display.setCursor (15,10); display.print (Amps_TRMS); display.println («А»); display.display (); }}} / * О наклоне и пересечении * Сначала вам нужно знать, что все вычисления TRMS выполняются функциями из библиотеки, это значение "inputStats.sigma ()" * Сначала вы можете отобразить этот "inputStats.sigma" () "в качестве значения TRMS, затем попробуйте измерить его, используя его, когда входной сигнал составляет 0,00A * Если измеренное значение равно 0, как у меня, вы можете оставить точку пересечения как 0, иначе вам нужно будет добавить или вычесть, чтобы сделать это значение, равное 0 * Другими словами «уберите смещение» * Затем включите питание до известного значения, например, используйте лампочку или светодиод, мощность которых вам известна, и вы уже знаете свое напряжение, так что немного вычислим вы получите теоретические значения ампер * вы разделите это теоретическое значение на измеренное значение, и вот вы получили наклон, теперь разместите их или измените их * / 

Схема

Используемая проводка тестов 1,2 и 3 Использовать ЖК-дисплей i²c Используйте OLED 128x32

Производственный процесс

  1. Как измерить качество воздуха на OpenSensors
  2. Мониторинг CO2 с помощью датчика K30
  3. Слепоглухое общение с 1Sheeld / Arduino
  4. Управление монетоприемником с помощью Arduino
  5. Arduino с Bluetooth для управления светодиодом!
  6. Емкостной датчик отпечатков пальцев с Arduino или ESP8266
  7. Игра с дисплеем Nextion
  8. Роботизированная рука, управляемая нунчук (с Arduino)
  9. Анимация рта Билли Басса с любым источником звука
  10. Измерение солнечной радиации с помощью Arduino