Logging ADC

Опубликовано в рубрике "Инструменты,Источники питания", 21 июля, 2010.

Недавно, знакомому понадобилось измерить разрядные характеристики аккумуляторов. Естественно, для этого нужна была какая-то железяка и программка к ней. Я как раз заболел и, дабы не сидеть и скучать, взялся сотворить такую штуку.

Блиц-девелопмент железяки занял день чистого времени. За это время железяка была начинена полным фаршем – протопотоками и софтварным USB. Да и управляющую программулину для компьютера я решил ваять на C# (я его только начал учить, ибо Borland Builder уже морально устарел)

 battery

 

Ну, как полагается, давайте начнем со того, что хотелось получить.

  • АЦП, передающий данные в компьютер по 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#.

 

Внешний вид примерно такой:

image

 

Думаю, что интерфейс достаточно простой, чтобы долго о нем не распинаться.

Хотелось бы пояснить, что после нажатия Begin logging, начнется запись данных в выбранный файл. Если запись остановить, файл придется выбирать заново. Это сделано для того, чтобы случайно не похерить плоты многочасового замера.

Если какой-либо канал “зашкалит”, то он подсветится красным. Так-что, все под контролем.

 

Драйвер

При первом подключении АЦП, Windows попросит вас предоставить ему драйвер. А вот и он:

 

Настройка делителей

В папке с программой лежит файлик settings.xml. Лежит он там не просто так, а для того, чтобы вы могли подстроить делители под свои диапазоны. Как это делается:

  1. Открываем файл settings.xml блокнотом (или еще чем-то)
  2. Параметр divider нужного делителя ставиться в 1
  3. Напряжение, которое показывает программа делим на то, что показывает мультиметр.
  4. Полученное значение вписываем в поле divider  в xml-файле.

Таким образом, удается скомпенсировать погрешности резисторов и опорного напряжения контроллера. Да и относительно легко изменить диапазоны измерений.

 

Обработка данных

Итак, мы получили файл с данными. Что теперь с ним делать? Excel с очень большой вероятностью с ним не справиться – слишком много точек. Для построения графика, я использую matlab. Темболее, что матлаб очень удобно использовать для дальнейшей обработки полученных данных.

  1. Запускаем матлаб.
  2. Выполняем следующие команды: загружаем данные из файла (вместо F:/q.txt, естественно, нужно подставить свой файл)

    A = importdata(‘F:/q.txt’);
  3. Экстрагируем время из полученных данных

    t = A.data(:, 1);

    И нормируем начало времени по началу измерения

    t = t — t(1);
  4. Экстрагируем напряжения

    v1 = A.data(:, 2);
    v2 = A.data(:, 3);
  5. Строим график, к примеру v1(t)

    plot(t, v1);

Получается что-то вот такое (нормированный на один элемент вольта график разряда 4х элементов 250AFH, соединенных последовательно):

image

 

Источник разрядного тока

Обычно в даташитах на аккумуляторы приводят диаграммы разряда при постоянном токе. В качестве источника разрядного тока можно использовать простую схему на ОУ из хоровица-хилла, страница 161. Если минимальное падение большое, можно использовать классические дискретные схемы.

image

 

Вообщем, выбор очень широк, а точные параметры, да и собственно сама схема разряда сильно зависит от конкретного разряжаемого аккумулятора.

 

Перед тем, как откланяюсь, покажу фото этого ужастика:

logger

 

Друг поместил это чудо в корпус. Теперь, оно выглядит вот так:

1470029




Комментарии
  1. Aneg написал(а) 29 января, 2011 в 16:03

    А зачем в схеме нужны «диодные делители» подключенные к 3,3В?
    И что то мне совсем не понятно, как работает эта схема и что она вообще делает?

    BSVi Reply:

    Это не делители, а защита — если напруга превысит питание — то ток пойдет через один диод, если станет ниже нуля — то через другой. Для чего схемка — написано в статье.

  2. rol20 написал(а) 5 февраля, 2011 в 23:50

    Я что-то не понимаю как делитель на резисторах работает. Когда подключаем резистор, допустим 13 килоом. Ножка на выход настраиваем, но наверное надо ноль в порт послать, на резисторе будет 0 вольт. и получится делитель. Я думаю, что бы отключить резистор надо вывести в порт единицу, и на резисторе будет +3.3V. Я правильно рассуждаю или заблуждаюсь.? Надо ли настраивать подтягивающие резисторы?

    BSVi Reply:

    Заблуждаешься. переключается не уровень, а направление порта.

    rol20 Reply:

    Значит подключаем резистор, тогда в DDR = 1, а отключить, то DDR = 0. А порт в нуле, в обоих состояниях. Правильно?

    BSVi Reply:

    ага

  3. rol20 написал(а) 6 февраля, 2011 в 18:08

    1. bsvi скажи пожалуйста для чего на схеме у входа и выхода усилителя MCP6033 стоят резисторы R12, R18 по 100КОм.
    2. Кондеры на входе и выходе стоят для усреднения пульсаций (входный и выходных)?
    3. Для чего надо конденсатор С14?

    BSVi Reply:

    1. Это — фильтры они боразованы резисторами и конденсаторами С11 и С13.
    2. Ага, работают в паре с резисторами. Тут посоветую прочитатью любой (хотябы элементарный учебник электроники, хоровиц/хилл, к примеру)
    3. С14 тоже работать как фильтр низких частот.

    В итоге, получается очень хорошо отфильтрованный сигнал.

Создать новую ветку комментариев


Вы должны войти или зарегистрироваться чтобы оставить комментарий.