Разделы

В сети

Пользователей: 120
Из них просматривают:
Аналоги: 38. Даташиты: 19. Инструкции: 3. Новости: 29. Остальное: 4. Программы: 4. Производители: 1. Профиль пользователя: 1. Теги: 2. Торрент: 3. Форум: 14. Чат: 2.
Участников: 5
Гостей: 115

an , alex01981 , Google , grom , Яндекс , далее...
Рекорд 2375 человек онлайн установлен 26.12.2015.

Партнёры


Партнёры

Новые объявления

Программирование

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

Написал MACTEP в 02.04.2009 23:50:00 (14323 прочтений)

   Автор: =ShooRooP= 

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



Вообще в интернете и в литературе информации по данной теме достаточно мало… Особенно если использовать язык 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.

Протокол связи АЦП TLC549IP

Во время единичного состояния на выводе 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

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

_____________________________________________________________________________________

Private Sub Form_Load()

   MSComm1.DTREnable = True 'начальное значение - высокий уровень CS
   Timer1.Interval = 100 ' интервал таймера 1мс
   Timer2.Interval = 1 ' интервал таймера 100мс
   MSComm1.Settings = "1200,N,8,1" ' установки передачи данных
   MSComm1.CommPort = 1 ' номер COM порта
   MSComm1.PortOpen = True ' открываем ком порт


End Sub

_______________________________________________________________________________________

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

_______________________________________________________________________________________ 

Private Sub Timer1_Timer()

  MSComm1.DTREnable = False 'cоздаем низкий уровень CS
  Label2.Caption = ""
'мусор для начальной задержки

  MSComm1.RTSEnable = True '1й тактовый импульс clock высокий уровень
     If MSComm1.CDHolding = True Then b1 = 1 Else b1 = 0 'опрос единичное или нулевое   значение на входе CD (выходе ацп)
  MSComm1.RTSEnable = False
'1й тактовый импульс clock низкий уровень

 

  MSComm1.RTSEnable = True
     If MSComm1.CDHolding = True Then b2 = 1 Else b2 = 0
  MSComm1.RTSEnable =
False

 

  MSComm1.RTSEnable = True
     If MSComm1.CDHolding = True Then b3 = 1 Else b3 = 0
  MSComm1.RTSEnable =
False

 

  MSComm1.RTSEnable = True
     If MSComm1.CDHolding = True Then b4 = 1 Else b4 = 0
  MSComm1.RTSEnable =
False

 

  MSComm1.RTSEnable = True
     If MSComm1.CDHolding = True Then b5 = 1 Else b5 = 0
  MSComm1.RTSEnable =
False

 

  MSComm1.RTSEnable = True
     If MSComm1.CDHolding = True Then b6 = 1 Else b6 = 0
  MSComm1.RTSEnable =
False

 

  MSComm1.RTSEnable = True
      If MSComm1.CDHolding = True Then b7 = 1 Else b7 = 0
  MSComm1.RTSEnable =
False

 

  MSComm1.RTSEnable = True
      If MSComm1.CDHolding = True Then b8 = 1 Else b8 = 0
  MSComm1.DTREnable = True 'cоздаем высокий уровень CS
  MSComm1.RTSEnable = False
'8й тактовый импульс clock низкий уровень 'переводим биты в десятичный формат по формуле разложения

 

  sum = (b1 * 2 ^ 7) + (b2 * 2 ^ 6) + (b3 * 2 ^ 5) + (b4 * 2 ^ 4) + (b5 * 2 ^ 3) + (b6 * 2 ^ 2) + (b7 * 2 ^ 1) + (b8 * 2 ^ 0)
Ud = Format(sum * 5.083 / 255, "##0.000") 'считаем пропорциональное значение
Label1.Caption = CStr(Ud) & " Вольт"
'выводим на экран полученное значение

End Sub

_______________________________________________________________________________________ 

 

Код в Timer1 представляет собой собственно драйвер. Который периодически повторяясь, формирует тактовые импульсы и принимает биты данных. Ud – напряжение на входе АЦП, если применить 10, 12 разрядные АЦП число 225 заменится соответственно на 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]. Для работы с сетевым напряжением или с устройствами гальванически не развязанными с сетью следует обязательно сделать опторазвязку схемы от компьютера.




Список литературы:

1.Гёлль П. Как превратить персональный компьютер в измерительный комплекс: Пер. с фр. – 2-е изд., испр. – М.: ДМК Пресс, 2001. – 144 с.: ил.

2.Ан П. Сопряжение ПК с внешними устройствами: Пер. с англ. – М.: ДМК Пресс, 2001 – 320 с.: ил.

3.Visual Basic 6.0: Пер. с англ. – СПб.: БХВ – Санкт-Петербург, 2000. – 992 с.: ил.

 

 
Теги: Порт   АЦП   СОМ  
Комментарии принадлежат их авторам. Мы не несем ответственности за их содержание.
Отправитель Нити
chaevara
Отправлено: 02.12.2010 21:11  Обновлено: 02.12.2010 21:12
Младший сотрудник
Дата регистрации: 01.12.2010
Откуда: Украина
Сообщений: 20
 Работа АЦП с СОМ портом или простая система сбора данных
Вот, спасибо!
оч. интересная статья! надо будет поискать такую микруху
alexey
Отправлено: 20.05.2012 16:55  Обновлено: 20.05.2012 16:55
Младший сотрудник
Дата регистрации: 26.12.2009
Откуда: Авдарма
Сообщений: 22
 Работа АЦП с СОМ портом или простая система сбора данных
как может питание подаваться с третьей ноги, там же TxD передача данных, там нет питания . питание на выводе RTS , или я что то не понял
MACTEP
Отправлено: 20.05.2012 17:22  Обновлено: 20.05.2012 18:25
Администратор
Дата регистрации: 07.08.2008
Откуда: Тирасполь
Сообщений: 6468
 Работа АЦП с СОМ портом или простая система сбора данных
Выв. программно ставится в "+"
Только на современных компах может не хватить питания.
alexey
Отправлено: 20.05.2012 23:51  Обновлено: 20.05.2012 23:51
Младший сотрудник
Дата регистрации: 26.12.2009
Откуда: Авдарма
Сообщений: 22
 Работа АЦП с СОМ портом или простая система сбора данных
ну вы даете, я из за ошибки в схеме мучаюсь уже целый день. на 6 той ноге ,выводе data не должно быть резистора. с ним не работает , а без него все сразу заработало . будьте в след раз внимательнее пожалуйста
MACTEP
Отправлено: 20.05.2012 23:56  Обновлено: 20.05.2012 23:56
Администратор
Дата регистрации: 07.08.2008
Откуда: Тирасполь
Сообщений: 6468
 Работа АЦП с СОМ портом или простая система сбора данных
Резистор должен быть. Проверьте номинал своего резистора.
alexey
Отправлено: 21.05.2012 0:16  Обновлено: 21.05.2012 0:16
Младший сотрудник
Дата регистрации: 26.12.2009
Откуда: Авдарма
Сообщений: 22
 Работа АЦП с СОМ портом или простая система сбора данных
все три резистора одинакового номинала на 6,8 к. и на счет питания от третьей ноги тоже не заработало, а от внешнего работает . не знаю почему так
MACTEP
Отправлено: 21.05.2012 0:21  Обновлено: 21.05.2012 1:01
Администратор
Дата регистрации: 07.08.2008
Откуда: Тирасполь
Сообщений: 6468
 Работа АЦП с СОМ портом или простая система сбора данных
Это еще зависит от порта. резистор обязательно оставьте. попробуйте подобрать максимально необходимый резистор, с каким надежно работает.

НО я еще раз утверждаю, что у вас что то с резистором. или со стабилитроном. Проверьте еще раз.
alexey
Отправлено: 21.05.2012 11:21  Обновлено: 21.05.2012 11:21
Младший сотрудник
Дата регистрации: 26.12.2009
Откуда: Авдарма
Сообщений: 22
 Работа АЦП с СОМ портом или простая система сбора данных
хорошо попробую подобрать резистор и поменяю стабилитрон, посмотрим что получится , спасибо

Разное

Полихлорвиниловые трубки легче натянуть на изолируемые предметы (отвертки, пинцеты, радиодетали), если на 15-20 мин поместить их в ацетон.

Интересно

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

Похожие новости