- PVSM.RU - https://www.pvsm.ru -

Строим ВАХ на Arduino

У вас когда-нибудь было такое, что есть элемент с двумя выводами по типу таких
Строим ВАХ на Arduino - 1
но вы не понимаете:

  • Что это?
  • Оно рабочее?
  • Какие у него параметры?

У меня бывало, а вчера случилось много…

Идея строить ВАХ при помощи МК появилась давно, а реализовать руки дошли только что.

Из чего делать?

В качестве контроллера выбрал Arduino Nano потому что:

  1. Есть USB и, что не менее важно, чтобы его использовать не надо его изучать;
  2. Удобная, маленькая, не очень дорогая;
  3. Требований к скорости тут никаких, поэтому STM32 не нужен;
  4. Очень легко программировать;
  5. Выходные напряжения 5 В.

Схема измерительной части:
Строим ВАХ на Arduino - 2
На In1 и In2 подаём напряжение и в результате должны построить график зависимости
тока через UD (Unknown Device) = (UOutС — UOut2) / R1
от напряжения на нём = UOut1 — UOutС

Т.к. схема у нас на 5 В, то для упрощения ограничимся ВАХ в диапазоне от -5 до 5 В, чтобы не усложнять конструкции.
ЦАП в комплекте нет, поэтому входные сигналы можно формировать либо при помощи ШИМ + ФНЧ либо при помощи цифрового потенциометра/внешнего ЦАП. Я для начала сделал 1-й вариант.

Итоговая схема получилась такая:
Строим ВАХ на Arduino - 3

Программа для Arduino настолько маленькая, что приведу её прямо тут:

Программа

void setup() {    
  Serial.begin(115200);
  analogReference(EXTERNAL);  // не забудьте подключить Aref к 5 В
  DDRD |= (1 << 2) | (1 << 3);  
  TCCR2B |= (0 << CS22)|(0 << CS21)|(1 << CS20); // prescaler = 1. Переполнение каждые 13 мкс
  TIMSK2 |= (1 << TOIE2)|(1 << OCIE2A); // включаем прерывания
  TCCR2A &= ~(3); //  WGM20 = 0, WGM21 = 0
  TCCR2B &= ~(1 << 3); // WGM22 = 0
  OCR2A = 128;
  sei();
}

ISR(TIMER2_OVF_vect)
{
  PORTD |= 1 << 2;
  PORTD &= ~(1 << 3);
}

ISR(TIMER2_COMPA_vect)
{
  PORTD |= 1 << 3;
  PORTD &= ~(1 << 2);
}

int analogAVG(int channel){
  uint32_t summ;
  uint16_t count = 50;
  for(uint8_t i = 0; i < count; i++)
    summ += analogRead(channel);
  return summ / count;
}

void loop() {
  OCR2A += 1;
  if(!OCR2A) // ждём пока перезарядятся конденсаторы
    delay(100);
  Serial.print(OCR2A);
  Serial.print(":");
  Serial.print(analogAVG(0));
  Serial.print(":");
  Serial.print(analogAVG(1));
  Serial.print(":");
  Serial.println(analogAVG(2));
}

Рисовалку ВАХ [1] сделал на C# частично скопировав код из предыдущего проекта.

Несколько ВАХ полученные при помощи устройства

Яркие вертикальные линии каждый 1В, яркие горизонтальные линии каждые 100 мкА.
Самые яркие вертикальные и горизонтальные линии — нули.

Диод 1N4148:
Строим ВАХ на Arduino - 4

Диод 1N5817:
Строим ВАХ на Arduino - 5
Видите как при нулевом напряжении ток положительный? Как думаете почему?

Ответ

ШИМ даёт колебания напряжения. При измерении напряжения они усредняются и получается 0, а ток выпрямляется диодом и после выпрямления и усреднения получается уже значимо больше нуля.

Неизвестный светодиод:
Строим ВАХ на Arduino - 6

Резистор 680 Ом:
Строим ВАХ на Arduino - 7

Итог

Не претендуя на точность устройство из Arduino Nano, 2-х конденсаторов и 3-х резисторов позволяет сравнивать ВАХ различных двухполюсников. Из недостатков можно отметить:

  1. Малый диапазон напряжений. Если расширять диапазон, то количество элементов возрастает в разы.
  2. Шум ШИМ. Можно устранять увеличением емкости конденсаторов, увеличением номиналов резисторов и установкой дополнительных каскадов фильтра или отказом от ШИМ в пользу отдельного ЦАП или цифрового потенциометра.
  3. Не видно малых токов, таких как обратные токи диодов. Тоже устранимый недостаток.

Фото аппаратной части:
Строим ВАХ на Arduino - 8 [2]

Автор: xedas

Источник [3]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/arduino/157015

Ссылки в тексте:

[1] Рисовалку ВАХ: https://github.com/adefikux/VAH

[2] Image: https://habrastorage.org/files/2da/a65/b79/2daa65b79a8b4f2eb357c56b2b32d9f8.JPG

[3] Источник: https://geektimes.ru/post/278478/