Строим ВАХ на Arduino
У вас когда-нибудь было такое, что есть элемент с двумя выводами по типу таких
но вы не понимаете:
- Что это?
- Оно рабочее?
- Какие у него параметры?
У меня бывало, а вчера случилось много…
Идея строить ВАХ при помощи МК появилась давно, а реализовать руки дошли только что.
Из чего делать?
В качестве контроллера выбрал Arduino Nano потому что:
- Есть USB и, что не менее важно, чтобы его использовать не надо его изучать;
- Удобная, маленькая, не очень дорогая;
- Требований к скорости тут никаких, поэтому STM32 не нужен;
- Очень легко программировать;
- Выходные напряжения 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# частично скопировав код из предыдущего проекта.
Самые яркие вертикальные и горизонтальные линии — нули.
Диод 1N4148:
Диод 1N5817:
Видите как при нулевом напряжении ток положительный? Как думаете почему?
ШИМ даёт колебания напряжения. При измерении напряжения они усредняются и получается 0, а ток выпрямляется диодом и после выпрямления и усреднения получается уже значимо больше нуля.
Неизвестный светодиод:
Резистор 680 Ом:
Итог
Не претендуя на точность устройство из Arduino Nano, 2-х конденсаторов и 3-х резисторов позволяет сравнивать ВАХ различных двухполюсников. Из недостатков можно отметить:
- Малый диапазон напряжений. Если расширять диапазон, то количество элементов возрастает в разы.
- Шум ШИМ. Можно устранять увеличением емкости конденсаторов, увеличением номиналов резисторов и установкой дополнительных каскадов фильтра или отказом от ШИМ в пользу отдельного ЦАП или цифрового потенциометра.
- Не видно малых токов, таких как обратные токи диодов. Тоже устранимый недостаток.
Фото аппаратной части: