Например TDA7294

РадиоКот > Чердак

АЦП на 8 каналов для LPT-порта

Автор: kvas
Опубликовано 20.09.2013.
Создано при помощи КотоРед.

Хочу поздравить Кота и сайт с очередным юбилеем, а себя и остальных почитателей данного ресурса - с его (ресурса!) существованием.

Преамбула.

Дело было в давние-давние времена, когда звуковые платы для ПК продавали за нехилые деньги (прим.1) а душа к музыке уже тянулась... Данное противоречие народ пытался преодолеть, собирая из пары десятков сопротивлений и одного конденсатора простейший ЦАП, который назывался "Covox" (прим.2), благо LPT-порт, куда этот ковокс втыкался, был тогда на каждом ПК. А линейный вход был на почти любом советском магнитофоне, или за дополнительную пару-тройку часов паялся ещё и моно-усилитель для подключения динамика. Это было гораздо приятнее слушать, чем встроенный динамик ПК - да оно и понятно, ЦАП 8-ми битный вместо 1-битного получался (прим.3). Однако же серьёзно досаждала необходимость найти сопротивления, очень точно совпадающие по номиналу, особенно для младших разрядов ЦАП. Ну или можно было терпеть искажения при выводе тихого звука. Самые же отъявленные из небогатых аудиофилов брали советскую микросхему К572ПА1 вместо кучи сопротивлений, подавали на неё питание, а то и даже ставили после неё операционный усилитель. Ну а совсем потерявшие голову в погоне за качеством музыки выводили через эти 572ПА1 даже 10-ти битный звук в режиме стерео. С помощью ковоксов нельзя было вводить сигнал в ПК, они работали только на вывод. Но ведь даже у однонаправленного LPT-порта есть целых пять входных сигналов! А если к ЦАП добавить компаратор, и вывод компаратора завести на одну из входящих линий? Правильно, наличие нуля или единички на данном входе будет соответствовать тому, больше выводимый через ЦАП уровень, чем сигнал на втором входе компаратора, или меньше. Ну чем не основа для программного АЦП? Пусть неторопливого, для высоких частот не годящегося, но нам же не дуэт флейты-пикколо со скрипкой Ванессы Мэй оцифровывать! А если дополнить схему переключением нескольких аналоговых каналов? А если подойти с этой идеей к преподавателю электротехники и электроники, и предложить вместо курсового и экзамена сделать такое устройство и написать программу с псевдографическим интерфейсом для ввода аналоговых величин? Преподаватель согласился, дело было в середине 90-х годов и получить в наших краях устройство для ввода нескольких аналоговых сигналов в ПК больше негде было, если не собрать для покупки полугодовую зарплату всего ВУЗа, а тут два студента берутся такое изготовить и отдать всего лишь за оценку по его предмету. Договорились, что это будут 8 каналов 10 битного ввода с диапазоном 0..5 вольт. А программа будет настолько ясно и просто написанной, с таким количеством суперпонятных комментариев, что аж самодокументируемой практически. И следующие поколения студентов, работая на своих лабораторных занятиях с этой установкой и программой для неё, будут ещё сильнее отличать эмиттер от коллектора, ток от напряжения, и биполярник от полевика.

Амбула

Договаривались – веселились, засели делать окончательный вариант проекта – прослезились. У LPT-порта сколько выходных ножек? 8 для данных и 4 для служебных сигналов, итого – двенадцать. А потребуется сколько? Считаем, 10 для вывода значения на ЦАП, плюс 3 для переключения номера входного канала на коммутаторе аналоговых сигналов, итого – тринадцать, неувязочка получается. Пришлось дополнять схему не только двумя коммутаторами аналоговых сигналов «8 в 1» на микросхемах 561КП2, но и парой счётчиков на 155ИЕ5, которые могли преобразовать количество импульсов на одном входе в разные комбинации сигналов аж на четырёх выходах. Чтобы наш ЦАП преобразовывал сигнал как можно точнее, к нему был прикошачен (хотя тогда мы этого слова ещё не знали, ввиду неопытности) источник опорного напряжения на КП303Д+КС191Ф+переменный резистор, какой был под рукой. Ну и раз уж аппаратная часть совмещает в себе аналоговую и цифровую электронику, пришлось сделать блок питания, выдающий несколько разных опорных напряжений (схема блока питания не приводится). Всё это было собрано в железе, к железу была написана программа, а результат вручен преподавателю. Награда, в виде двух «пятёрок» за экзамены, нашла своих героев. Прошло почти два десятка лет, и вот мне захотелось поделиться результатами наших с другом трудов, когда-то подтолкнувших меня на скользкий путь радиогубительства…

На правах рекламы: как это работает?

Режимы грубого (семь бит) и точного (десять бит) преобразования. Восемь каналов, с минусами не соединёнными вместе, а заводимыми раздельно. Программа сама умеет масштабировать (задаются значения для начала и конца шкалы) и линеаризовать (линейно, корень, квадрат, логарифм, экспонента) входной сигнал. Кроме восьми реальных входов программа поддерживает вычисление значений до шестнадцати виртуальных ваттметров, которые получаются как произведения значений на двух реальных входах. Значения отображаются в цифрах и в виде линейных шкал. Определяется наличие подключения на входе (ну или наличие обрыва, если воспринимать альтернативно). Время программных задержек после подачи очередного сигнала через параллельный порт конфигурируется без перекомпиляции. Все настройки программы собраны в текстовом конфигурационном файле и легко редактируются перед запуском.

Как это работает (с точки зрения пользователя)?

Да довольно просто работает, надо подсоединить преобразователь к параллельному порту ПК и, находясь в каталоге, в котором лежит текстовый конфигурационный файл, запустить программу из каталога. При отсутствии конфигурационного файла в каталоге запуска программа сама создаст там минимальный файл, как образец для подражания. Предполагалось, что для каждой лабораторной работы будет создан свой конфиг.

Как это работает (в железе)?

Сразу скажу, на схеме слева обозначены номера контактов параллельного порта, справа видны восемь входов аналоговых коммутаторов. Старшие семь бит порта данных (d1..d7, контакты с 3 по 9) непосредственно подаются на старшие (A7..A1) биты входа ЦАП. Младшие три бита на входе в ЦАП (A10..A8) берутся с младших битов (Q2..Q4) счётчика импульсов СТ1, который инкрементируется импульсами по выходу d0 регистра данных LPT (вывод 2). Старший бит счётчика СТ1 не используется, а сбрасывается СТ1 импульсом на 16-м выводе параллельного порта (сигнал Init, бит C2 в регистре управляющих сигналов). Выдаётся такой импульс в процедуре «ViborSleduyuschegoKanala», как видно из её названия, переключающей на очередной канал коммутаторы аналоговых сигналов. Дополнительная функция этого-же сигнала – отключение выхода аналоговых коммутаторов, для этого после пары транзисторов (для инверсии и преобразования уровня сигнала из 5 в 7,5 вольт) он подаётся на управляющие входы EI микросхем 561КП2. Тем самым достигается то, что в момент переключения с канала на канал все аналоговые входы оторваны от цифровой части схемы и друг от друга. Счётчик СТ2 предназначен для преобразования числа импульсов на выводе 1 параллельного порта (сигнал Strobe, бит C0 в регистре управляющих сигналов параллельного порта) в три бита номера выбираемого канала с аналоговым сигналом. Старший бит этого счётчика тоже не используется, а выходы Q2..Q4 после транзисторных преобразователей уровня подаются на входы A, B и C коммутаторов аналоговых сигналов АК1 и АК2. Сброс СТ2 происходит по импульсу на 14-м выводе LPT (сигнал Auto LF, бит C1 в регистре управляющих сигналов параллельного порта). После этого импульса счётчик СТ2 сбросится до ноля, однако транзисторные преобразователи не только согласовывают уровень двоичного сигнала, но и инвертируют его! Поэтому на входах обоих аналоговых коммутаторов будут не три нулевых, а три единичных значения. Из-за этого нумерация входов всего устройства (1..8) не отличается на единицу от нумерации аналоговых входов (0..7) коммутаторов АК1 и АК2, а идёт в обратную сторону, т.е. на 0-й вход коммутатора заведён 8-й вход устройства, соответственно на 7-й вход коммутатора заходит 1-й вход устройства.

ЦАП, в роли которого используется микросхема К572ПА1, получает входное значение данных напрямую с LPT-порта (7 старших битов) и со счётчика СТ1 (3 младших бита), и на основе их вырабатывает некоторое аналоговое значение. Это аналоговое значение усиливается операционным усилителем ОУ1. Выход первого ОУ подаётся на вход второго ОУ, работающего в режиме компаратора. Здесь напряжение, сформированное ЦАП и ОУ1, сравнивается с положительным уровнем канала, выбранного в данный момент на аналоговом коммутаторе АК2. В это же время аналоговый коммутатор АК1 соединяет отрицательный уровень того же канала с общей (аналоговой и цифровой) землёй схемы. Получается, что на выходе второго ОУ будет либо высокое, либо низкое напряжение в зависимости от того, больше напряжение после первого ОУ, чем разница между «плюсом» и «минусом» выбранного аналогового входа, или нет. Этот выходной сигнал сравнения заводится на 12-й вход LPT-порта (бит S5 в регистре статуса параллельного порта). Чтобы не сжечь вход и не морочиться с формированием уровня сигнала, выход второго ОУ заведён на него не напрямую, а через транзистор. Попадая на базу, высокий уровень сигнала либо открывает транзистор, соединяя вход с землёй схемы, либо низкий уровень запирает транзистор и на вход LPT-порта попадает практически без изменений уровень, который в этот момент подан на 2-й контакт LPT-порта (сигнал d0 регистра данных), в этот момент имеющий высокое значение.

Как это работает (с точки зрения программиста)?

В основном, назначение строк программы либо делается понятным из комментариев, либо оно очевидно из самого её текста, названия процедур отражают выполняемые ими задачи. Функции чтения конфигурации вынесены в дополнительный исходный файл cfgparse.inc

Примечания:

1) представьте, о юные коты, аудиоконтроллеры тогда ещё не встраивали в материнки, да что там звуковухи, даже контроллер для жёстких и мягких дисков - и тот был отдельной платой!

2) интересные (и малоинтересные) подробности можно найти на http://ru.wikipedia.org/wiki/Covox

3) а ещё была программа Virtual Sound Blaster (пусть её почтенный автор никогда не испытает нужды в сметане и вискасе), позволявшая на ковокс выводить звук из игр, которые сами с ковоксом работать не умели

P.S. За практически полным отсутствием LPT-портов у современных ПК, сейчас это разве-что к старому ноуту, ну или к Ардуине подключить, хотя у неё и свои аналоговые входы есть. Однако, для натаскивания молодых котят в плане «дёрганья ножками» и понимания принципов "аналог-в-цифру" и "цифры-в-аналог" преобразований, думаю что и неплохо будет.


Файлы:
распределение сигналов по контактам разъёма
схема устройства
распределение сигналов по битам портов ввода-вывода ПК
исходные тексты на Паскале и пример конфигурации


Все вопросы в Форум.


ID: 1803

Как вам эта статья?

 Нравится
 Так себе
 Не нравится

Заработало ли это устройство у вас?

 Заработало сразу
 Заработало после плясок с бубном
 Не заработало совсем

5