Довелось мне участвовать в автоматизации эксперимента средствами LabView и одним из устройств, подлежащих автоматизации, оказался 4-хканальный 24-разрядный вольтметр e24 от Л-Кард. Он построен на сигма-дельта АЦП AD7714, управляемых универсальным контроллером ATtiny2313. К сожалению, работать такое устройство умеет лишь по RS232, причем во время работы вольтметр непрерывно передает измеренные значения АЦП, не синхронизируясь с компьютером. В качестве источника питания оно может использовать собственный адаптер на 12 В, либо сам COM-порт, что было бы очень удобно, если бы все производители переходников USB-COM следовали спецификации. Дело в том, что для питания e24 от COM-порта требуется как положительное напряжение на линии RTS (1-й вывод на разъеме прибора), так и отрицательное на DTR (8-й вывод). И вот его-то некоторые переходники не обеспечивают, что не позволяет использовать их для питания. Второй проблемой оказалось, что встроенный в материнскую плату COM-порт неадекватно реагирует на то, что e24 начинает передавать ему данные до полной инициализации. Это вынуждало строго следить за порядком включения — сначала компьютер, и лишь после полной загрузки — вольтметр. Третьей проблемой оказался способ обмена, непрерывный поток байтов от e24, который ещё усугублялся конструкцией имеющегося COM-порта. Это вынудило запускать отдельную программу (тоже на LabView), постоянно мониторящую COM-порт и перекодирующую данные с e24 в некие «глобальные переменные» а оттуда — в основную программу.
Вдоволь намучившись со всем этим, я решил собрать переходник на e24, лишенный этих недостатков. Невысокие требования к скорости обмена позволили обойтись простейшей реализацией USB-HID на контроллере ATmega88 (он был под рукой, но при желании несложно пересобрать и под другие). Итак, ядро переходника составил контроллер. Далее, для совместимости с RS232 пришлось добавить преобразователь уровней MAX232. Как я уже упоминал, e24 требует двуполярного питания: +3…+12 В на выводе 1 и -3…-12 В на выводе 8. Для этого идеально подошел незадействованный элемент MAX232 и транзистор VT1. Я использовал IRLML9303, но мощности таковы, что можно использовать любой p-канальный полевой или pnp биполярный (естественно, придется добавить ограничительный резистор в цепь базы) и даже обойтись без транзистора. Впрочем, последнее не отличается надежностью. Резистор R1 обеспечивает наличие нулевого потенциала при закрытом транзисторе и может выбираться в широких пределах от 1 кОм до 1 МОм. Для разводки платы оказалось удобным управлять питанием e24 с помощью вывода PD7 (задается макроопределением PWR в файле firmware/main.c и может быть переназначен на любой другой). В остальном схема стандартна: кварц на 12 МГц (проект v-usb поддерживает ряд других частот вплоть до 20 МГц, но придется пересобрать прошивку) с конденсаторами 22 — 60 пФ, преобразователи уровней USB D+/D- c 5 В до 3.6 В на стабилитронах и резисторах, конденсаторы на MAX232. В качестве корпуса для переходника я применил корпус от сломанного переходника USB-COM. О чем почти сразу пожалел, поскольку места внутри едва хватило, пришлось даже отказаться от разъема программирования, оставив лишь дорожки, к которым можно подпаять соответствующие выводы программатора.
Следующей задачей стало написание драйвера. Нежелание связываться с «глобальными переменными» LabView подтолкнуло к поискам альтернативного представления результата. Для АЦП наиболее прозрачным выглядит представление каждого канала как обычного текстового файла по аналогии с представлением устройств в Linux’е. Найти как реализовать что-то вроде файловой системы tmpfs мне не удалось, поэтому сделал простое отображение файла в память. Как показали эксперименты, такой способ в 5 — 10 раз быстрее, чем стандартный вроде printf. Правда, на виртуальной машине почему-то медленнее. Заставлять кого-то давать самописной программе права администратора без крайней необходимости никто не станет, поэтому вместо очевидного расположения файлов в /dev/e24/ было выбрано /home/dev/. Стандартного механизма отображения файла в память в Си нет, так что пришлось разбираться с уникальными для разных операционных систем. И если для основной все просто — есть man и куча примеров, то документация для Windows откровенно разочаровала. Впрочем, завернуть особенности работы с отображаемыми в память файлами в структуру данных и две функции (одна на открытие, вторая на закрытие) мне удалось. Сам драйвер было бы неплохо реализовать в виде демона (daemon, или близкое service), но в windows нет даже элементарного fork(). Что ж, остается добавить драйвер в автозагрузку без дополнительной защиты и средств управления. Впрочем, основные сигналы там присутствуют так что на штатное завершение работы при выключении компьютера можно рассчитывать.
Отображение результатов через обычные текстовые файлы позволяет при чтении обойтись стандартными средствами системы. Но в ряде случаев может потребоваться настройка какого-либо канала e24 на другой диапазон или частоту обмена. Попытки реализовать это стандартным способом — через fifo-файл ни к чему не привели так что самым простым оказалось каждый раз дергать переходник, благо нужно это достаточно редко. Кто бы сомневался что простого доступа к USB среда LabView не обеспечивает! Зато поддерживает сторонние динамические библиотеки (*.so / *.dll) и даже выдает подсказки по имеющимся в них функциям. Таким образом драйвер оброс отдельной динамической библиотекой для реинициализации (char e24_reinit(void)), конфигурации (char e24_configure(uint8_t, uint16_t, float, uint8_t, uint8_t)), чтения выбранного канала (средствами драйвера, а не прямым доступом к e24! double e24_read(uint8_t)) и, поскольку из справки по библиотеке нельзя получить более точную подсказку о назначнии и допустимом диапазоне параметров, вызов подсказки (char* e24_help(void)).
Таким образом получился переходник и драйвер, обеспечивающие удобную работу с этим вольтметром поддерживающие горячее подключение и не требующие от пользователя лишних телодвижений. Разумеется, такой переходник обладает и недостатками. Как и любое другое усложнение конструкции, он несколько снижает общую надежность системы (впрочем, доступность схемы, прошивки и исходных кодов значительно упрощают ремонт), не обеспечивает максимальной скорости, допустимой для e24 и не позволяет работать с несколькими вольтметрами одновременно. Чтобы исправить последний недостаток можно добавить в исходный код драйвера поддержку нескольких переходников с идентификацией не лишь по VID/PID, но и по полному пути или каким-то другим параметрам. Кроме того можно воспользоваться особенностью самого e24 возможностью записи в его EEPROM. К примеру, туда можно записать для каждого канала индивидуальное имя или номер, соответствуюий файлу, в который данные будут отображаться. Для моих задач это было несущественно, да и описанная ранее необходимость подпаивать разъем программирования для перепрошивки убедили остановиться на этом варианте.
Список радиоэлементовОбозначение
Тип
Номинал
Количество
ПримечаниеМагазинМой блокнот
DD1
МК AVR 8-битATmega881
DD2
ИС RS-232 интерфейсаMAX2321
VT1
MOSFET-транзисторIRLML93031
D1, D2
Стабилитрон3.3 — 3.6 В1
R1*
Резистор1к — 1М1
R2, R3
Резистор20 — 100 Ом1
R4
Резистор1.5 кОм1
C1 — C4
Конденсатор1 мкФ4
C5, C6
Конденсатор22 пФ1
ZQ1
Кварцевый резонатор12 МГц1
не показан
Конденсатор1 — 10 мкФ1
конденсатор по питаниюXS1
Разъем COMDB-9F1
XS2
Разъем USB1
на кабелеДобавить все
Скачать список элементов (PDF)
Прикрепленные файлы:
- Docs.tar.gz (7475 Кб)
- Pcb.tar.gz (1253 Кб)
- Firmware.tar.gz (166 Кб)
- Driver.tar.gz (226 Кб)