Цифровой вольтметр на компьютере
- Подробности
- Категория: Компьютер
1. Краткое описание прибора.
Цифровой вольтметр предназначен для измерения постоянного напряжения и передачи данных в компьютер. Для передачи данных и питания используется последовательный порт. Собранная схема свободно помещается внутри корпуса разъема DB25. В отличии от других подобных схем собранных на дорогих импортных АЦП с последовательным интерфейсом, эта состоит из более распространенных и дешевых элементов, а по качеству работы примерно соответствует 10 разрядному АЦП.
2. Схема.
Схема вольтметра состоит из двух операционных усилителей. На первом (D1.1) собран генератор пилообразного напряжения с частотой около 10 герц и амплитудой около 1 вольта. Второй (D1.2) включен по схеме компаратора и сравнивает входное напряжение с напряжением приходящим с генератора. На его выходе в рабочем режиме присутствует прямоугольное напряжение с частотой генератора и скважностью прямо пропорциональной измеряемому напряжению. Для подачи измеряемого напряжения на плату желательно использовать экранированный кабель. Вольтметр имеет общую с компьютером землю, это необходимо учитывать при выполнении измерения.
Для работы со схемой необходимо использовать специальную программу. Программа написана для MS DOS в виде резидентного COM файла. После запуска она остается в памяти компьютера и работает параллельно с другими программами, при этом на экране постоянно будет присутствовать показание вольтметра. При запуске программы можно настроить ее параметры — номер используемого порта и положение показания вольтметра на экране. Для этого предназначены параметры командной строки C и P сразу за которыми должны идти десятичные цифры. Если Вы немного разбираетесь в программировании и хотите изменить другие настройки программы или использовать вольтметр в составе какого то своего изделия, загружайте исходный текст программы на ассемблере.
4. Технические характеристики.
Характеристики схемы.
Измеряемое напряжение 1 В *
Дискретность измерения около 1000 единиц*
Входное сопротивление не менее 150 КОм
Время измерения 100 мс
*) Если необходимо измерять другое напряжение то просто замените резистор R1, или используйте переключатель диапазонов.
*) Типовое значение.
Полярность входного напряжения определяется автоматически. Прибор защищен от перегрузки. При входном напряжении до 25 вольт прибор входит в режим насыщения о чем можно узнать по отображаемым на экране четырем девяткам и знаку (положительное или отрицательное перенапряжение). В этом режиме он может находиться сколько угодно долго без опасности повреждения схемы. При снижении напряжения до допустимого уровня продолжается нормальная работа прибора.
Микросхему D1 (КР140УД20) можно заменить на импортный аналог LM747, или любой другой операционный усилитель, желательно сдвоенный, имеющий низкий ток потребления. Емкость сглаживающих конденсаторов можно уменьшить до 1 мкФ, хотя точность измерения это не увеличит. Резистор подключенный к линии TXD можно вообще не ставить, существует масса схем берущих питание напрямую с этой линии, при этом увеличится напряжение питания микросхемы, но так же увеличится вероятность выхода из строя последовательного порта. Для улучшения стабильности нуля можно добавить в схему стандартные для микросхемы цепи коррекции, хотя такого же результата можно добиться использованием программной корректировки.
Добавить комментарий
Цифровой вольтметр на ПК и arduino.
- Подробности
- Категория: Arduino
- Опубликовано 11.09.2015 17:30
- Автор: Admin
- Просмотров: 8433
В этом проекте мы будем передавать данный через сериал соединение на компьютер. Данные,в нашем случае это измеренное напряжение,при помощи arduino передаются в компьютер через последовательное serial соединение.
Вывод данных осуществляется в программу написанную для компьютера под Windows. При этом компьютер может быть абсолютно любым,будь это моноблок,стационарный компьютер или ноутбук,к примеру можно купить моноблок dell. В этом примере программа вольтметра была написана в среде разработке Visual C++. Статья ориентированна на тех кто уже имел дело с языком программирования C++
Измерение напряжения начинается только после того как со стороны компьютера поступят команды 0xAC и 0x1y. Где y представляет собой номер канала аналого цифрового преобразователя Arduino, и может принемать значение от 0 до 2.
После того как arduino получила команды старта измерения, начинается процесс измерения напряжения, измеренное напряжение отсылается обратно в компьютер с интервалом в 50 миллисекунд. Имеют следующий формат: 0xAB, 0xaa, 0xbb, где aa и bb максимальное и минимальное значение.
Прекращение измерения напряжения начинается после того как с компьютера поступят команды 0xAC и 0x00.
Программа написанная под Arduino (скетч) довольно проста — здесь нет ничего сложного,измеренное значение в последовательный порт. Измеренное значение напряжения умещается в 10 бит от 0x000 до 0x0400 хранится в переменной типа integer.
Последовательный порт имеет возможность передавать данные в пакете по 8 бит. Поэтому наше измеренное напряжение можно поделить на 2 пакета, каждый по 8 бит.Сначала осуществляется сдвиг на 8 бит, а затем делится на 256.
После того как интерфейс программы создан необходимо добавить объект последовательного порта. Этот объект позволяет изменять и задавать такие параметры как название порта, кол-во бит, скорость передачи. Добавляя поля контролирующие переменные объекта можно динамически (в процессе работы программы) изменять эти значения. В этом примере использована возможность только выбора порта.
По умолчанию программа выбирает первый порт. Важно помнить что порт ПК может быть использован только одним приложением, использование одного порта в двух приложения приведет к ошибке.
Кнопка создания метода обработки полученных данных.
Код программы под windows можете скачать тут
- < Назад
- Вперёд >
Добавить комментарий
USB логарифмический вольтметр – измеритель АЧХ
РадиоКот >Схемы >Цифровые устройства >Измерительная техника >USB логарифмический вольтметр – измеритель АЧХ
Идею разработки этого прибора подсказали участники форума сайта “РадиоКот”, которых заинтересовала моя статья USB DDS Функциональный генератор. В процессе обсуждения этого устройства, было высказано пожелание дополнить его приспособлением для автоматического измерения амплитудно-частотных характеристик. Идея показалась мне интересной и, в поиске вариантов ее реализации, я обратил внимание на микросхему AD8310 фирмы “Analog Devices”, которая представляет собой широкополосный логарифмический детектор, идеально подходящий для решения поставленной задачи: достаточно добавить АЦП и обеспечить передачу данных в компьютер. Получившийся широкополосный логарифмический вольтметр может быть использован и как самостоятельный прибор.
- Диапазон частот выходного сигнала (по уровню 3дБ): 35Гц – 100МГц*
- Максимальное напряжение входного сигнала: 1.13 В (действ.)*
- Входное сопротивление: 1 МОм
- Входная емкость: 10 пФ
- Максимальная ошибка измерения уровня в полном частотном диапазоне: 3дБ*
- Максимальная ошибка измерения уровня известной частоты: 0.4дБ*
- Уровень шума: не более 200мкВ (действ.)
- Форма измеряемого сигнала: синусоида, треугольник, меандр
- Питание вольтметра осуществляется от шины USB
- Обеспечивается гальваническая развязка измеряемой цепи
*В соответствии со справочными данными примененных микросхем.
Примечание: Максимальное напряжение входного сигнала и входное сопротивление прибора могут быть увеличены применением стандартного пассивного осциллографического щупа 10:1.
Рис.1.
Принципиальная схема вольтметра приведена на Рис.1. Входной сигнал поступает через разделительные конденсаторы C4, C7 на вход повторителя U1, обеспечивающего высокое входное сопротивление вольтметра. Интегратор U4 компенсирует напряжение смещения входного повторителя, обеспечивая максимально возможный размах его выходного напряжения. Это напряжение поступает на вход логарифмического детектора. Сигнал с выхода детектора, через RC-фильтр нижних частот (нужный для уменьшения шума наложения) подается на вход АЦП, управляемого микроконтроллером через узел гальванической развязки. Питание входного узла также гальванически развязано от шины питания компьютера. Микроконтроллер обеспечивает сбор данных от АЦП и их передачу по шине USB. Для поддержки протокола обмена данными по шине USB использована программная библиотека V-USB, позволяющая обойтись без применения дополнительных микросхем.
Печатная плата разработана для размещения в стандартном корпусе G431 фирмы Gainta. Корпус необходимо доработать – проделать отверстия для входного разъема и разъема типа B шины USB.
Рисунки печатной платы для позитивного и негативного процессов (слой Top дан в зеркальном отображении) находятся в файле 01.zip приложения. Там же содержатся список компонентов, принципиальная и монтажная схемы. В этом файле также находятся прошивка для микроконтроллера и картинка для пояснения правильной установки FUSE-битов.
На печатной плате, в фильтре напряжения питания измерительной цепи, предусмотрена установка как керамического чип-конденсатора (С21), так и выводного электролитического конденсатора (С29). Его номинал следует выбрать в районе 47.0 мкФ. Устанавливать оба конденсатора необходимости нет.
После проверки работоспособности устройства, на его входную часть нужно установить экран. Рисунок экрана дан в приложении. Экран можно изготовить из тонкого одностороннего фольгированного текстолита или (как сделано у меня) из куска медной луженой фольги с прокладкой из диэлектрика. В этом случае удобно распечатать рисунок экрана на листе плотной писчей бумаги, наклеить его клеящим карандашом на кусок фольги и обрезать по контуру. Экран монтируется пайкой на четыре штыря, установленные в переходные отверстия, отмеченные кружками на монтажной схеме (см. Рис.2, 3).
Рис.2.
Рис.3.
Рис.4.
Рис.5.
Следует отметить, что принципиальная схема вольтметра была изменена в процессе первичной отладки экземпляра устройства, соответственно была изменена и печатная плата. Однако экземпляр устройства с использованием модифицированной печатной платы не изготавливался.
Внимание! Считаю необходимым предупредить, что манипуляции с шиной USB вы производите на свой страх и риск. Хотя шина USB достаточно хорошо защищена от повреждений, а устройство не содержит узлов, способных вывести используемый компьютер из строя, вероятность такого исхода все же существует. Автор не несет никакой ответственности за последствия, наступившие в результате манипуляций, связанных с отладкой и использованием устройства.
Вольтметр не содержит каких-либо узлов, требующих настройки и регулировки. При условии исправных компонентов и правильного монтажа он сразу начинает работать. После подключения питания рекомендуется убедиться в наличии питания измерительной цепи (около 5В), а также проконтролировать опорное напряжение АЦП (~4.1В) и напряжение на выходе ОУ U1 (половина напряжения питания).
Перед первым подключением к шине USB рекомендуется запрограммировать микроконтроллер и FUSE-биты (будьте внимательны, микроконтроллер использует внутренний тактовый генератор!).
Если все сделано правильно, то после подключения к шине USB должна произойти стандартная процедура установки USB HID устройства TorLGV, при этом операционная система определяет его как USB устройство ввода.
Для работы с вольтметром в приложении 02.zip находится программа TorLGV.exe, окно которой приведено на Рис.6.
Рис.6.
Эта программа позволяет отображать измеренные значения напряжения в виде действующего значения (Vrms), децибел-милливатт на нагрузке 50 ом (dBm), децибел-милливатт на нагрузке 600 ом (dBu) и децибел-вольт (dBV) с учетом форм-фактора для синусоидального, треугольного и прямоугольного (меандр) сигнала. Кроме того, обеспечивается возможность использования пассивного осциллографического щупа 10:1, для которого предусмотрена отдельная калибровка.
Если калибровка вольтметра не была произведена, то программа выдаст об этом сообщение. Калибровка вольтметра производится по двум значениям синусоидального напряжения, которые рекомендуется выбирать отстоящими как можно далее друг от друга. Калибровка выполняется раздельно для режима x1 (кнопка [x10] отпущена) и для режима x10 (кнопка [x10] нажата). При калибровке входное напряжение не должно превышать 1В (действ.) режиме x1 и 10В (действ.) в режиме x10. Рекомендуемое значение частоты входного напряжения – около 1КГц, форма, как уже говорилось, синусоидальная.
Для калибровки вольтметра нужно нажать (при подключенном приборе) кнопку [C] и ввести значения входного напряжения в появляющиеся последовательно диалоговые окна. В режиме калибровки программа отображает в основном окне значения АЦП в шестнадцатеричном коде. Данные калибровки сохраняются в памяти вольтметра. Правильность сохраненных данных контролируется CRC-кодом.
Следует заметить, что калибровка вольтметра производится автоматически при подготовке к работе с программой измерения АЧХ.
Использование пассивного осциллографического щупа10:1 рекомендуется для работы с логарифмическим вольтметром. Наиболее удобен щуп, имеющий переключатель x1 – x10. Перед использованием щупа 10:1 необходимо провести процедуру его частотной компенсации. Для этого на вход предварительно откалиброванного вольтметра необходимо подать меандр известной амплитуды с частотой около 1 КГц. Выбрав форм-фактор “меандр” необходимо при помощи компенсационного конденсатора переменной емкости щупа установить показания вольтметра, равные амплитуде меандра.
Примечание. Т.к. генератор TorDDS формирует однополярные (положительные) прямоугольные импульсы, а вольтметр TorLGV отсекает постоянную составляющую входного сигнала, показания вольтметра при правильно скомпенсированном щупе будут равны половине значения амплитуды, установленной в программе TorDDS.
Основной целью разработки USB логарифмического вольтметра было его совместное использование с USB DSS функциональным генератором в составе комплекса для измерения амплитудно-частотных характеристик. В приложении 03.zip представлена предназначенная для этого программа TorFRA.exe. Для ее нормального функционирования необходимо наличие двух подключенных устройств TorDDS и TorLGV. При отсутствии какого-либо устройства программа перейдет в демо-режим.
Главное окно программы показано на Рис.7. Функциональное назначение органов управления, в основном, интуитивно понятно (надеюсь), остановлюсь лишь на некоторых особенностях.
Рис.7.
Органы управления в нижней части окна управляют разверткой по частоте и величиной выходного напряжения генератора. Диапазон развертки может быть задан как кнопками [Start] и [Stop], так и при помощи мыши. Кнопка [Lock] позволяет зафиксировать заданный диапазон от случайного изменения. Развертка может быть как непрерывная, так и однократная (задается кнопками [Auto] и [Single]), при обеих отпущенных кнопках генератор работает в режиме фиксированной частоты.
Органы управления в правой части окна предназначены для управления сбором данных и отображения результатов измерения. Группа органов Input управляет логарифмическим вольтметром. Кнопки Freq comp позволяют запомнить значение текущего измерения в специальный буфер, данные которого вычитаются из результатов последующих измерений. Действие отменяется автоматически при изменении частотного диапазона или времени развертки. При помощи кнопок Overlay значение текущего измерения можно запомнить в другом буфере, который будет отображаться на экране независимо от текущего измерения, если нажата кнопка [On]. Расположение буферов на оси частот индицируется цветом отрезка тонкой линии, разделяющей на экране график и установочную шкалу. Группа Cursors позволяет производить курсорные измерения полученной кривой АЧХ.
При помощи пункта меню <File>-<Save screen> можно сохранить изображение экрана программы в виде .bmp или .png файла, размер которого повторяет текущий размер экрана. Пункты меню <Utilities>-<Calibration> и <Utilities>-<Save calibration data> управляют калибровкой прибора (о них подробнее рассказано ниже), а при помощи <Utilities>-<Basic compensation off> можно отменить действие частотной компенсации, выполняемой в процессе калибровки. В этом случае для всех частот будут использоваться данные калибровки для частоты 1КГц. Этот режим может быть полезен для контроля АЧХ вольтметра, влияния соединительных кабелей и частотной компенсации щупа 10:1.
Перед началом использования прибора необходимо произвести его калибровку. Предварительно рекомендуется откалибровать функциональный генератор и при необходимости занести параметры канала синуса генератора и актуальное значение тактовой частоты в конфигурационный файл TorFRA.cfg, который должен располагаться в той же папке, что и файл программы TorFRA.exe. (см. файлы Readme.txt в соответствующих архивах). Для удобства, последняя на данный момент версия программы TorDDS.exe находится в приложении 04.zip.
Для калибровки прибора необходимо подключить вольтметр к выходу канала синуса генератора, установив требуемый коэффициент деления щупа и соответственно нажав/отпустив кнопку [Probe 10:1]. Выбрав пункт меню <Utilities>-<Calibration> и нажав кнопку [OK], следует дождаться окончания калибровки. Данные, полученные в результате калибровки необходимо сохранить в памяти логарифмического вольтметра. Это действие можно выполнить и позже, выбрав пункт меню <Utilities>-<Save calibration data>. Сохраняются только вновь полученные данные. Калибровку необходимо произвести раздельно для щупа 1:1 и для щупа 10:1.
В заключение приведу пример измерения АЧХ лампового усилителя из статьи Современный ламповый ….
Рис.8.
Файлы:
Архив ZIP
Архив ZIP
Архив ZIP
Архив ZIP
Все вопросы в Форум.
Как вам эта статья? | Заработало ли это устройство у вас? |
Visual Analyser
Профессиональное программное обеспечение, превращающее персональный компьютер в целый набор измерительных инструментов, работающих в реальном времени.
Многие радиолюбители не имеют достаточно денег, чтобы купить дорогой осциллограф или спектральный анализатор. Тем не менее, зачастую необходимо генерировать особые сигналы для проверки оборудования, тестирования аудиоусилителей, осцилляторов, фильтров. Многим музыкантам требуется спектральный анализ в диапазоне звуковых частот.
Visual Analyser позволяет моделировать следующие электронные инструменты:
— двухканальный осциллограф, имеющий триггерный режим. Пропускная способность зависит от звуковой карты (от 20 кГц до 192 кГц). Разрешение от 8 до 24 бит. Есть функция автоматической калибровки и быстрого установления значений;
— двухканальный анализатор спектра. Разрешение от 8 до 24 бит. X-ось в Гц, Y-ось в дБ или вольтах (необходима калибровка). Шкала линейная или логарифмическая, автомасштабируемая, с шестнадцатикратным увеличением выбранного участка;
— двухканальный генератор сигналов (треугольных, квадратных, синусоидальных; белый и розовый шум, пульсации и некоторые другие варианты). Частоты дискретизации независимые. Изменение параметров (амплитуда, частота, фаза между каналами, тип сигнала) происходит в реальном времени;
— двухканальный частотомер (во времени и в частотной области) и счетчик;
— двухканальный вольтметр класса True RMS (необходима калибровка) с функцией удержания;
— фильтры: низких и высоких частот, полосовой, режекторный, полосно-заграждающий, диодный, двойной фильтр (по одному на каждый канал).
Также присутствует много других полезных функций: логи для анализа и хранения временных данных, возможность сохранять графики в различных форматах (*.tee, *.txt, *.wmf) и отображать их во встроенной программе просмотра, скриншот рабочего окна, кепстральный анализ, кросс-корреляция, запись волны в файл и ее воспроизведение, осуществление коррекции частотной характеристики микрофона. Измерительный механизм можно откалибровать в вольтах, в дБ или процентах от исходной шкалы. Есть функция определения значений, вычисленных в реальном времени (от пика до пика, пик, пик-фактор, форм-фактор, переход через ноль). Рабочие окна программы позволяют редактировать полученные образцы, осуществлять по ним навигацию и масштабирование, сохранять их и распечатывать.
Visual Analyser является полностью бесплатным софтом. Доступны три различных вида загрузки программы. Можно скачать ее одним exe-файлом, который необходимо распаковать в нужный каталог. Или загрузить исполняемый файл, не требующий установки. Разница заключается в отсутствии файлов поддержки (помощи, калибровки), а также ярлыка на рабочем столе и в меню. Третий вариант – это скачать ISO-образ (в zip-архиве), который может быть прожжен на компакт-диске.
Visual Analyser не требует для работы никакого дополнительного аппаратного обеспечения или специализированного внешнего оборудования. Полоса измерений зависит от класса звуковой платы. Программа поддерживает 8, 16, 24-битные звуковые карты.
Создателя программы зовут Alfredo Accattatis. Он является разработчиком программного обеспечения в одной частной итальянской компании. В свободное от работы время пишет программы для встраиваемых систем, персональных компьютеров и мэйнфреймов, используя C, C + +, Pascal, Ada, REXX и ассемблер. Над Visual Analyser он трудился в течение пяти лет. Особую благодарность автор выражает профессорам Roberto Lojacono и Giovanni Saggio, а также Marcello Salmeri. Visual Analyser непрерывно эволюционирует, разработчик старается учитывать в новых версиях все замечания и предложения по улучшению софта, высказываемые пользователями программы.
Программа написана на английском языке, русификатора к ней нет.
Visual Analyser работает на Windows 95, 98, ME, 2k, XP, NT, Server, Vista, 7. Начиная с версии 2011, софт работает и на Linux с помощью утилиты Wine. Бета-версия 2012 не совместима с Windows 9x.
Распространение программы: бесплатная
Официальный сайт Visual Analyser: http://www.sillanumsoft.org/
Скачать Visual Analyser
Обсуждение программы на форуме
Измеритель напряжения с передачей данных на ПК по USB.
Представленное устройство предназначено для измерения входного напряжения амплитудой от -10 до +10В. Измеренный уровень сигнала в цифровом виде передаётся на ПК по USB. Питается устройство непосредственно от шины USB. Устройство оснащено светодиодными индикаторами индицирующими передачу данных в ПК, приём данных из ПК, подключение питания. Устройство очень простое. Это одно из первых разработанных и собранных мной устройств на микроконтроллере. Единственная сложность с которой может столкнуться начинающий радиолюбитель – монтаж СМД компонентов. Видео по монтажу СМД компонентов можно посмотреть у меня на сайте, перейдя по ссылке (уже скоро…). Это не измерительный прибор, это «показометр» он не может гарантировать какой либо точности измерений. Тем не менее, вольтметр на AVR может быть интересен начинающим радиолюбителям, осваивающим микроконтроллеры AVR, так как в данном устройстве используются АЦП и USART модули микроконтроллера.
Задача состояла в том, чтобы сделать устройство оцифровывающее аналоговый сигнал, и передающее данные на ПК для дальнейшей обработки. Данный прибор нужен был для демонстрации основ обработки и передачи данных для студентов первого курса в университете, в котором я учился. Единственным требованием преподавателя было — диапазон измеряемых напряжений от -10 до 10В. Так как демонстрация должна была быть из серии: «светим на фотодатчик, напряжение выросло. Накрыли его от источника света, напряжение уменьшилось» и всё в таком духе, то точность измерений не является основной задачей. Следовательно, я старался упростить устройство и для себя я сформировал ещё несколько требований:
- Устройство должно питаться от USB порта. (мне не хотелось городить дополнительный блок питания)
- Устройство должно измерять переменное входное напряжение относительно общего провода питания устройства (для возможности измерять напряжение на каком либо другом устройстве также питающимся от USB)
В итоге было разработано радиоэлектронное устройство схема которого представлена на рисунке.
При сигнале от -10 до +10В, размах напряжения на входе получается 20В. Для того, чтобы подать данный сигнал на АЦП его нужно пропорционально уменьшить, то есть поделить. В данной схеме входной сигнал делится резистивным делителем состоящим из R9, R10 (верхнее плечё) и R8 – нижнее плечё. По моим подсчётам, размах напряжения после делителя должен был составлять 2В (от -1 до +1В). Так как АЦП данного микроконтроллера не может измерять отрицательное напряжение (относительно общего провода его питания (GND), необходимо каким либо образом сдвинуть диапазон (от -1 до +1В) в область положительных значений амплитуд, например от 0 до 2В. Значения из данного диапазона довольно просто измерить АЦП микроконтроллера. Есть несколько способов как правильно сдвинуть входное напряжение не потеряв в точности, а так как у меня не стояла задача сделать измерительный прибор, то я постарался всё упростить по максимуму. Смещение задаётся резисторами R5, R6, R7. Это плохой вариант смещения входного напряжения, если рассматривать его с точки зрения получения высокой точности, но очень хороший вариант с точки зрения простоты. А простота это то, что и было мне нужно! На элементах DA1, R14, R15, R16 собран источник опорного напряжения на 3В. На делителе R11, R12, R13 формируется напряжение 2 В для опорного напряжения АЦП, которое АЦП принимает за максимальное при измерениях. Сердцем устройства является микроконтроллер AtMega8. Я использовал микроконтроллер в TQFP корпусе, и номера выводов на схеме соответствуют данному корпусу для поверхностного монтажа. Микроконтроллер, при помощи встроенного АЦП, измеряет амплитуду входного сигнала, оцифровывает его и отправляет полученный 8-ми битный результат по USART в преобразователь USB-USART выполненный на микросхеме FT232R. Исходный код был написан на ассемблере. Вернее сказать не был написан, а был использован готовый код с сайта http://easyelectronics.ru/, который я немного подправил под себя. В те времена, когда я делал данное устройство, я плохо разбирался в микроконтроллерах, в ассемблере, и код правил методом проб и ошибок, так что вы не судите строго. Код корявый, но устройство работает. Скачать исходники проекта можно в конце статьи. Теперь немного пробежимся по коду:
.include "m8def.inc" ; Используем ATMega8
;Макрос
; Загрузка числа в порт
.MACRO outi ; Это описание макроса. Везде где outi встретится в коде, то заменяется на
LDI R16,@1 ; этот кусок кода, причем @0,@1 это параметры, они заменятся введенными параметрами
OUT @0,R16 ; макроса. Данный макрос тупо копирует введенное число сначала в регистр R16, а из него
.ENDMACRO
Здесь всё просто, первым делом подключаем файл m8def.inc с описанием регистров ввода-вывода, и описанием других конфигурационных ячеек периферии микроконтроллера AtMega8. Дальше описан макрос, который позволяет упростить работу программисту и переложить её на компилятор. Все мы знаем что записать сразу число в регистр ввода вывода в микроконтроллере AVR не получится, нужно использовать промежуточный регистр, например R16. Хотя запись числа в регистр ввода вывода очень востребованная и часто используемая операция.
Для того чтобы в PotrB установить число 10 необходимо написать следующее:
LDI R16, 10
OUT PortB, R16
Использование макроса (outi @0, @1) позволяет не писать каждый раз в тексте программы запись через данный промежуточный регистр, а просто написать к примеру outi PotrB, 10 всё остальное сделает компилятор. При данной записи компилатор сначала загрузит число 10 (операнд @1) в регистр R16 а затем из R16 в PotrB (операнд @0). В прицепи, порядок и последовательность действий не меняется, но сама запись укорачивается и выглядит мене запутанно и громоздко. В любом случае компилятор при компиляции её развернёт, но это уже делаем не мы. Так что макросы очень удобная штука, особенно в языках низкого уровня. С помощью макросов можно сократить рутинные операции или даже написать что-то вроде своего собственного языка программирования.
; Собственно код начинается отсюда
.CSEG
.ORG 0x0000 ; Проц стартует с нуля, но дальше идут вектора
RJMP Reset ; прерываний, поэтому отсяюда сразу же прыгаем
; на начало программы. На метку Reset
.ORG INT0addr ; External Interrupt Request 0
RETI
.ORG INT1addr ; External Interrupt Request 1
RETI
.ORG OC2addr ; Timer/Counter2 Compare Match
RETI
.ORG OVF2addr ; Timer/Counter2 Overflow
RETI
.ORG ICP1addr ; Timer/Counter1 Capture Event
RETI
.ORG OC1Aaddr ; Timer/Counter1 Compare Match A
RETI
.ORG OC1Baddr ; Timer/Counter1 Compare Match B
RETI
.ORG OVF1addr ; Timer/Counter1 Overflow
RETI
.ORG OVF0addr ; Timer/Counter0 Overflow
RETI
.ORG SPIaddr ; Serial Transfer Complete
RETI
.ORG URXCaddr ; USART, Rx Complete
RJMP UART_RX
.ORG UDREaddr ; USART Data Register Empty
RETI
.ORG UTXCaddr ; USART, Tx Complete
RJMP UART_TX
.ORG ADCCaddr ; ADC Conversion Complete
RJMP ADC_OK
.ORG ERDYaddr ; EEPROM Ready
RETI
.ORG ACIaddr ; Analog Comparator
RETI
.ORG TWIaddr ; 2-wire Serial Interface
RETI
.ORG SPMRaddr ; Store Program Memory Ready
RETI
Дальше, начинается сегмент кода. Первое что описывается в данном сегменте, таблица прерываний для микроконтроллера, в данном случае используется микроконтроллер AtMega8, и таблица соответственно для 8 меги. Для других микроконтроллеров она может отличаться, и у вас ничего не будет работать. Таблицу для вашего микроконтроллера можно посмотреть в даташите.
Из всей таблицы для данного проекта используется всего 3 прерывания: URXCaddr (приняли что-то по USART), UTXCaddr (предыдущий байт по USART отправился, теперь можно передавать новый), ADC_OK (ADC закончило преобразование, и можно забрать результат).
На все остальные прерывания которые нам не нужны установлены заглушки (RETI). Это сделано для минимизации последствий от возможной ошибки при инициализации периферии. Можно ошибиться, и разрешить прерывания по событию которое нам не нужно и следовательно обработчик прерывания для данного события мы не предусмотрели. К примеру, представим что RETI нет, и случайно выставился флаг прерывания OVF0addr, при этом программа остановится, запишет в стек адрес выполняемой инструкции, чтобы потом, после обработки прерывания вернуться и продолжить выполнение программы, и перейдёт к выполнению программы с адреса на котором расположен вектор OVF0addr. Так как из данного адреса мы не попадаем в обработчик прерываний (нет RJMP на нужный адрес), микроконтроллер начнёт выполнять следующую по счёту инструкцию, а именно SPIaddr, так как и тут также нет прыжка в нужное место, микроконтроллер перейдёт к выполнению следующей по счёту инструкции URXCaddr, и тут он уже перепрыгнет на обработчик UART_RX (приняли что-то по USART). Хотя на самом деле микроконтроллер ничего не принял, а произошла ошибка, мы всего лишь ошиблись с 1 битом (случайно разрешили прерывание Timer/Counter0 Overflow)! Подобные неочевидные ошибки с прерываниями очень коварная штука, можно несколько часов потратить на понимая, почему устройство то работает нормально, то сбоит без видной причины. Для того, чтобы избежать подобных нелепых ошибок, все неиспользуемые прерывания закрываются «заглушками» RETI. При попадании на данную заглушку (если сработало не нужное прерывание), микроконтроллер вернётся обратно по адресу, который он запомнил в стеке когда переходил на выполнение данного прерывания, и продолжит выполнение программы с места, с которого он «отвлёкся» на прерывание. То есть не произойдёт ничего страшного, микроконтроллер потеряет немного времени на переход по прерыванию и обратно (всего несколько машинных тактов), но зато не сменит алгоритм работы.
Reset: OUTI SPL,low(RAMEND)
OUTI SPH,High(RAMEND)
;=============================================================================
; Все инициализации тут.
RAM_Flush: LDI ZL,Low(SRAM_START)
LDI ZH,High(SRAM_START)
CLR R16
Flush: ST Z+,R16
CPI ZH,High(RAMEND)
BRNE Flush
CPI ZL,Low(RAMEND)
BRNE Flush
CLR ZL
CLR ZH
Дальше идёт инициализация стека. Это очень важная вещь! Без стека вы не сможете использовать прерывания или подпрограммы. Стек растёт с конца памяти к началу. Поэтому в стековые регистры SPL, SPH записывается адрес конца RAM памяти.
Дальше идёт очистка RAM памяти, или, если по другому сказать производится инициализация всех ячеек памяти значением 0. Лично я никогда не очищаю всю память, мне кажется это лишнее. В любом случае, перед тем как что-то считать с памяти, в неё всегда что-то записывается, и поэтому не важно что в памяти, мусор, либо 0. Если, мне и нужно чтобы в какой-то ячейке изначально был 0, я её инициализирую 0. Инициализирую только данную ячейку, а не всю память. Зачем тратить микроконтроллерное время для очистки всей памяти? Более того, в данном проекте RAM память не используется, но я оставил всё так, как было у автора.
; Инициализация периферии
;========================================================================================
.equ XTAL = 8000000
.equ baudrate = 9600
.equ bauddivider = XTAL/(16*baudrate)-1
OUTI UBRRL,low(bauddivider)
OUTI UBRRH,high(bauddivider)
OUTI UCSRA, 0
OUTI UCSRB,(1<<RXEN)|(1<<TXEN)|(1<<RXCIE)|(0<<TXCIE)
OUTI UCSRC,(1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1)
;========================================================================================
В выше приведенном участке кода инициализируется USART и ADC микроконтроллера.
Начнём с USART. Для начала нужно задать скорость передачи данных записав в необходимые регистры делителя рассчитанные значения. Данные значения рассчитываются исходя из тактовой частоты микроконтроллера (XTAL= 8000000 Гц), и из необходимой скорости передачи (baudrate =9600). Всё это можно посчитать вручную, и записать полученные значения в регистры, а можно всю работу переложить на компилятор, что в данном примере и сделано.
.equ XTAL = 8000000
.equ baudrate = 9600
.equ bauddivider = XTAL/(16*baudrate)-1
OUTI UBRRL,low(bauddivider)
OUTI UBRRH,high(bauddivider)
Это очень удобно, например, нужно вам сменить скорость USART, либо тактовую частоту микроконтроллера, либо и то и другое, вы просто меняете нужные значения и перекомпилируете проект, и не нужно ничего пересчитывать, компилятор сам всё посчитает. Очень удобно!
Регистр UCSRA – флаговый регистр, каждый флаг данного регистра сигнализирует о произошедших событиях, например таких как ошибка чётности, ошибка кадра и т. д.
В конфигурационный регистр UCSRB USART-а записывается значение разрешающее соответственно: приём, передачу, прерывание при принятом байте, прерывание при переданном байте.
В конфигурационный регистр UCSRB USART-а записывается значение (1<<UCSZ0)|(1<<UCSZ1) что конфигурирует USART на работу в 8-ми битном режиме.
Очень интересный бит, URSEL (7 бит). Он определяет в какой именно регистр будет произведена запись. Дело в том, что Atmel, не знаю по каким причинам, расположил регистры UCSRC и UBRRH по одному адресу, если URSEL=1 запись производится в регистр UCSRC иначе в UBRRH.
;Init ADC
;========================================================================================
OUTI ADMUX,0b00100100
Здесь инициализируется ADC микроконтроллера. Конфигурируем его таким образом, чтобы сигнал для оцифровки брался со входа PC4, и результат преобразования выравнивался по левому краю, то есть отбрасываем два младших бита, в которых как правило шум.
С функцией main всё просто, не будем останавливаться.
;=============================================================================
; Interrupts
;=============================================================================
UART_RX:
IN R16,UDR
OUT UDR,R16
CPI R16,'0' ; Если в UART упал ASCII код нуля, то
BREQ STOP_ADC ; Переход на остановку АЦП
OUTI ADCSRA,(1<<ADEN)|(1<<ADIE)|(1<<ADSC)|(1<<ADFR)|(3<<ADPS0) ; Запуск непрерывного преобразования.
RETI ; Выход из прерывания
STOP_ADC:
OUTI ADCSRA,(0<<ADEN)|(0<<ADIE)|(0<<ADSC)|(0<<ADFR)|(3<<ADPS0) ; Остановка преобразования.
RETI ; Выход из прерывания
;==============================================================================
UART_TX: RETI
;==============================================================================
ADC_OK: IN R16,ADCH
OUT UDR,R16
RETI
При включении, устройство находится в неактивном состоянии. Для запуска необходимо передать по USART любой байт кроме 0х30. В этом случае запускается непрерывное преобразование ADC. Как только ADC закончит преобразование, сработает прерывание ADC_OK в обработчике которого результат преобразования поместится регистр UDR из которого будет отправлено по USART. Как только будет готов результат следующего преобразования, всё повториться. Всё можно остановить отправив по USART 0х30 (код цифры 0), при этом в регистр ADCSRA записывается комбинация останавливающая преобразование ADC.
Под данное устройство была разработана печатная плата в программе sprint layout. Исходники можно скачать в конце статьи.
Плата были изготовлена по методу ЛУТ, протравлена и залужена. Я всегда лужу дорожки, лужёные платы выглядят на много красивее. Ниже представлены фото платы до и после лужения.Готовое собранное устройство показано на следующих фото.
В видео представлен пример работы данного устройства. Устройство передаёт в программу Terminal данные, и они выводятся в виде графика. В качестве входного сигнала я использую +5В от USB. Я пинцетом подключаю вход устройства к 5В и видно что график поднимается, то есть устройство что-то измеряет.
Мой одногрупник написал под данное устройство программу для обработки, накопления и анализа полученных данных, и возможно, это устройство ещё работает)))
Скачать файлы проекта можно по ссылке: http://www.elenblog.ru/wp-content/uploads/2013/04/izmeritel-naprjazhenija-s-peredachej-dannyh-na-pk-po-usb.rar
Рубрики: Устройства своими руками | Тэги: AtMega8, AVR, USB, Ассемблер, Вольтметр, Измерения, Микроконтроллер, Устройства своими руками | Ссылка
Вольтметр для компа — продвинутая версия
Ссылка на оригинал статьи — Techno Mind. Комментировать можно здесь.
На этот раз начну с конца. Вот, что получилось:
Ну а теперь, давайте поговорим о том, как я к этому все пришел. Может быть кто-то узреет для себя пару полезных идей.
Итак, идея мерить напряжения в разных узлах компьютера появилась у меня давно, и была успешно реализована на моем прошлом компе. Собирая новый компьютер (проект the brain) я вдруг понял, что аналоговое переключение пакетником измеряемых каналов не будет хорошо смотреться на фоне корпуса Antec Twelve Hundred. Нужно было что-то более прогрессивное. Поэтому я поначалу подумал организовать переключение каналов двумя кнопками (одна листает вверх, другая вниз). Кнопки эти, по первоначальной задумке, должны заставлять простые логические элементы генерировать трехбитный управляющий сигнал, который предполагалось подать на мультиплексор (он же коммутатор, он же селектор, он же переключатель — устройство, имеющее несколько сигнальных входов, один или более управляющих входов и один выход. Мультиплексор позволяет передать сигнал с одного из входов на выход; при этом выбор желаемого входа осуществляется подачей соответствующей комбинации управляющих сигналов). В зависимости от текущего управляющего сигнала, на выходе мультиплексора должно появляться напряжение с определенного входа. Цепляем вольтметр на выход мультиплексора, и — voila!
Я еще подумал на тот же управляющий сигнал повесить драйвер для 7-сегментного индикатора, который бы показывал текущий канал.
В результате была рождена вот такая вот схема (я намеренно оставил ее такой кривой-косой, от руки, так как дальнейшего развития она не получила):
Данная схема реализовывалась с помощью как минимум 7 микросхем (два одновибратора 555, бинарный счетчик 74F193, мультиплексор ADG528, драйвер для 7-сегментного индикатора 74LS47, и пара микросхем с элементами И, ИЛИ-НЕ, или инверторы). Данный факт мне совершенно не понравился, и идея начала стремительно эволюционировать.
Например, если взять простенький микропроцессор (с ценой буквально 1 доллар), например, ATtiny2313, то схема упрощается до такой:
На ней не хватает только мультиплексора ADG528.
7 светодиодов могут быть и 7-сегментным индикатором (с общим анодом, катодом — какой доступнее и приятнее глазу), и простыми «лампочками» с позиционной индикацией на 8 каналов.
A[2..0] — на мультиплексор.
Кнопки:
«CHAN +» и «CHAN -» — ручной перебор каналов.
«AUTO» — перебирать автоматически, индицируя по 2-3 сек каждый.
«USER 1» и «USER 2» — пара джамперов, ограничивающая число используемых каналов.
Схема была быстренько набросана в Proteus, программа для микропроцессора была быстренько написана в CodeVisionAVR. Вот тут можно взять, поиграться: Voltmeter for Comp v1.0.rar
Поначалу, такая реализация вполне устраивала меня. Я даже начал разводить плату, как вдруг обнаружил, что восьми входных каналов мне будет мало (на современных матерях, внезапно, появилось много критически важных для оверклокинга напряжений), и вообще, почему бы не пойти дальше и не сделать нормальную индикацию входного канала?! Одновременно с этим, я совершенно случайно обнаружил на eBay точный вольтметр с резолюцией 0.0005в., и мотивация моя просто взлетела ввысь! Вот, кстати, вольтметр (он тоже на каком-то микропроцессоре со стертой маркировкой, ну да и хрен с ней):
[svgallery name=»precision_voltmeter»]
Как видно на фотках, на вольтметре есть подстроечник для калибровки. Это есть очень даже гуд!
Короче, взял я четыре 14ти-сегментных индикатора (взял бы больше, но места на заглушке от 5.25” отсека уже не хватало), многоногий микропроцессор ATMEGA16, два мультиплексора (что обеспечило 16 входных каналов) и спроектировал вот такую платку:
Сразу оговорюсь – схема не идеальна: можно было заюзать микропроцессор поменьше, используя сдвиговый регистр, развести получше, да и прошивку можно было написать поинтересней. Но мне было влом возиться. Мультиплексоры я выбрал DG528. У них есть два неоспоримых преимущества. Во первых они управляются сигналами TTL уровня, а во вторых их можно получить нахаляву в качестве инженерных образцов от фирмы MAXIM.
Cуществующий проект можно сказать тут: voltmeter_for_comp_v2.2.rar
В архиве есть 2 проекта в Proteus. Один из них в папке PCB – это проект платы со всеми элементами. Второй в папке Proteus Model for development – это модель, для визуализации работы и отладки прошивки микропроцессора:
На 14ти-сегментные индикаторы выводится имя текущего канала измерения. Если имя длиннее четырех символов, оно выводится в виде бегущей строки.
Если нажать все три кнопки сразу, то выведется мой ник (-MindHunteR-) – уж очень хотелось сделать какое-нибудь «пасхальное яйцо».
Галерея фотографий процесса сборки и готового девайса (их немало):
[svgallery name=»voltmeter2_2_build»]
Как видите, девайс собирался в корпусе старого CD-ROM’а. В качестве передней панельки была выбрана дырчатая заглушка 5.25″ отсеков корпуса Antec, с накладкой из оргстекла. Чертежей всех этих деталей я не делал. Дизайн был проработан на бумаге, был нарисован схематичный эскиз, но не более; конструкция простая, поэтому не было надобности.
В заключение хочу сказать что проект удался. Измерения точные и нагладные. Надеюсь, статья окажется полезной. Удачи.
Как превратить персональный компьютер в измерительный комплекс
Книга «Как превратить персональный компьютер в измерительный комплекс» позволяет создать на базе IBМ — совместимого персонального компьютера систему сбора и обработки информации о различных физических процессах, тем самым ПК превращается в мощный измерительный прибор. Область применения виртуального измерительного комплекса шире, чем у обычного измерительного прибора, поскольку виртуальный комплекс можно перепрограммировать и оптимизировать для конкретных задач. В книге «Как превратить персональный компьютер в измерительный комплекс» рассказывается о создании системы сбора и обработки данных, состоящей из датчиков физических величин (тока, давления, температуры и т. д.), интерфейсного устройства (как правило, аналого-цифрового преобразователя) и программных средств, позволяющих обрабатывать собранную информацию. Схемы и рекомендации, приведенные в книге, позволяют собрать все рассмотренные устройства самостоятельно.Книга предназначена для специалистов в различных областях (радио-электроника, акустика, геофизика, термодинамика и т.д.) и радиолюбителей, а также для преподавателей физики и информатики школ, средних специальных и высших учебных заведений.
В книге «Как превратить персональный компьютер в измерительный комплекс» рассмотрены следующие темы:
Концепция построения виртуального измерительного комплекса
- Роль компьютера
- Роль интерфейсных устройств
- Роль программного обеспечения
- Точность и быстродействие
Аналого-цифровое преобразование сигналов
- Новое поколение АЦП
- 8-разрядный АЦП с последовательным интерфейсом
- 10-разрядный АЦП с последовательным интерфейсом
- 12-разрядный АЦП с последовательным интерфейсом
- Надо ли выходить за пределы 12 разрядов?
- Источники опорного напряжения
- Относительные измерения
- Преобразование отрицательных входных напряжений
- Устройства нормирования сигналов
Промышленные изделия
- Интерфейсные платы внутреннего исполнения
- Внешние интерфейсные устройства
- Аналого-цифровые преобразователи ADC 10 и ADC 12
- Другие компоненты этой серии
Сборка измерительного интерфейса
- Универсальный аналоговый интерфейс для последовательного порта
- Версия интерфейса компании MAXIM
- Версия интерфейса с оптронной развязкой
Программное обеспечение виртуального измерительного комплекса
- Коммерческое программное обеспечение
- Пакет PICOSCOPE
- Пакет PICOLOG
- Программное обеспечение частного применения
- Драйверы для 8-разрядных АЦП
- Драйверы для 10-разрядных АЦП
- Драйверы для 12-разрядных АЦП
- Прикладные программы
- Цифровой вольтметр
- Усредняющий фильтр
- Пиковый регистратор минимумов и максимумов
- Регистратор длительных процессов
- Графопостроитель
- Обеспечение точной временной развертки
- Осциллограф
- Возможности многоканальных измерений
Датчики и принадлежности
- Входной усилитель
- Датчик температуры
- Датчик давления
- Фотометрический датчик
- Датчик тока
Приложения
- Файлы, находящиеся на сервере
- Полезные адреса
- Импортные элементы и их отечественные аналоги
Скачать книгу с Народа
Скачать книгу с DepositFiles
Скачать книгу по прямой ссылке