Wojciech Zabolotny
Это достаточно давняя разработка. Некоторые детали возможно сложно будет приобрести. Если вы желаете собрать лучший и дешевый АЦП, пройдите по ссылке PICADC3.
Устройство представляет собой 12-битный, 8ми канальный аналого-цифровой преобразователь (с 4мя дополнительными цифровыми входами), который может быть подключен к компьютеру через последовательный интерфейс (RS232).
Последовательность опроса каналов и частота дискретизации задаются компьютером.
Максимальная частота дискретизации ограничена скоростью передачи, и скорость в 115200 бод эквивалентна 3 кГц для 1 канала без цифровых входов или 500 Гц для 8 каналов с цифровыми входами.
Входное аналоговое напряжение лежит в диапазоне от –2.5 В до 2.5 В.
Цифровые взоды могут использоваться для записи дополнительных цифровых сигналов, т.е. временные коды, используемые для синхронизации записываемых данных с другими событиями.
Устройство основано на контроллере PIC16F84 (или 16C84) и микросхеме ЦАП MAX190 (или MAX191).
Устройство смонтировано на небольшой односторонней печатной плате, простой в изготовлении даже в домашних условиях, показанной на рисунке ниже (и доступной в формате Easytrax для DOS). Так же имеются распечатки нижнего_слоя и вида с верху в формате PDF.
Принципиальная схема устройства показана на рисунке ниже, и также доступна в PDF формате.
Резисторы R18 и R21 не смонтированы на моей плате. R18 может быть использован для изменения режима компенсации внутреннего источника опорного напряжения в MAX190/191 (смотри описание на MAX190/191), R21 используется для поднятия линии данных, когда выход DOUT микросхемы MAX190 находится в высокоимпедансном состоянии.
Конденсаторы емкостью 4.7 мкФ (C4, C5, C7, C8, C10) должны быть танталовыми (не перепутайте полярность, когда будете их монтировать!).
Изначально устройство разрабатывалось как часть оптоизолированной системы сбора данных. Поэтому его плата не должна содержать схемы сброса и преобразователя уровней RS232, и должна подключаться через оптическую развязку. Однако кнопка сброса обычно не требуется, и вы можете подключить контакт ~RST (7) на разъеме J2 к +5В (J2 контакт 8). Если оптоизоляция не нужна, можно использовать преобразователь уровня на микросхеме MAX232, или простые схемы, показанные на рисунке ниже:
Программа для PIC доступна в исходном коде и в виде прекомпилированных HEX файлов для PIC16C84 и PIC16F84.
Протокол связи
Устройство подключается к компьютеру через последовательный порт. На первом шаге, компьютер посылает сигнал BREAK (длительностью 0,5 с), чтобы перезапустить устройство. Устройство посылает строку идентификации, используя скорость 19200 бод, 8 бит, без режима четности. В текущей версии, строка идентификации - WZPICADC100003. после приема правильной строки идентификации, компьютер должен послать 14 конфигурационных байт (используя вышеописанный режим). Назначение каждого байта описано в таблице ниже:
Байт |
Значение |
1 |
Число каналов |
2 |
Таблица каналов. |
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
fdel – точная задержка(от 0 до 0x80) |
11 |
del0 – грубая задержка, байт 0 (от 0 до 0xff) |
12 |
del1 - грубая задержка, байт 1 (от 0 до 0xff) |
13 |
del2 - грубая задержка, байт 2 (от 0 до 0xff) |
14 |
cflags – конфигурационные флаги
|
После приема конфигурационных байт устройство вычисляет 8 битную контрольную сумму принятых данных (см. исходный код чтобы узнать подробности алгоритма), и посылает ее обратно компьютеру, который сравнивает ее с контрольной суммой, вычисленной из первоначальных данных. Если контрольные суммы совпадают, компьютер считает, что конфигурационные байты были приняты корректно, и устройство готово. Компьютер изменяет режим последовательного порта на скорость 115200, 57600 или 38400 (в соответствии с флагами cflags), 8 бит, с четностью, и посылает байт «0» чтобы запустить съем данных.
Устройство начинает дискретизировать входные сигналы и отправлять данные в компьютер. Данные состоят из записей из 12 битных слов, упакованных в 3х байтные слова, как показано ниже:
Байт 0 |
Байт 1 |
Байт 2 |
|||||||||||||||||||||
A11 |
A10 |
A9 |
A8 |
A7 |
A6 |
A5 |
A4 |
A3 |
A2 |
A1 |
A0 |
B3 |
B2 |
B1 |
B0 |
B11 |
B10 |
B9 |
B8 |
B7 |
B6 |
B5 |
B4 |
Если число каналов нечетное, последний канал использует 2 байта.
Если используются цифровые входы, добавляется дополнительный байт, содержащий значения цифровых сигналов:
b7 |
b6 |
b5 |
b4 |
b3 |
b2 |
b1 |
b0 |
DIN3 |
DIN2 |
DIN1 |
DIN0 |
Номер записи |
4-х битный номер записи увеличивается на 1 (по модулю 16) после каждой записи. Проверка этого значения очень полезна для выявления потерь данных при сбое передачи данных по RS232 или других аппаратных сбоях. Поэтому рекомендуется использовать цифровые входы всегда, когда это позволяет требуемая частота дискретизации.
Определение периода дискретизации
Управление дискретизацией осуществляется программно, прерывания не используются, по этому колебания частоты дискретизации отсутствуют. Однако, такой метод усложняет вычисление периода дискретизации. Дополнительно к этому, большинство модификаций кода для PIC требуют модифицировать хотя бы значения, используемые для вычисления периода дискретизации (см. таблицу ниже) и иногда даже формулы. Для оригинальной версии кода PIC, для тактовой частоты 4 МГц период дискретизации Tsmp определяется по формуле:
Tsmp = tanlg + tdig + tdel
Где tdig – время, используемое для захвата и передачи данных с цифровых входов, оно зависит только от скорости передачи, в соответствии с нижеприведенной таблицей. tanlg – время, затрачиваемое на дискретизацию аналоговых каналов, зависящее от числа каналов (nch) и скорости передачи, в соответствии с формулами:
Для нечетного nch
: tanlg = todd+(nch
- 1) * tstep / 2
Для четного nch
: tanlg = tev+(nch
- 2) * tstep / 2
Где tstep, todd and tev – зависят от скорости передачи в соответствии с нижеприведенной таблицей:
Baud rate [baud] |
tdig [usec] |
tstep [usec] |
todd [usec] |
tev [usec] |
115200 |
111 |
453 |
311 |
488 |
57600 |
208 |
744 |
505 |
779 |
38400 |
302 |
1026 |
693 |
1061 |
tdel – время выполнения дополнительного цикла задержки, используемого для достижения требуемого значения периода дискретизации. Оно определяется по формуле:
tdel = (128 - fdel
) + 10 * (255 - del0
) + 2560 * (255 - del1
) + 655360 * (255 - del2
) [микросекунд]
Пример программы
Чтобы помочь вам понять работу устройства, я написал простую программу захвата и записи данных для операционной системы Linux.
Это очень простая программа, и все, что она делает, это захват аналоговых и цифровых данных с определенной частотой и запись полученных данных в файл ASCII, с запятыми в качестве разделителей или вывод их на экран.
Параметры командной строки
Команда для запуска программы представляет собой:
picadc [опции]
Для выхода из программы вы должны нажать комбинацию клавиш CTRL+C
Ниже представлены опции:
-о
Эта опция задает выходной файл, в который сохраняются данные. Если эта опция не задана, данные идут на стандартный вывод stdout.
-1
Эта опция задает скорость передачи данных 115200 бод. Помните, что конфигурирование устройства происходит на скорости 19200 бод. Эта опция, а также опции «-3», «-5» влияют только на передачу полученных данных.
-5
Эта опция задает скорость передачи данных 57600 бод.
-3
Эта опция задает скорость передачи данных 38400 бод.
Внимание! Помните, что Linux использует скорость передачи 38400 бод для очень специфических вещей. Т. е. чтобы позволить устаревшим программам использовать большие или нестандартные скорости передачи. Можно использовать утилиту setserial чтобы переопределить скорость в 38400 бод. Просмотрите документацию по утилите setserial, в особенности опции spd_hi, spd_vhi, spd_cust и spd_normal.
-t
Эта опция задает устройство TTY, к которому подключен данный АЦП.
т.е. -t /dev/ttyS1
-c
Эта опция задает список аналоговых каналов. После нее следует указать список номеров каналов, разделенный запятыми (всего 8 каналов, пронумерованных от 0 до 7) в порядке опроса каналов.
т.е. -c 4,2,5
-d
Эта опция сообщает устройству о ненужности захвата данных с цифровых входов. Используйте эту опцию только при необходимости достичь требуемой частоты дискретизации, так как счетчик записей, передаваемый вместе с данными цифровых входов очень полезен для проверки корректности передачи данных.
-s
Эта опция определяет период дискретизации в микросекундах.
Помните, что это период дискретизации всего набора каналов (не то время, которое проходит между дискретизацией в двух соседних каналах). Каналы не преобразуются одновременно, так как использовать буфер хранения выборок для каждого канала слишком дорого. Такое решение имеет сдвиг фаз между каналами, и, если это для вас важно, вы можете учитывать временные задержки между преобразованием в каналах. Эти задержки вы можете найти путем эмуляции программы устройства в MPLAB.
т.е. –s 10000 задает частоту преобразований в 100 Гц для каждого канала.
Возможные усовершенствования
Использования внешнего АЦП и мультиплексора можно избежать, если использовать PIC со встроенным 12 битным АЦП (т.е. 16C774). Однако в этом случае вы должны реализовать отдельный входной усилитель для каждого канала, но тогда вы можете получить диапазон входных напряжений, с которыми стандартный аналоговый компаратор не может работать – т.е. ±10 В.
Возможно использовать только один входной усилитель (и избежать использования встроенного АЦП) если использовать внешний мультиплексор. В этом случае будет использоваться только 1 канал встроенного АЦП. К сожалению я не тестировал вышеприведенные решения.
Возможно увеличить число аналоговых каналов до 16 используя микросхему HEF4067 или две микросхемы 4051 с дополнительным инвертором. В этом случае контакт RA4 (подключен к +5 В через резистор 3 кОм) будет использован для управления 4-й адресной линией.
Утилита RSCALC
Когда я писал подпрограммы передачи по RS232 для разных скоростей передачи, я написал небольшие утилиты, показывающие временные параметры асинхронной передачи данных для разных скоростей. Это на самом деле очень просто, но может быть вы найдете их полезными. Здесь исходный код.
Авторские права и гарантии
Устройство распространяется свободно. Вы можете копировать его, изменять и использовать для любых, (в том числе коммерческих) целей, не платя ничего. Единственное требование, если вы распространяете информацию об этом (или модифицированном) устройстве, вы должны дать информацию об авторах оригинальной версии (Wojciech Zabolotny [[email protected]] и Wojciech Zaworski [[email protected]]).
Так как устройство распространяется свободно, мы не даем вам никаких гарантий! Нам не известно, может ли использование этого устройства в определенных целях нарушать чьи то авторские права. Нам неизвестно, может ли оно при некоторых условиях использования вывести из строя ваш компьютер или другие устройства, подключенные к нему.
Вы используете его на свой страх и риск!