AniTu-Diplomen — ESP32 simulation

An interactive ESP32 circuit simulation you can run free in your browser on Velxio, by titanabg0.

Components

Sketch code

#include <Wire.h>
#include <Adafruit_ADS1X15.h>

Adafruit_ADS1115 ads;

// Конфигурационни константи
const int DAC_PIN = 25;                 // ESP32 Хардуерен DAC изход (GPIO 25)
const float VOLTAGE_DIVIDER = 11.0;     // Коефициент на делителя за V_in и V_sense: (100k + 10k) / 10k
const float R_SHUNT = 0.1f;             // Шунтов резистор в оми (0.1 Ω)

// DAC параметри (8-битова резолюция: 0 до 255, съответстваща на 0V до ~3.3V)
int dacValue = 200;                     // Начална стойност на аналоговото напрежение (~1.65V)

void setup() {
  Serial.begin(115200);
  while (!Serial);

  Serial.println("Initializing Electronic Load System with DAC control...");

  // Инициализация на I2C шината за ESP32 (SDA = 21, SCL = 22)
  Wire.begin(21, 22);

  // Проверка за наличие на ADS1115
  if (!ads.begin()) {
    Serial.println("Error: ADS1115 not found! Check wiring.");
    while (1);
  }

  // Задаване на усилване GAIN_ONE (обхват до ~4.096V)
  ads.setGain(GAIN_ONE);

  // Забележка: За вградения DAC на ESP32 (пинове 25/26) не е нужно 
  // специално задаване в setup(), функцията dacWrite управлява пина директно.
  
  Serial.println("System initialized successfully!");
}

void loop() {
  // 1. Подаване на реално аналогово напрежение към гейта през DAC (пин 25)
  // Стойност от 0 до 255 подава между 0V и 3.3V на гейта на логическия MOSFET
  dacWrite(DAC_PIN, dacValue);

  // 2. Четене на каналите от ADS1115
  int16_t rawA0 = ads.readADC_SingleEnded(0);      // V_in (Входно напрежение с делител)
  int16_t rawA1 = ads.readADC_SingleEnded(1);      // V_sense (Kelvin sense с делител)
  int16_t rawDiff = ads.readADC_Differential_2_3(); // Диференциално четене на шунта (A2 - A3)

  // 3. Преобразуване на суровите данни във волтове
  float voltageIn    = (rawA0 * 0.125F / 1000.0) * VOLTAGE_DIVIDER;
  float voltageSense = (rawA1 * 0.125F / 1000.0) * VOLTAGE_DIVIDER;

  // Падение на напрежение върху шунта (от диференциалния вход)
  float shuntVoltage = rawDiff * 0.125F / 1000.0;
  if (shuntVoltage < 0.0f) shuntVoltage = 0.0f;

  // 4. Инженерни изчисления
  // Ток през веригата (I = V_shunt / R_shunt)
  float current = shuntVoltage / R_SHUNT; 
  
  // Изчисление на V_DS (Входно напрежение минус падението върху шунта)
  float vDs = voltageIn - shuntVoltage;
  if (vDs < 0.0f) vDs = 0.0f;
  
  // Разсеяна мощност върху MOSFET-а във Ватове (P = V_DS * I)
  float powerMosfet = vDs * current;                          
  
  // Ефективно съпротивление на канала (R_DS = V_DS / I)
  float mosfetResistance = (current > 0.001f) ? (vDs / current) : 0.0f; 

  // 5. Извеждане на актуалните данни в Serial конзолата
  Serial.print("DAC: "); Serial.print(dacValue);
  Serial.print(" | V_in: "); Serial.print(voltageIn, 2);
  Serial.print("V | V_sense: "); Serial.print(voltageSense, 2);
  Serial.print("V | I: "); Serial.print(current, 3);
  Serial.print("A | V_DS: "); Serial.print(vDs, 2);
  Serial.print("V | P_MOS: "); Serial.print(powerMosfet, 2);
  Serial.print("W | R_DS: "); Se

More projects by titanabg0