цифровая электроника
вычислительная техника
встраиваемые системы

 


Измеритель мощности на основе ESP32 своими руками

Автор: Mike(admin) от 13-12-2020, 23:55

Измерение энергетического КПД с помощью ESP32


Все мы знаем о вольтметрах, амперметрах и ваттметрах – трех основных вещах, которые вам нужны для измерения электрических значений в любых электронных проектах или схемах. Измерение напряжения и тока с помощью мультиметра может быть хорошим началом, но одна из самых больших проблем, с которыми многие сталкиваются при тестировании схемы – это измерение мощности или энергоэффективности (энергетического КПД).


Измеритель мощности на основе ESP32 своими руками

Итак, сегодня мы решим эту проблему, создав измеритель КПД на базе ESP32, который может измерять входное напряжение, входной ток, выходное напряжение и выходной ток. Следовательно, он может измерять входную мощность и выходную мощность одновременно, и с этими значениями мы можем легко измерить КПД.


Вместо того, чтобы покупать четыре счетчика, мы сможем решить эту проблему, объединив возможности всех четырех счетчиков в одном устройстве. Создание цифрового измерителя энергии не только снижает стоимость, но и дает вам простор для обновлений и улучшений. Поскольку мы используем ESP32 для создания этого проекта, мы можем легко включить этот измеритель в проект Интернета вещей и регистрировать данные через Интернет, что является темой для будущего проекта.


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


Измеритель мощности на основе ESP32 своими руками

Принципиальная схема измерителя энергии на основе ESP32 показана далее.


Измеритель мощности на основе ESP32 своими руками

Работа схемы очень проста. В этом проекте мы будем измерять напряжение и ток, но уникальным способом. Мы измеряем напряжение и ток как на входе, так и на выходе, поэтому мы можем видеть КПД схемы. Это очень удобно для некоторых проектов. Примером может быть преобразователь постоянного тока в постоянный, где измерение КПД становится обязательным.


Как вы можете видеть на следующем изображении, мы используем микросхему датчика тока ACS712 для измерения тока. Это очень интересная ИС, поскольку она использует эффект Холла для измерения тока. На рынке есть три варианта этой ИС (5А, 20А и 30А). Мы используем вариант 20А, он обозначен как ACS712-20.


Измеритель мощности на основе ESP32 своими руками

В документации на ACS712 рекомендуется диапазон напряжений 4,5–5,5 для бесперебойной работы. И поскольку мы собираемся измерять ток с помощью ESP32, он допускает только 3,3 В, поэтому мы использовли делитель напряжения с двумя резисторами 10 кОм, чтобы понизить выходное напряжение микросхемы ACS712. Когда ток не течет через ИС, он выдает 2,5 В, а когда через ИС проходит некоторое количество тока, он либо снижает напряжение, либо увеличивает напряжение в зависимости от направления потока тока. Мы использовали две из этих микросхем для измерения входного и выходного тока.


Для измерения входного и выходного напряжения у нас есть два делителя напряжения на входе и выходе схемы. Максимальное напряжение, которое может измерить схема, составляет 35 В, но его можно легко изменить, изменив значения резистора для делителя напряжения.


Измеритель мощности на основе ESP32 своими руками

Стандартный стабилизатор напряжения LM7805 используется для питания микросхем ESP32, OLED и ACS712. Поскольку мы включаем его с довольно чистым по форме напряжением, развязывающие конденсаторы не используются, но мы использовали конденсаторы емкостью 100 мкФ как на входе, так и на выходе для стабилизации микросхемы.


Измеритель мощности на основе ESP32 своими руками

Мы использовали ESP32 в качестве основного процессора, который отвечает за все показания, вычисления, вводы и выводы. Кроме того, мы использовали OLED-дисплей 128X64, чтобы узнавать значения в реальном времени.


Измеритель мощности на основе ESP32 своими руками

Печатная плата для нашего измерителя КПД на базе ESP32 спроектирована на односторонней плате.


Измеритель мощности на основе ESP32 своими руками

После создания платы методом ЛУТ, ее пайки и монтажа вся конструкция может выглядеть следующим образом:


Измеритель мощности на основе ESP32 своими руками

Теперь, когда у нас есть хорошее понимание аппаратной части, мы можем открыть Arduino IDE и начать программирование. Код предназначен для считывания аналогового напряжения с контактов 35 и 33 платы ESP32. Кроме того, мы считываем напряжение с контактов 32 и 34, которые дают значение тока. Как только мы это сделаем, мы можем умножить эти величины, чтобы получить входную мощность и выходную мощность, и, применив эти показатели к формуле КПД, мы можем получить значение КПД. Наконец, мы отображаем его на ЖК-экране.



#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <math.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define INPUT_VOLTAGE_SENSE_PIN 33
#define OUTPUT_VOLTAGE_SENSE_PIN 35
#define INPUT_CURRENT_SENSE_PIN 32
#define OUTPUT_CURRENT_SENSE_PIN 34
float  R1_VOLTAGE = 68000;
float  R2_VOLTAGE = 6800;
#define R1_Current 10000
#define R2_Current 22000
double mVperAmp = 50; 
double ACSoffset = /*1130*/ 1136;
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
void setup() {
  Serial.begin(115200);
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    for (;;);
  }
  delay(2000);
  display.clearDisplay();
  display.setRotation(2);
  display.setTextSize(1);
  display.setTextColor(WHITE);
  display.setCursor(0, 10);
  display.println("Hello, world!");
  display.display();
  delay(100);
}
void loop()
{
  //double a,b,c;
  //  a = analogRead(INPUT_CURRENT_SENSE_PIN);
  //  Serial.print("a: ");
  //  Serial.println(a);
  //  b = (a / 4095) * 3300;
  //  Serial.print("b: ");
  //  Serial.println(b);
  //  c = ((b - ACSoffset) / mVperAmp) ;
  //  Serial.print("c: ");
  //  Serial.println(c);
  //  Serial.print("Final: ");
  //  Serial.println(return_current_value(INPUT_CURRENT_SENSE_PIN));
  //  delay(700);
  float input_voltage = abs(return_voltage_value(INPUT_VOLTAGE_SENSE_PIN)) ;
  float input_current = abs(return_current_value(INPUT_CURRENT_SENSE_PIN)) ;
  float output_voltage = abs(return_voltage_value(OUTPUT_VOLTAGE_SENSE_PIN)) ;
  float output_current =  abs((return_current_value(OUTPUT_CURRENT_SENSE_PIN))) ;
  input_current = input_current - 0.025;
  Serial.print("Input Voltage: ");
  Serial.print(input_voltage);
  Serial.print(" | Input Current: ");
  Serial.print(input_current);
  Serial.print(" | Output Voltage: ");
  Serial.print(output_voltage);
  Serial.print(" | Output Current: ");
  Serial.println(output_current);
  delay(300);
  display.clearDisplay();
  display.setCursor(0, 0);
  display.print("I/P V: ");
  display.setCursor(37, 0);
  display.print(input_voltage);
  display.setCursor(70, 0);
  display.print("V");
  display.setCursor(0, 10);
  display.print("O/P V: ");
  display.setCursor(37, 10);
  display.print(output_voltage);
  display.setCursor(70, 10);
  display.print("V");
  display.setCursor(0, 20);
  display.print("I/P I: ");
  display.setCursor(37, 20);
  display.print(abs(input_current));
  display.setCursor(70, 20);
  display.print("A");
  display.setCursor(0, 30);
  display.print("O/P I: ");
  display.setCursor(37, 30);
  display.print(abs(output_current));
  display.setCursor(70, 30);
  display.print("A");
  display.setCursor(0, 40);
  display.print("I/P P: ");
  display.setCursor(37, 40);
  display.print(abs(input_current * input_voltage));
  display.setCursor(70, 40);
  display.print("W");
  display.setCursor(0, 50);
  display.print("O/P P: ");
  display.setCursor(37, 50);
  display.print(abs(output_current * output_voltage));
  display.setCursor(70, 50);
  display.print("W");
  display.setTextSize(2);
  display.setCursor(85, 0);
  display.print("Eff");
  display.setCursor(87, 23);
  display.print((abs((output_current * output_voltage) / (input_current * input_voltage)) * 100), 0);
  display.setCursor(92, 45);
  display.print("%");
  display.setTextSize(1);
  display.display();
  display.clearDisplay();
}
double return_voltage_value(int pin_no)
{
  double tmp = 0;
  double ADCVoltage = 0;
  double inputVoltage = 0;
  double avg = 0;
  for (int i = 0; i < 150; i++)
  {
    tmp = tmp + analogRead(pin_no);
  }
  avg = tmp / 150;
  ADCVoltage = ((avg * 3.3) / (4095)) + 0.138;
  inputVoltage = ADCVoltage / (R2_VOLTAGE / (R1_VOLTAGE + R2_VOLTAGE));
  return inputVoltage;
}
double return_current_value(int pin_no)
{
  double tmp = 0;
  double avg = 0;
  double ADCVoltage = 0;
  double Amps = 0;
  for (int z = 0; z < 150; z++)
  {
    tmp = tmp + analogRead(pin_no);
  }
  avg = tmp / 150;
  ADCVoltage = ((avg / 4095.0) * 3300);
  Amps = ((ADCVoltage - ACSoffset) / mVperAmp);
  return Amps;
}

После записи кода в ESP32 следует протестировать данное решение.


Измеритель мощности на основе ESP32 своими руками

Вы можете видеть нашу тестовую установку на изображении выше. У нас есть трансформатор на 30 В, дающий входное напряжение, и наш измеритель подключен к тестовой плате. Мы используем плату понижающего преобразователя на основе LM2596 и для нагрузки мы используем три резистора 10 Ом, подключенных параллельно.


Измеритель мощности на основе ESP32 своими руками

Как вы можете видеть на изображении выше, мы подключили мультиметры, чтобы проверить входное и выходное напряжение. Трансформатор выдает почти 32 В, а выход понижающего преобразователя составляет 3,95 В.


Измеритель мощности на основе ESP32 своими руками

На изображении показан выходной ток, измеренный нашим измерителем КПД и мультиметром. Как видите, мультиметр показывает 0,97 А, а если немного увеличить, он показывает 1,0 А, это из-за нелинейности, присутствующей в модуле ACS712, то есть в целом результаты получились вполне удовлетворительными.




© digitrode.ru


Теги: ESP32




Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий