Как подключить ацп к компьютеру

от admin

Работа АЦП с СОМ портом или простая система сбора данных

Эта статья ориентирована в основном для новичков. Для тех, кто решил сам попробовать себя в создании системы сбора данных, ввод на компьютер аналоговых сигналов, обработка их и т.д. Об этом и пойдет речь в данной статье, причем, все постараемся сделать самостоятельно.
Вообще в интернете и в литературе информации по данной теме достаточно мало… Особенно если использовать язык Visual Basic. Поэтому постараюсь заполнить, хотя бы отчасти, этот пробел.
Итак, начнем…
Какова бы не была у вас цель, для начала необходимо приобрести собственно аналого-цифровой преобразователь (АЦП). А так же, установить на компьютер среду разработки Visual Basic 6.0. Так же вам надо элементарно уметь ориентироваться в этой среде разработки… т.к. статья рассчитана но то, что читатель имеет хотя бы начальные знания в программировании на языке Visual Basic. Так же рекомендую почитать литературу [1], [3].

В качестве АЦП рекомендую приобрести TLC549IP. Это 8 разрядный, последовательный АЦП с простым протоколом обмена. О нем и пойдет речь в статье. Разумеется, вы можете использовать и другие АЦП с соответствующими изменениями в схеме и коде. Подробно о нем можно почитать в [1].
После того как вы пробрели АЦП необходимо собрать аппаратную часть нашей системы сбора данных, а именно схему представленную на Рис. 1.

Схема была заимствована из [1] с небольшими изменениями. Диоды VD1, VD2, VD6 – КД521, стабилитроны любые на напряжение стабилизации 3…5 В. Вместо 78L05 можно применить КРЕН5А. Резисторы R1, R2 с допуском 1%, или подбор из нескольких с максимально близким значением сопротивления. От них будет зависеть точность измерений. Резистор R3 желательно многооборотный.

Настройка: подав питание на плату, измеряем напряжение на выводе Out стабилизатора DA1. Записываем полученное значение напряжения с 3-мя знаками после запятой, оно нам потребуется в дальнейшем. На выводе 1 микросхемы DD1 с помощью резистора R3 устанавливаем напряжение равное точно половине измеренного на выводе Out стабилизатора.
Теперь займемся собственно программной частью. Вообще говоря, использовать на первых порах интерфейсы связи типа RS-232, I2C, Micro Ware и т.п. считаю нецелесообразным, т.к. при незначительном усложнении кода программы может серьезно усложнится аппаратная часть. Поэтому будем использовать простейший протокол обмена взятый из “даташита” на АЦП. А именно простую его реализацию. Конечно с подобным протоколом не достичь высокой скорости, ограничения в данном случае накладывает сам Visual Basic, но для получения первых результатов с минимумом затрат времени и сил, а также измерения относительно медленно меняющихся процессов он вполне подходит. Протокол связи АЦП TLC549IP показан на Рис. 2.

Во время единичного состояния на выводе CS (выбор кристалла) аналого-цифрового преобразователя происходит собственно преобразование. Выдача данных начинается при низком уровне CS с появлением тактового импульса clock, по одному биту на каждый импульс. Чтобы выдать 8 битный код нужно соответственно 8 тактовых импульсов. После чего CS можно перевести в единичное состояние и произвести следующее преобразование. Более подробно о работе АЦП можно почитать в [1].
Из всего этого можно сделать вывод, что необходимо написать программу драйвер, которая бы формировала нужные последовательности импульсов в нужные моменты времени, после чего нам остается только принимать данные.

Запустите среду разработки Visual Basic и создайте стандартный EXE проект. Добавьте элемент управления MSComm Control. Добавить его в панель компонентов можно следующим образом Project—>Components—> выбрать в списке Microsoft Comm Control 6.0 . Разместите его на форме, а также 2 метки label и 2 таймера Timer. Имена оставьте по умолчанию.
Теперь можно приступить к написанию кода простого вольтметра.
Зададим переменные: Dim b1, b2, b3, b4, b5, b6, b7, b8, sum, Ud As Single

В процедуру загрузки формы поместите следующий код:

В процедуру Timer1 поместите код:

Код в Timer1 представляет собой собственно драйвер. Который периодически повторяясь, формирует тактовые импульсы и принимает биты данных. Ud – напряжение на входе АЦП, если применить 10, 12 разрядные АЦП число 255 заменится соответственно на 1024, 4096. Для 10, 12 разрядных АЦП нужно добавить недостающие биты в код, руководствуясь их «даташитами». Значение 5.083 это значение напряжения, получившееся у меня на выходе Out стабилизатора. Забейте сюда ваше значение.

Для питания платы можно применить как отдельный источник так и питать непосредственно от COM порта. Для этого в процедуре Timer2 поместим следующий код:

Private Sub Timer2_Timer()
MSComm1.Output = Chr(0) & Chr(0) ‘создаем импульсы на выводе TX (3) для питания платы АЦП
End Sub
Необходимо помнить, что сильно нагружать COM порт нельзя… максимум, на что можно рассчитывать это 20 мА. В рабочем режиме схема потребляет ток не более 5 мА.

Теперь подключите плату к COM порту и запустите проект. Измерьте напряжение на выводе IN стабилизатора DA1, оно должно быть не ниже 6.5 В. Если это не так следует применить отдельный источник питания. Изменяя напряжение на входе АЦП, убедитесь, что программа работает и на экране показывает напряжение. Точность отсчета напряжения при применении 8 разрядного АЦП равна 20мВ, с 10 разрядным АЦП – 5мВ, 12-1.2 мВ

Немного о работе в Visual Basic и созданного приложения с ком портом.
Как вы уже наверно поняли для работы с ком портом нужен компонентMicrosoft Comm Control а именно файл MSCOMM32.ocx который после установки Visual Basic находится в директории C:\Windows\system32. К чему я это, а к тому, что если вы вашу программу, не создавая инсталлятора, скопируете на другой компьютер, не имеющий Visual Basic она работать не будет. Необходимо этот файл также скопировать в ту же директорию что и на вашем компьютере, т.е. в system32. Или создать инсталлятор.
Теперь о некоторых командах:
Команда задающая скорость обмена данными:
MSComm1.Settings = «1200,N,8,1»

Команда указывающая номер ком порта
MSComm1.CommPort = 1

Команды открывающие и закрывающие ком порт
MSComm1.PortOpen = True
MSComm1.PortOpen = False

Команды выводящие +12В на соответствующую ножку ком разъема:
MSComm1.RTSEnable = True RTS (7) -название вывода и номер ножки
MSComm1.DTREnable = True DTR (4)

Команды выводящие -12В
MSComm1.RTSEnable = False
MSComm1.DTREnable = False

Опросить на наличие единичного или нулевого состояния можно выводы CD (1), CTS (8), DSR (6).
If MSComm1.CDHolding = True Then (если единица то…)
If MSComm1.CDHolding = False Then (если ноль то…)

Передача на вывод Tx (3) ASCII кода символа или строки:
MSComm1.Output = «А»
Числа
MSComm1.Output = Chr(10) число может меняться от 0…255
Записав такую команду в таймере и меняя число или символ можно создать ШИМ модуляцию. Более подробно о командах можно ознакомиться скачав описание контрола Microsoft Comm Control.

Теперь имея данный код можно написать ряд программ для сбора данных. К примеру: вольтметр, амперметр, измеритель температуры, простой осциллограф, сохранять данные в файл. Измерения можно проводить как раз в 1 мс, так и раз в час и день, тем самым производить мониторинг длительных процессов.
Для работы с переменными напряжениями (переходящими через 0), а так же для расширения пределов измерений необходим входной усилитель, схему которого можно взять из [1]. Для работы с сетевым напряжением или с устройствами гальванически не развязанными с сетью следует обязательно сделать опторазвязку схемы от компьютера.

Использование АЦП в STM32F103C8 (STM32 Blue Pill)

В современных электронных устройствах широкое применение находят аналого-цифровые преобразователи (АЦП, в англ. ADC – Analog to Digital Converter). С помощью данных АЦП можно считывать значения напряжения с различных аналоговых датчиков: температуры, наклона, тока, изгиба и многих других. В данной статье мы рассмотрим использование АЦП в плате STM32F103C8, которая также называется STM32 Blue Pill («синяя таблетка»). Мы подключим к плате STM32 Blue Pill небольшой потенциометр, напряжение с которого будем подавать на один из АЦП платы, измеренное значение напряжения мы будем выводить на экран ЖК дисплея 16х2.

Внешний вид проекта использования АЦП в STM32F103C8 (STM32 Blue Pill)

Ранее на нашем сайте мы рассматривали использование АЦП в следующих микроконтроллерах (микроконтроллерных платах):

  • в микроконтроллере AVR;
  • в плате Arduino; ;
  • в плате Raspberry Pi Pico.

Необходимые компоненты

  1. Плата разработки STM32F103C8T6 (STM32 Blue Pill) (купить на AliExpress).
  2. ЖК дисплей 16×2 (купить на AliExpress).
  3. Потенциометр 100 кОм (купить на AliExpress).
  4. Макетная плата.
  5. Соединительные провода.

Сравнение АЦП в платах Arduino и STM32F103C8

Плата Arduino содержит 6 каналов АЦП (8 каналов в платах Mini и Nano, 16 – в плате Mega). Каждый из этих АЦП имеет разрядность 10 бит и диапазон входных напряжений 0V–5V. То есть он преобразует входное напряжение в диапазоне от 0 до 5V в целое число в диапазоне от 0 до 1023. А в плате STM32F103C8 10 каналов АЦП с разрядностью 12 и диапазоном входных напряжений 0V-3.3V. То есть данные АЦП преобразуют входное напряжение в диапазоне от 0 до 3.3V в целое число в диапазоне от 0 до 4095.

АЦП в STM32

АЦП, применяемые в микроконтроллерах STM32, используют принцип SAR (successive approximation register – последовательный аппроксимирующий регистр), при котором преобразование выполняется за несколько шагов. Число этих шагов равно разрядности АЦП.

10 каналов АЦП в плате STM32F103C8 означает что мы имеем 10 контактов АЦП, на каждом из которых мы можем измерять аналоговое напряжение. 12 бит характеризуют разрядность АЦП, это означает что на выходе АЦП в зависимости от значения аналогового напряжения мы получаем целое число в диапазоне от 0 до 4095. Инкремент аналогового напряжения в зависимости от единичного приращения данного числа можно определить по следующей формуле:

Подключение АЦП А-24

Для установки АЦП А-24 необходим драйвер, который автоматически копируется в компьютер с поставочного диска в процессе установки АЦП.

• Установите на компьютере поставочный диск, но не запускайте установку ПО.

• Подключите АЦП А-24 к компьютеру, соединив USB-порт АЦП с USB-портом компьютера с помощью кабеля из комплекта поставки. При этом появится сообщение об обнаружении нового оборудования и откроется окно программы-установщика для установки драйвера АЦП А-24.

• Установите драйвер, следуя указаниям в окне программы-установщика.

Это окно, в зависимости от установленного на компьютере ПО, может иметь различный вид, поэтому в настоящем руководстве даются только следующие общие рекомендации:

— не надо обращаться к Windows Update;

— следует выбирать автоматическую установку ПО;

— если ПО по какой-то причине не установилось автоматически, указать в качестве места поиска каталог А-24 на поставочном диске;

— если открывается окно с выбором: продолжить или прекратить установку ПО — выбирать продолжение установки.

В случае затруднений следует обратиться к специалисту по компьютерной технике.

• Подключите аналоговый вход АЦП А-24 Вход1 к хроматографу с помощью кабеля из комплекта поставки:
красный провод (жила и экран) – соответственно к клеммам «+» и «-» аналогового выхода детектора (выход Интегратор или Самописец),
черный длинный – к заземлению,
белый (жила и экран) – к инжектору (Запуск интегратора и т.п.) для синхронизации запуска хроматограммы с инжекцией.
Таким же образом, если требуется, подключите Вход 2 .

Организовываем взаимодействие между ПК и ЦАП/АЦП при помощи ПЛИС

В современном цифровом мире необходимость ЦАП/АЦП (цифро-аналоговых преобразователей/аналого-цифровых преобразователей) не подвергается сомнению: они используются для обработки сигналов разнообразных датчиков, в звуковой аппаратуре, ТВ-тюнерах, платах видеовхода, видеокамерах и т.д.

Однако использование или отладка ЦАП/АЦП могут быть затруднены поставленными производителем аппаратуры ограничениями, например, на используемое ПО или на способы управления устройством. Это наводит на мысль о проектировании собственной модели взаимодействия.

В этой статье мы рассмотрим возможность организации взаимодействия между ПК и ЦАП/АЦП при помощи ПЛИС.

Предисловие

Основной целью данной статьи является описание решения конкретной задачи, а так же знакомство с интерфейсами взаимодействия интегральных микросхем (ИМС). Внимание основному предназначению ЦАП/АЦП здесь не отводится.

Статья требует некоторых знаний в объектно-ориентированном программировании и схемотехнике, так что если вы не знакомы с этими понятиями, рекомендуется начать с них.

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

Всем удачи и новых свершений!

Небольшой ликбез на тему интерфейсов

Дисклеймер

Если вы знакомы с устройством основных интерфейсов, использующихся для коммуникации ИМС, вы можете спокойно пропустить этот пункт.

Общая информация

Интерфейс в общем своем определении является совокупностью средств и правил, обеспечивающих взаимодействие отдельных систем.

В рамках более узкой сферы физических интерфейсов, это понятие можно описать как способ взаимодействия физических устройств при помощи электрических (оптических, электромагнитных и т.д) сигналов. Интерфейс может содержать аппаратную, программную и конструктивную составляющую.

Если говорить простым языком, то под интерфейсом подразумевается некоторая инструкция по коммуникации между устройствами. Эта инструкция может содержать требования о конструкции разъема, физическом количестве линий и напряжении на них, способе соединения устройств, способе передачи данных и т.д. Инструкция эта известна заранее и приемнику, и передатчику. Это обязательное условие для совершения процесса передачи данных. Инструкция для коммуникации по определенному интерфейсу вшита в контроллер – микросхему, организующую передачу данных по выделенному порту. Контроллер берет на себя задачу приема сигнала и преобразования его в понятную для принимающего устройства форму, и наоборот. Так же контроллер ответственен за все процессы, происходящие со связанным с ним портом.

С целью не вдаваться в подробное перечисление классификаций, далее рассмотрены самые необходимые в дальнейшем понимании аспекты интерфейсов.

По способу соединения

С точки зрения способа соединения устройств (то бишь топологии сети), описанные в этой статье интерфейсы могут быть организованы в соединения:

  • «точка-точка»;
  • «шина»;
  • «кольцо» («цепочка»).

Топология «шина» (или, как ее еще часто называют «общая шина» или «магистраль») предполагает использование как минимум одного общего канала, к которому подсоединены все приемопередающие устройства. Общий канал используется всеми устройствами по очереди. Все сообщения, посылаемые отдельными устройствами, принимаются и прослушиваются всеми остальными устройствами, подключенными к сети. Из этого потока каждый абонент сети отбирает адресованные только ему сообщения.

В цепочечных интерфейсах (топология типа «кольцо») устройства соединены последовательно. Недостатком является то, что при процессе обмена данными посылка проходит все устройства, что замедляет процесс адресации сообщения, а также при выходе из строя какого-либо звена цепи последующие подключенные устройства остаются без возможности коммуникации с сетью. Достоинством являются минимальные затраты на соединительное оборудование.

По способу передачи информации

По способу передачи информации интерфейсы различают:

  • параллельные;
  • последовательные;
  • параллельно-последовательные.

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

Смешанный (параллельно-последовательный/байтовый) способ широко используется в системах с различной разрядностью представления данных у разных устройств

По режиму передачи

По режиму передачи информации различают интерфейсы:

  • с двусторонней одновременной передачей (дуплексные);
  • с двусторонней поочередной передачей (полудуплексные);
  • с односторонней передачей (симплексные).

При полудуплексном режиме любой из двух абонентов может начать передачу информации другому, если линия связи интерфейса при этом оказывается свободной.
Простым языком: если один абонент транслирует информацию, то другие абоненты сети в этот момент имеют право только «слушать» и ждать освобождения канала на случай если они хотят передать свое сообщение.

В симплексном режиме только один из двух абонентов может инициировать в любой момент времени передачу информации по интерфейсу. То есть этот режим предусматривает одностороннюю связь с заранее определенным приемником и передатчиком.

По принципу обмена информацией

По принципу обмена информацией интерфейсы подразделяют на:

  • синхронные;
  • асинхронные.

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

О каких интерфейсах пойдет речь?

В настоящий момент самыми распространенными интерфейсами для взаимодействия между интегральными микросхемами (ИМС) являются синхронные SPI и I2C и асинхронный UART.

I2C – последовательная асимметричная шина для связи между интегральными схемами внутри электронных устройств. Шина I2C применяется для соединения низкоскоростных периферийных компонентов с процессорами и микроконтроллерами. I2C реализовывает передачу данных в полудуплексном режиме в формате «Ведущий-ведомый», в котором поддерживается несколько ведущих устройств.

Концепция стандарта состоит в том, что каждое подключенное к шине устройство определяется уникальным адресом, используемым при обращении к этому устройству. Такая концепция значительно упрощает идентификацию устройства, что позволяет интерфейсу иметь всего два канала. Классическая адресация включает 7-битное адресное пространство с 16 зарезервированными адресами. Это означает, что разработчикам доступно до 112 свободных адресов для подключения периферии к одной шине. Все операции по шине I2C осуществляются при помощи канала последовательных данных (SDA) и канала синхронизации (SCL).


Диаграмма передачи данных по интерфейсу I2C

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

Шина SPI организована по принципу «ведущий-подчиненный». Ведущий шины передает данные по линии MOSI синхронно со сгенерированным им же сигналом SCLK, а подчиненный захватывает переданные биты данных по определенным фронтам принятого сигнала синхронизации. Одновременно с этим подчиненный отправляет свою посылку данных по линии MISO, тем самым организую дуплексную передачу данных. Так же подчиненное устройство ждет сигнала разрешения на передачу данных по линии SS.


Диаграмма передачи данных по интерфейсу SPI

UART – универсальный асинхронный приемопередатчик – интерфейс для связи цифровых устройств, предназначенный для передачи данных в последовательной форме.
Основными каналами данного стандарта являются RxD (принимающий канал) и TxD (передающий канал).

Передача данных в UART осуществляется по одному биту по каналу TxD в равные промежутки времени. Этот временной промежуток определяется заданной скоростью и для конкретного соединения указывается в бодах. Так как UART является асинхронным интерфейсом, то помимо информационных бит, UART автоматически вставляет в поток синхронизирующие метки, так называемые стартовый и стоповый биты. При приеме данных эти биты не учитываются, так как они используются только для маркировки старта и окончания передачи информации. Обычно стартовый и стоповый биты обрамляют 8 бит данных (максимальный размер посылки), при этом младший информационный бит передается первым, однако эта конфигурация является настраиваемой.
Изначально UART предназначался для связи двух устройств по принципу «точка-точка». Впоследствии были созданы физические уровни, которые позволяют связывать более двух UART по принципу полудуплекса. Существуют реализации типа «общая шина» и «кольцо».

Читать:
Daewoo nexia где находится диагностический разъем


Диаграмма передачи данных по интерфейсу UART

Что это за ЦАП?


Вроде не этот

Для начала определимся с используемым ЦАП/АЦП:

Отладочная плата Analog Devices AD9993-EBZ представляет собой устройство, объединяющее четыре 14-битных АЦП и два 14-битных ЦАП.

Управление режимами работы этой ИМС осуществляется за счет изменения состояния ее внутренних регистров. В AD9993 используются 66 регистров с размером хранимого (обрабатываемого) слова в 8 бит, адреса которых описываются трехразрядными шестнадцатеричными значениями (12 бит данных). Поддерживаются два типа команд – команда чтения и команда записи. Другими словами, для того, чтобы корректировать работу ИМС, необходимо передать команду записи некоторого допустимого 8-битного значения по определенному адресу регистра. Доступ к регистрам данной ИМС осуществляется через последовательный периферийный интерфейс (SPI), подключение к которому на отладочной плате реализовано через 40-контактный разъем FIFO_0 или через дополнительно устанавливаемую контактную группу.


Вроде этот (FIFO_0 – верхний серый разъем)

Основные требования по предельным параметрам интерфейса SPI:

  • Максимальная частота передачи данных – 25 МГц;
  • Продолжительность верхнего и нижнего уровня на линии генерации синхросигналов – 10 нс;
  • Время установки уровня на линиях передачи данных и на линии разрешения – 2 нс;
  • Время удержания уровня на линиях передачи данных и на линии разрешения – 2 нс;
  • Гарантированное время действительности одного бита данных на линии передачи ведомого устройства – 2нс.

Что говорит производитель?

Рекомендованная схема управления

Исходя из документации AD9993-EBZ, рекомендованным способом управления ИМС является использование отладочной платы Analog Devices HSC-ADC-EVALC, подключенной к ИМС по 40-контактному порту, и к ПК по интерфейсу USB.

В качестве ПО для управления используется SPIController.


Рекомендованная схема


Analog Devices HSC-ADC-EVALC (базируется на ПЛИС Xilinx Virtex-4)

  • Высокая стоимость. Отладочная плата HSC-ADC-EVALC на официальном сайте Analog Devices предлагается по цене $698.28.
  • Неудобный пользовательский интерфейс. ПО SPIController, помимо основной функции записи и чтения регистров, не предоставляет возможности сохранения или запланированного запуска команд.
  • Ограниченная совместимость. Для управления других ИМС с возможностью взаимодействия по интерфейсу SPI требуется найти и добавить отдельный файл конфигурации для ПО SPIController, разработанный специально для этой ИМС. Список доступных для управления ИМС ограничен продукцией Analog Devices, поддерживающий конфигурирование по интерфейсу SPI.
  • Официальная поддержка производителя.
Немного об HSC-ADC-EVALC

Хочется отметить, что использование платы Analog Devices HSC-ADC-EVALC в качестве устройства управления ЦАП/АЦП не является его главным предназначением.

HSC-ADC-EVALC главным образом используется как плата буферной памяти для АЦП, однако она также имеет функционал конфигурирования отладочных плат через интерфейс SPI, если подключенные платы это поддерживают.

Собственная модель взаимодействия

Причина использования промежуточного устройства

Очевидным является факт того, что взаимодействие ЦАП/АЦП и ПК невозможно организовать напрямую, так как SPI, с помощью которого предусмотрено программирование AD9993-EBZ, не является типовым интерфейсом современного ПК.

Для решения поставленной задачи необходимо было использовать устройство-посредник, который бы преобразовывал данные из интерфейса USB, посылаемые с компьютера, в формат интерфейса SPI, поддерживающийся ИМС.

В ходе прорабатывания вариантов выбор пал на использование отладочной платы Terasic DE10-Nano, работающей на базе ПЛИС Cyclone V.


Собственная модель взаимодействия

Почему ПЛИС – это круто?

Основные преимущества использования ПЛИС:

  • Удобство разработки. DE10-Nano позволяет гибко реализовать взаимодействие с подключенными устройствами, так как в отличие от обычных цифровых микросхем, логика работы ПЛИС не определяется при изготовлении, а задается посредством программирования. Для программирования используются программатор и IDE, позволяющие задать желаемую структуру цифрового устройства в виде принципиальной электрической схемы или программы на языке описания аппаратуры Verilog.
  • Низкая стоимость. Цена DE10-Nano выгодно отличается от HSC-ADC-EVALC ($110 против $698.28). Помимо этого DE10-Nano все еще остается универсальным устройством, способы применения которого ограничиваются только фантазией его владельца.
  • Перспективы. В дальнейшем проект для ПЛИС можно дополнить функционалом буферной памяти для АЦП, тем самым полностью заменяя предлагаемое производителем решение.
  • Коммьюнити. В интернете имеется огромное количество FPGA-ориентированных блогов и статей (FPGA – field-programmable gate array – интернациональное определение полупроводниковых устройств, программируемых на уровне принципиальной схемы), что является неоспоримым плюсом для неопытного инженера (коим автор статьи и является). Отдельного упоминания заслуживает форум rocketboards c кучей готовых проектов и гайдов к ним.

Процесс проектирования

Ничего не предвещало беды.

В ходе проектирования модели взаимодействия было принято решение реализовать интерфейс SPI на основе GPIO (пинов общего назначения), контактная база которого имеется на DE10-Nano. Реализация контроллера SPI на базе ПЛИС не должна была создавать особых проблем благодаря большому количеству материалов на схожую тему.

Однако затруднения вызвала реализация подключения ПЛИС к компьютеру по интерфейсу USB.

DE10-Nano имеет следующие порты USB:

  • USB mini-B под управлением чипа FT232R, реализующий подключение UART to USB.
  • USB mini-B под управлением чипа SMSC USB3300, реализующий физический уровень интерфейса USB, а так же использующийся для программирования ПЛИС.

Части HPS и ПЛИС чипа Cyclone V имеют свои собственные контакты. Эти контакты не делятся свободно между HPS и ПЛИС. Контакты HPS конфигурируются программным обеспечением, выполняемым в HPS. Контакты ПЛИС программируются с помощью образа конфигурации ПЛИС через HPS или любой другой поддерживающийся внешний источник.

Для того, чтобы организовать взаимодействие программируемой логики чипа Cyclone V с этими портами, необходимо создать специальный загрузчик Linux, работающий на HPS, а также необходимо разработать программу, которая способна передавать сигналы с контроллеров доступных портов USB на свободные контакты ПЛИС.

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

Выход есть!

Плотно прошерстив просторы Интернета, решено было использовать внешний контроллер UART.

Внешний контроллер UART представляет собой небольшую плату на базе чипа FT232RL. На плате установлены разъемы miniUSB-B для связи с компьютером и 6-контактный разъем для связи с микроконтроллерами и устройствами.
Подключение контроллера происходит по интерфейсу USB к ПК, и через контактную базу GPIO к DE10-Nano.


Сам контроллер от компании Waveshare (использован в проекте)

Использование интерфейса UART поверх USB для передачи данных с ПК фактически лишает необходимости разбираться со сложным и многослойный устройством протокола USB. С этого момента взаимодействие по интерфейсу USB больше не является нашей заботой, так как эта задача отводится драйверам, предустановленным в системе или самостоятельно установленным пользователем.

Помимо линий питания и земли, а также линий передачи и приема данных, на плате присутствуют контакты, подписанные как RTS и CTS. Эти контакты используются для так называемого управления потоком – механизма, предназначенного для сигнализировании о готовности принимать данные со стороны ведущего или ведомого устройства в зависимости от состояния линий. Использование этих линий не является необходимостью, поэтому для отключения механизма необходимо указать в настройках драйвера компьютера что управление потоком не используется (обычно такая конфигурация является дефолтной).

При подключении к ПК в системе Windows контроллер UART определяется как последовательный виртуальный порт. Следовательно, разработка схемы взаимодействия с ПК сводится к созданию ПО с функционалом взаимодействия с последовательным виртуальным портом, а также к разработке проекта для ПЛИС, реализующего прием/передачу данных по интерфейсу UART.

Внешний контроллер UART по сути является абсолютным аналогом уже имеющегося на DE10-Nano контроллера, однако единственным его преимуществом является возможность непосредственного подключения к свободным контактам ПЛИС. Стоимость подобного устройства колеблется от $5 до $10.

Разработка ПО

Общая информация

Как уже было сказано, разработка ПО для ПК сводится к созданию программы, поддерживающей обмен информацией с виртуальным последовательным портом. В ходе анализа доступных программных средств для разработки ПО выбор пал на язык программирования Java 8-ой редакции c использованием библиотеки RTXT.

Java – это строго типизированный объектно-ориентированный язык программирования, обладающий рядом ключевых особенностей. В частности – программы, написанные на ЯП Java транслируются в специальный байт-код, что позволяет им выполняться на любой компьютерной архитектуре, для которой существует реализация виртуальной Java-машины.

Стандартные библиотеки Java не имеют возможности взаимодействовать с виртуальным последовательным портом. Именно для этого была использована библиотека RTXT. RTXT распространяется по лицензии свободного программного обеспечения. Библиотека использует системную реализацию взаимодействия с интерфейсами и предоставляет классы для анализа, подключения, операций чтения и записи, использующие последовательный порт. Больше про эту библиотеку можно найти тут.

В качестве инструмента для разработки пользовательского интерфейса использована старая, но надежная встроенная библиотека Swing. Благодаря возможности изменения тем, простой UI на Swing может выглядеть не уродливо более-менее современно.

Сама программа по-спартански простая и в основном использует документированные возможности библиотеки RTXT.

Основной функционал программы

Вот так происходит определение доступных портов:

Подключение к выбранному порту:

Процесс передачи данных:

Как уже было сказано, управление ЦАП/АЦП происходит посредством передачи команды записи некоторого допустимого 8-битного значения по определенному адресу регистра, описанного в документации. Для определения текущего состояния регистра, необходимо передать команду чтения и указать адрес запрашиваемого регистра. Полное описание как всегда в документации.

Передача данных по UART

В ходе изучения AD9993-EBZ было выяснено, что в доступном 12-ти битном адресном пространстве регистров используются только 8 бит данных. Так же передаваемое значение состояния регистра описывается 8-мью битами. Для определения типа передачи данных (запись/чтение) требуется передать 1 бит данных.

Так как текущее ограничение на максимальный размер посылки по интерфейсу UART является 8 бит данных, было принято решение о передаче 3 последовательных посылок размером 8 бит при процессе записи и 2 посылки при процессе чтения.

Первая посылка будет содержать тип передачи данных, продублированной на весь размер посылки. Следовательно, возможных значений может быть всего два: 00000000 для чтения и 11111111 для записи соответственно. Использование целой посылки для передачи одного бита данных было сделано для упрощение дальнейшей обработки принятых сигналов.
Далее передается адрес запрашиваемого регистра и передаваемое значение состояния регистра при процессе записи.


Осциллограмма разрабатываемой посылки UART

Пользовательский интерфейс

Основными элементами пользовательского интерфейса ПО являются кнопки подключения/отключения от доступных последовательных портов (элементы 3,4), поля ввода адреса и значения регистра (элементы 7,8), окно логов (элемент 6). ПО спроектировано с возможностью взаимодействия с ним в двух состояниях: «подключен к порту» и «отключен от порта». Состояния определяют активность некоторых элементов на интерфейсе программы, а также ограничивают возможность исполнения определенных методов с целью уменьшения вероятности ошибок и некорректного использования ПО. При включении программа находится в состоянии «отключен от порта». Так же в целях облегчения работы с программой (что и я являлось одной из главных целей проекта) был добавлен функционал подключения файлов с уже сохраненными командами в формате JSON (элемент 10).

Процесс загрузки команд:


Выбор файла


Интерфейс с командами

Функционал позволяет сортировать загруженные команды по разделам (элемент 12), настраивать процесс работы с подключенными командами (отправлять ли команду на последовательный порт сразу при нажатии, или заполнять поля адреса и значения в соответствии с выбранной командой).

Разработка проекта для ПЛИС

Общая информация

Прежде чем начать разработку проекта для ПЛИС, необходимо определиться с задачей, которую он обязан решить.

Звучит она примерно так: проект для ПЛИС должен поддерживать представленное ниже преобразование данных:


Диаграмма преобразования данных

На вход DE10-Nano поступают сигналы с линии Tx интерфейса UART (верхний сигнал). Далее ПЛИС необходимо правильно определить принятые данные из трех посылок по 8 бит каждая и преобразовать их в соответствующий документации формат посылки SPI (представлен в 4 линиях).

Основными модулями, необходимыми для реализации данного преобразования, являются модуль контроллера UART и модуль контроллера SPI. Именно им отводится оставшаяся часть главы.

При разработке проектов для ПЛИС использовалась IDE Qartus Prime Lite Edition 17-ой версии.
Если вы не имеете опыта использования Quartus или вообще не программировали ПЛИС, рекомендуется начать с понятного (по моему мнению) примера первого проекта на Quartus.

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

Контроллер UART

Описание

Контроллер UART состоит из трех модулей:

  • генератор импульсов;
  • модуль записи;
  • модуль чтения.
Генератор импульсов

Так как интерфейс UART является асинхронным, то для корректного принятия передаваемого сигнала приемнику требуется генерировать собственный опорный сигнал, позволяющий правильно определять начало нового бита информации.

Существует общепринятый ряд стандартных скоростей для UART: 300; 600; 1200; 2400; 4800; 9600; 19200; 38400; 57600; 115200; 230400; 460800; 921600 бод. В нашем случае передача данных происходит на скорости 9600 бод. Далее нам нужно получить генератор с частотой, в 16 раз превышающую скорость символов. Это необходимо для того, чтобы корректно детектировать уровень передаваемого сигнала.

Для генерирования импульсов используется имеющийся в чипе генератор с частотой 50 МГц. Чтобы получить искомую частоту, требуется учитывать каждый 325-ый импульс генератора.
Вот так это будет выглядеть на языке Verilog:

Модуль чтения

Модуль чтения производит преобразование входного сигнала с линии RX в выходной 8-разрядный массив данных.

Непосредственно чтение и передача прочитанных данных на выход:

Модуль передачи

Модуль передачи преобразует 8-разрядных входной сигнал в последовательный пакет данных стандарта UART.

Непосредственная передача данных:

Контроллер SPI

Важное отступление

Так как контроллер SPI, реализованный на базе ПЛИС, представляет собой более сложную логическую структуру, чем контроллер UART, то дальнейшее объяснение логики работы легче провести на схемотехнической модели контроллера.

Общая схема контроллера

Разработанную модель можно разделить на 3 основных модуля:

  • модуль последовательной записи;
  • модуль битового счетчика;
  • модуль анализатора ошибок.

Тактирование работы схемы обеспечивается сигналом частоты 12,5 МГц, подаваемым через линию CLK_125.

Запуск работы контроллера по формированию посылки управления осуществляется сигналом «START». По этому сигналу все модули схемы устанавливаются в исходное состояние и инициализируется начало цикла формирования требуемых сигналов на выходных линия CLK, SS, MOSI интерфейса SPI

Модуль последовательной записи

Модуль последовательной записи выполнят основную задачу контроллера SPI, а именно – выдачу параллельных битовых данных в последовательную линию MOSI. Происходит это благодаря элементу RG_24_PI_SO, который функционирует по принципу сдвигового регистра, основанного на D-триггерах.

Элемент RG_24_PI_SO имеет 24 входа данных, соответствующих документации AD9993-EBZ о формате посылки SPI. В них входят:

  • Данные команды (DATA_0–DATA_7);
  • Данные адреса регистра (ADR_0–ADR_12);
  • Бит режима записи/чтения W/R.
Модуль битового счетчика

Модуль битового счетчика необходим для определения длительности сигнала разрешения записи данных на линии SS интерфейса SPI. Так как, согласно документации AD9993-EBZ, длительность сигнала разрешения должна быть равна суммарной длительности передаваемых данных, возникает необходимость отсчета 24-х синхроимпульсов с начала передачи данных для определения необходимой длительности сигнала разрешения. Функцию счета выполняет элемент ST_32, который при определении 24-го сигнала синхроимпульса воспроизводит сигнал, который используется для обнуления счетчика, а также для окончания передаваемого сигнала разрешения.

Помимо основного функционала, модуль битового счетчика также отвечает за инициализацию процесса анализа ошибок, начальным действием которого является передача команды чтения значения по адресу последнего записанного регистра. Так как процесс анализа ошибок необходимо начинать после промежутка времени, эквивалентному длительности 23-х синхроимпульсов с момента передачи последней пересланного бита данных (установлено экспериментально), битовый счетчик после сигнала обнуления переключается в режим счета 23-х синхроимпульсов, что обеспечивает функционирование процесса анализа ошибок.

Модуль анализа ошибок

Как было упомянуто в объяснение предыдущего модуля, для обеспечения функционала анализа ошибок был разработан метод, основанный на чтении значения сохраненной на ИМС команды по адресу регистра, использовавшегося в процессе записи данных. Процесс чтения необходим для сравнения записанного значения с прочитанными данными для выявления несоответствий, а следовательно – определения произошедшей ошибки. Модуль анализа ошибок основан на элементе RG_8_SI_PO, который функционирует по принципу сдвигового регистра. Элемент преобразовывает полученные по последовательному порту MISO сигналы в параллельный 8-разрядный выход. Далее данные сравниваются со значением команды, использовавшейся при процессе записи данных. Функционал сравнения выполняет элемент CMP_8, основанный на логике «исключающего или». При обнаружении несоответствия, модуль передает сигнал на выход LED, который будет находится в состоянии логической единицы до следующего процесса записи данных. Предполагается, что выход LED будет связан с одним из светодиодов, группа которых присутствует на отладочной плате DE10 Nano, что позволит визуально сигнализировать о случившейся ошибке.

Заключение

В результате решения поставленной задачи была спроектирована и физически реализована схема взаимодействия ПК и устройства ЦАП/АЦП с рядом ключевых преимуществ. В процессе реализации была решена проблема с соединением ПЛИС и ПК. Решением этого послужило использование внешнего модуля UART. Было написано ПО для ПК на языке Java. ПО имеет интерфейс с базовыми возможностями передачи и приема данных в разработанном формате посылки UART, помимо этого имеет функцию загрузки сохраненных команд. Были разработаны контроллеры UART и SPI на базе ПЛИС.

Похожие публикации