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

 

Электронная нагрузка на Arduino своими руками

Автор: Mike(admin) от 5-03-2020, 23:55

Если вы когда-либо работали с аккумуляторами или другими цепями электропитания, то часто случалось, что вам приходилось проверять источник питания, нагружая его, чтобы проверить его работу в различных условиях нагрузки. Устройство, которое обычно используется для выполнения этого типа теста, называется нагрузкой постоянного тока, которая позволяет нам регулировать выходной ток вашего источника питания, а затем поддерживать его постоянным до тех пор, пока он не будет отрегулирован снова.


Электронная нагрузка на Arduino своими руками

В этом уроке мы узнаем, как собрать нашу собственную регулируемую электронную нагрузку, используя Arduino, которая может принимать максимальное входное напряжение 24 В и иметь ток до 5 А.


Схема состоит из трех частей. Первая часть представляет собой секцию управления с Arduino Nano, вторая часть представляет собой цифроаналоговый преобразователь, а третья часть представляет собой чисто аналоговую схему, в которой используется двойной операционный усилитель в одном корпусе, который будет управлять секцией нагрузки.


Далее приведена принципиальная схема электронной нагрузки. На этой схеме операционный усилитель имеет две секции. Одна управляет МОП-транзистором, а другая реализует усиление измеряемого тока. Первая секция имеет сопротивления R12, R13 и полевой МОП-транзистор MOSFET. R12 используется для уменьшения влияния нагрузки на секцию обратной связи, а R13 используется в качестве резистора затвора MOSFET.


Электронная нагрузка на Arduino своими руками

Дополнительные два резистора R8 и R9 используются для определения напряжения питания источника питания, которое будет испытывать нагрузку от этой фиктивной нагрузки. Согласно правилу делителя напряжения, эти два резистора поддерживают максимум 24 В. Более 24 В будут создавать напряжение, которое не подходит для выводов Arduino. Поэтому будьте осторожны, чтобы не подключать источник питания с выходным напряжением более 24 В.


Резистор R7 здесь является фактическим нагрузочным резистором. Это резистор 0,1 Ом мощностью 5 Вт. Он будет поддерживать максимум 7А, но для безопасности целесообразнее ограничить максимум тока нагрузки 5А. Следовательно, в настоящее время максимальная нагрузка 24 В, 5 А может быть установлена этой фиктивной нагрузкой.


Другая часть усилителя предназначена для усиления. Она обеспечивает 6-кратное усиление. Во время протекания тока будет падение напряжения. Например, когда через резистор протекает ток 5 А, падение напряжения на шунтирующем резисторе сопротивлением 0,1 Ом (V = I x R) будет составлять 0,5 В в соответствии с законом Ома. Неинвертирующий усилитель усилит его до x6, поэтому 3 В будет выходным напряжением второй части усилителя. Этот выход будет подан на аналоговый входной контакт Arduino Nano, в котором будет рассчитан ток.


MCP4921 – это цифро-аналоговый преобразователь. ЦАП использует протокол связи SPI для получения цифровых данных от любого микроконтроллерного блока и обеспечения аналогового выходного напряжения в зависимости от него. Это напряжение является входом операционного усилителя.


С другой стороны, имеется Arduino Nano, который будет передавать цифровые данные в ЦАП по протоколу SPI и контролировать нагрузку, а также отображать данные на 16-символьном дисплее. Здесь также используются два дополнительных элемента: кнопка уменьшения и увеличения. Вместо подключения к цифровому выводу они подключаются к аналоговым выводам. Также, изменяя код, можно предоставить необработанные аналоговые данные для управления нагрузкой.


Наконец, увеличивая нагрузку, Arduino nano будет передавать данные о нагрузке на ЦАП в цифровом формате, ЦАП будет передавать аналоговые данные на операционный усилитель, а операционный усилитель будет управлять полевым МОП-транзистором в соответствии с входным напряжением операционного усилителя. Наконец, в зависимости от тока нагрузки, протекающего через шунтирующий резистор, появится падение напряжения, которое будет дополнительно усиливаться вторым каналом LM358 и получаться от Arduino Nano. Это будет отображаться на дисплее. То же самое произойдет, когда пользователь нажимает кнопку уменьшения.


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


Электронная нагрузка на Arduino своими руками

Код программы электронной нагрузки довольно прост и приведен далее.



#include <SPI.h>
#include <LiquidCrystal.h>
#define SS_PIN 10
#define MAX_VOLT 5.0
#define load_resistor 0.1
#define opamp_gain 6
#define average 10
const int slaveSelectPin = 10;
int number = 0;
int increase = A2;
int decrease = A3;
int current_sense = A0;
int voltage_sense = A1;
int state1 = 0;
int state2 = 0;
int Set = 0;
float volt = 0;
float load_current = 0.0;
float load_voltage = 0.0;
float current = 0.0;
float voltage = 0.0;
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
void setup() {
  pinMode(slaveSelectPin, OUTPUT);
  pinMode(increase, INPUT); 
  pinMode(decrease, INPUT);
  pinMode(current_sense, INPUT);
  pinMode(voltage_sense, INPUT);
  SPI.begin();
    lcd.begin(16, 2);
    lcd.print("Digital Load");
    lcd.setCursor(0, 1);
    lcd.print("Circuit Digest");
    delay (2000); 
}
void convert_DAC(unsigned int value)
{
   /*Шаг = 2^n, Значит 12 бит 2^12 = 4096
     Для опорного напряжения 5 В, шаг будет 5/4095 = 0.0012210012210012 В или 1 мВ (приблизительно)*/
  unsigned int container;
  unsigned int MSB;
  unsigned int LSB;
  /* Шаг: 1, сохраняем 12-битные данные в контейнере
    Предположим, что данные 4095, в двоичном 1111 1111 1111 */
  container = value;    
  /* Шаг: 2 Создание исходных 8 бит. Таким образом, путем деления 256 старшие 4 бита захватываются в наименее значимые биты, LSB = 0000 1111 */
  LSB = container/256;
  /* Шаг: 3 Отправка конфигурации с формированием 4-битных данных.
    LSB = 0011 0000 ИЛИ 0000 1111. Результат 0011 1111 */
  LSB = (0x30) | LSB;
  /* Шаг 4 Контейнер все еще имеет 21-битное значение. Извлечение младших 8 бит.
    1111 1111 И 1111 1111 1111. Результат 1111 1111, который является MSB */  
  MSB = 0xFF & container;    
 /* Шаг: 4 Отправка 16-битных данных путем деления на два байта */
    digitalWrite(slaveSelectPin, LOW);
    delay(100);      
    SPI.transfer(LSB);
    SPI.transfer(MSB);    
    delay(100);
    digitalWrite(slaveSelectPin, HIGH);             
}
float read_current (void){
          load_current = 0;          
          for (int a = 0; a < average; a++){
          load_current = load_current + analogRead(current_sense);                
        }
        load_current = load_current / average;
        load_current = (load_current* MAX_VOLT) / 1024;
        load_current = (load_current / opamp_gain) / load_resistor; 
        return load_current;
}
float read_voltage (void){
          load_voltage = 0;          
          for (int a = 0; a < average; a++){
          load_voltage = load_voltage + analogRead(voltage_sense);                
        }
        load_voltage = load_voltage / average;
        load_voltage = ((load_voltage * MAX_VOLT)/1024.0)*6;
        return load_voltage;
}
void loop () {
        state1 = analogRead(increase);
        if (state1 > 500){
          delay(50);
           state1 = analogRead(increase);
           if (state1 > 500){
              volt = volt+0.02;
           }                    
        }
         state2 = analogRead(decrease);
        if (state2 > 500){
          delay(50);
           state2 = analogRead(decrease);
           if (state2 > 500){
              if (volt == 0){
                volt = 0;
              }
            else{
                volt = volt-0.02;
            }              
           }
        }
        number = volt / 0.0012210012210012;
        convert_DAC (number);        
        voltage = read_voltage();
        current = read_current();       
         lcd.setCursor(0, 0);
         lcd.print("Set Value");      
        lcd.print("=");
        Set = (volt/2)*10000; 
        lcd.print(Set);       
        lcd.print("mA    ");
        lcd.setCursor(0, 1);        
        lcd.print("I");      
        lcd.print("="); 
        lcd.print(current);       
        lcd.print("A ");
        lcd.print(" V");  
        lcd.print("=");
        lcd.print(voltage);       
        lcd.print("V");               
       // lcd.print(load_voltage);
        //lcd.print("mA    ");
       // delay(1000);
        //lcd.clear();
}

Итак, цифровая цепь нагрузки запаяна и запитана от источника питания 12 В. В данном случае на стороне источника питания использовалась литиевая батарея 7,4 В, и был подключен токоизмерительный прибор, чтобы проверить, как работает схема. Как вы можете видеть, когда установленный ток составляет 300 мА, схема потребляет 300 мА от батареи, которая также измеряется токоизмерительным прибором как 310 мА.


Электронная нагрузка на Arduino своими руками



© digitrode.ru


Теги: Arduino, нагрузка




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

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

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