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

У вас когда-нибудь было такое, что есть элемент с двумя выводами по типу таких
9f4254aa23cb49e3860b56350af7e915.jpg
но вы не понимаете:

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


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

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


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

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


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

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

Итоговая схема получилась такая:
2f96adc687474a18995d3f75802a522c.png

Программа для 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));
}


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

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

Диод 1N4148:
a7955292efd74436a77d28e63000b3e0.png

Диод 1N5817:
d37a991422e34196b0c8f769a950cf66.png
Видите как при нулевом напряжении ток положительный? Как думаете почему?

Ответ

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

Неизвестный светодиод:
76856f2d893549eaae44eff15089c6de.png

Резистор 680 Ом:
97fd9955cc474e339fdc3c2c095eca4e.png

Итог


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

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

Фото аппаратной части:
b3774488d8c44b3ba087c72fc39d3dc8.JPG

© Geektimes