Pull to refresh

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

Reading time2 min
Views27K
У вас когда-нибудь было такое, что есть элемент с двумя выводами по типу таких…



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

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

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

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


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

Схема измерительной части:



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

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

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



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



Диод 1N5817:



Видите, как при нулевом напряжении ток положительный? Как думаете, почему?

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


Неизвестный светодиод:



Резистор 680 Ом:




Итог


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


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

Tags:
Hubs:
+17
Comments31

Articles

Change theme settings