Logging ADC
Недавно, знакомому понадобилось измерить разрядные характеристики аккумуляторов. Естественно, для этого нужна была какая-то железяка и программка к ней. Я как раз заболел и, дабы не сидеть и скучать, взялся сотворить такую штуку.
Блиц-девелопмент железяки занял день чистого времени. За это время железяка была начинена полным фаршем – протопотоками и софтварным USB. Да и управляющую программулину для компьютера я решил ваять на C# (я его только начал учить, ибо Borland Builder уже морально устарел)
Ну, как полагается, давайте начнем со того, что хотелось получить.
-
АЦП, передающий данные в компьютер по USB. Скорость особо не важна – измерения в секунду более, чем достаточно.
-
Два канала. Один – для измерения напряжения на аккумуляторе (переключаемый под разные напряжения), а второй – для измерения тока на шунте, с фиксированным максимальным напряжением порядка 200-300мВ
-
Программа должна сигнализировать о том, что скоро произойдет перезаряд или переразряд аккумулятора.
Схема
Схему я рисовал в полудреме, поэтому сделал просто колоссальное количество ошибок (старею…). Вам-же, я покажу сразу исправленную версию. Из-за обильности ошибок на оригинальной схеме, платы не будет – если кто захочет повторить, то придется разводить самостоятельно.
Каждый собранный проект чему нибуть(хорошему), да учит. Вот
Во-первых, обратите внимание, как сделан переключатель диапазонов. Если нужно подключить резистор, то выставляю ножку контроллера на выход, а если нужно отключить – то на вход. Такая схема, как оказалось, работает замечательно. Из 4х резисторов получилось 15 вариантов делителя.
Диоды D1, D2, D4, D5 изначально были сборками из диодов Шоттки BAT54S. Как оказалось, утечка у такого диода – порядка 400нА. При входном сопротивлении 100кОм, это даст 40мВ смещения, а после усиления операционником – 172мВ! Это уже 16% от диапазона АЦП. Фигово. На смену пришли обычные LL4148 с током утечки порядка десятков нА. Смещение осталось, но совсем маленькое.
Прошивка для контроллера
Была слеплена из кусков от прерывателя i2, и, естественно, я не устоял от соблазна заюзать там протопотоки. Впечатления – самые положительные.
прошивка получилась очень маленькой, и без проблем поместилась в atmega48 —
2 788 bytes of CODE memory (+ 28 range fill )
166 bytes of DATA memory (+ 17 absolute )
Фьюзы:
-
Low –0xFF
-
High – 0x9D
-
Extended, Lock — 0xFF
Программа для компьютера
Если честно, то начинал я писать ее красиво, а заканчивал уже ночью, забивая на все правила приличия – лишь бы запустить и заснуть, а править уже лень. Думаю, вы меня простите :-). Тем более, что это – чуть-ли не первая моя программа на C#.
Внешний вид примерно такой:
Думаю, что интерфейс достаточно простой, чтобы долго о нем не распинаться.
Хотелось бы пояснить, что после нажатия Begin logging, начнется запись данных в выбранный файл. Если запись остановить, файл придется выбирать заново. Это сделано для того, чтобы случайно не похерить плоты многочасового замера.
Если какой-либо канал “зашкалит”, то он подсветится красным. Так-что, все под контролем.
Драйвер
При первом подключении АЦП, Windows попросит вас предоставить ему драйвер. А вот и он:
Настройка делителей
В папке с программой лежит файлик settings.xml. Лежит он там не просто так, а для того, чтобы вы могли подстроить делители под свои диапазоны. Как это делается:
-
Открываем файл settings.xml блокнотом (или еще чем-то)
-
Параметр divider нужного делителя ставиться в 1
-
Напряжение, которое показывает программа делим на то, что показывает мультиметр.
-
Полученное значение вписываем в поле divider в xml-файле.
Таким образом, удается скомпенсировать погрешности резисторов и опорного напряжения контроллера. Да и относительно легко изменить диапазоны измерений.
Обработка данных
Итак, мы получили файл с данными. Что теперь с ним делать? Excel с очень большой вероятностью с ним не справиться – слишком много точек. Для построения графика, я использую matlab. Темболее, что матлаб очень удобно использовать для дальнейшей обработки полученных данных.
-
Запускаем матлаб.
-
Выполняем следующие команды: загружаем данные из файла (вместо F:/q.txt, естественно, нужно подставить свой файл)
A = importdata(‘F:/q.txt’);
-
Экстрагируем время из полученных данных
t = A.data(:, 1);
И нормируем начало времени по началу измерения
t = t — t(1);
-
Экстрагируем напряжения
v1 = A.data(:, 2);
v2 = A.data(:, 3); -
Строим график, к примеру v1(t)
plot(t, v1);
Получается что-то вот такое (нормированный на один элемент вольта график разряда 4х элементов 250AFH, соединенных последовательно):
Источник разрядного тока
Обычно в даташитах на аккумуляторы приводят диаграммы разряда при постоянном токе. В качестве источника разрядного тока можно использовать простую схему на ОУ из хоровица-хилла, страница 161. Если минимальное падение большое, можно использовать классические дискретные схемы.
Вообщем, выбор очень широк, а точные параметры, да и собственно сама схема разряда сильно зависит от конкретного разряжаемого аккумулятора.
Перед тем, как откланяюсь, покажу фото этого ужастика:
Друг поместил это чудо в корпус. Теперь, оно выглядит вот так:
А зачем в схеме нужны «диодные делители» подключенные к 3,3В?
И что то мне совсем не понятно, как работает эта схема и что она вообще делает?
Это не делители, а защита — если напруга превысит питание — то ток пойдет через один диод, если станет ниже нуля — то через другой. Для чего схемка — написано в статье.
Я что-то не понимаю как делитель на резисторах работает. Когда подключаем резистор, допустим 13 килоом. Ножка на выход настраиваем, но наверное надо ноль в порт послать, на резисторе будет 0 вольт. и получится делитель. Я думаю, что бы отключить резистор надо вывести в порт единицу, и на резисторе будет +3.3V. Я правильно рассуждаю или заблуждаюсь.? Надо ли настраивать подтягивающие резисторы?
Заблуждаешься. переключается не уровень, а направление порта.
Значит подключаем резистор, тогда в DDR = 1, а отключить, то DDR = 0. А порт в нуле, в обоих состояниях. Правильно?
ага
1. bsvi скажи пожалуйста для чего на схеме у входа и выхода усилителя MCP6033 стоят резисторы R12, R18 по 100КОм.
2. Кондеры на входе и выходе стоят для усреднения пульсаций (входный и выходных)?
3. Для чего надо конденсатор С14?
1. Это — фильтры они боразованы резисторами и конденсаторами С11 и С13.
2. Ага, работают в паре с резисторами. Тут посоветую прочитатью любой (хотябы элементарный учебник электроники, хоровиц/хилл, к примеру)
3. С14 тоже работать как фильтр низких частот.
В итоге, получается очень хорошо отфильтрованный сигнал.