STM32F103C8T6 — делаем осциллограф. Часть 3
А описание некоторых ключевых особенностей под катом.
Аналоговая часть
Почти всё как было описано во второй части, кроме источника двухполярного питания. ОУ потребляют значительный ток (порядка 10 мА) и как не пытался схемами умножителей напряжения на диодах и конденсаторах получить приемлемых результатов — не удалось. Поэтому для положительного напряжения поставил вот такой модуль на основе МТ3608:
настроенный на 10 В выходного напряжения. А отрицательное напряжение получаю путём инвертирования положительного с помощью LT1054.
Про размер кода
В первой части я писал, что памяти потребляется очень много. Теперь я дошёл до того, что программа не влазит в память и изучил этот вопрос подробней.
CooCox CoIDE выводит информацию о размер программы в таком виде:
- text — размер сегмента с кодом, векторами прерываний и константами только на чтение;
- data — размер сегмента с инициализированными не нулём переменными;
- bss — размер сегмента с неинициализированными и инициализированными нулём переменными.
- флеш — text + data + 10..50 байт
- ОЗУ — data + bss + 10..50 байт
Теперь посмотрим на что тратится память. Делаем новый проект и компилируем:
Чтобы использовать макросы типа GPIO_BSRR_BS9 надо подключить файл stm32f10x.h.
Чтобы подключить файл stm32f10x.h надо в репозитоях добавить компонент STM32F10x_MD_STDLIB, который подтягивает за собой cmsis_core. В итоге для программы, записывающей одно значение в регистр получаем:
Далее меня интересуют функции типа sprintf и sscanf. Чтобы их использовать надо определить некоторые функции типа _sbrk и возможно некоторых других. Я взял готовый файл (есть в архиве с проектом). Добавляем 1 вызов sscanf и получаем:
Режимы работы
Реализовал 3 режима по принципу действия: непрерывный, пакетный и логический и 3 по количеству каналов: 1, 2 и 4-х канальный.
МК имеет 9 аналоговых входов, но я не представляю когда мне может понадобиться больше 4-х каналов.
Непрерывный
Тут всё просто: в главном цикле МК считываем данные АЦП и передаём их на ПК, где можем строить непрерывный график. Недостаток — ограничение скорости со стороны канала МК -> ПК. Чтобы его обойти реализовал ещё 2 режима.
Пакетный
В этом режиме МК вначале набирает данные, потом пачкой передаёт на ПК. Опционально его можно разгонять. Про разгон подробно писал в предыдущих частях.
В этом режиме возможна синхронизация. Причём можно анализировать сигнал до выполнения условия. Для реализации такого функционала пришлось изменить режим работы DMA на кольцевой, использовать прерывание заполнения половины буфера и использовать буфер вмещающий в 2 раза больше данных, чем в передаваемом пакете.
- Меньше деталей, а значит меньше цена и проще монтаж;
- Возможность в будущем реализовать более сложные триггеры, а не просто «сигнал в A канале стал больше Х».
В одноканальном режиме оба АЦП по очереди преобразуют значение одного канала.
В двухканальном — каждый АЦП преобразует свой канал запускаясь одновременно с другим.
В 4-х канальном — у каждого АЦП есть 2 канала, которые он преобразует. Старт обоих АЦП одновременный.
Очевидно, что скорость частота преобразования канала обратнопропорциональна количеству каналов.
Логический анализатор
Самый быстрый режим. Примерно 20 MSPS на каждом канале. Самый быстрый код для этого режима выглядит так:
и так далее на весь буфер.
Значение переменной i в этом случае вычисляются на этапе компиляции и в итоге из dataBuffer.u8[++i] = GPIOA->IDR; получается всего 2 операции — загрузить данные в регистр из порта и сохранить данные в память по заранее посчитанному адресу. Никакими циклами такой производительности достичь не получилось.
Программа для ПК
Главные, на мой взгляд, измение — переход на OpenGL. С ним графики рисовать стало проще (для меня это оказалось неожиданно, но там всё действительно просто и кратко!), рисуются они быстрее и получаются гораздо красивей, чем были раньше.
Проект не завершён, есть глюки, допиливать ещё много чего, но каких-то прорывов уже не предвидится. Для более быстрых систем нужно другое железо, например, отдельный АЦП + ПЛИС + память — а это уже будет гораздо дороже и сложнее монтировать.
- Дисплей прикручивать не собираюсь т.к.:
- Он стоит денег, а комп есть.
- По качеству будет хуже, чем на большом экране ПК.
- Создавать и изменять пользовательский интерфейс на C# проще, чем паять и перепаивать.
Архив с проектом
Если у кого появятся вопросы, а тут не зарегистрированы, пишите в почту: adefikux на gmail точка com.Осциллограф на микроконтроллере своими руками
Уважаемые читатели, Вашему вниманию представляется практическая схема USB осциллографа с частотой дискретизации 48 МГц на основе модуля WoodmanUSB.С принципиальными особенностями подобного осциллографа мы познакомились в предыдущей статье, где рассмотрели аппаратную и программуную реализацию анализатора логического уровня. Принципы построения остаются абсолютно аналогичными, только теперь на вход порта PORTB модуля мы будем подавать оцифрованный сигнал с быстродействующего АЦП.
Схема блока АЦП представлена на рисунке ниже. Итак, что мы здесь видим — это во-первых, собственно сам АЦП — микросхема AD9057 от Analog Devices. Был проведен анализ возможных кандидатов на данную позицию, рассматривались изделия от MAXIM, TI но в итоге был приныт имеено AD9057. Он относительно прост, удовлетворяет требованиям по частоте дискретизации, более менее доступен в продаже. Этот АЦП в продаже попадется в нескольких модификациях, отличающихся максимальной частотой дискретизации. Обозначается она так: AD9057BRS80 — т.е. этот образец может разгоняться до 80 МГц. Они также бывают на 40 и 60 МГц. Соответственно, желательно брать на 60 или 80 чтобы возможности WoodmanUSB зря не пропадали.
Далле обратим внимание на операционный усилитель AD828. Если его под рукой нет, то можно использовать любой другой, это не критично. Главное чтобы этот ОУ уверенно работал от однополярного напряжения и обеспечивал необходимую полосу пропускания (мегагерц этак 50 и более).
Теперь внимательней посмотрим на саму схему. Она очень простая. Как видно здесь использется только один ОУ без применения двупорных схем питания. Однако простота требует жертв. Схему придется настраивать с помощью подстроечных резисторов R1, R2 для установки оптимального режима.
Пару замечаний по схеме. Куча стрелочек с номерами выходящих из AD9057 соответственно должны подключаться к соответствующим выводам модуля WoodmanUSB. Далее, на вход схемы можно подвать напряжение от 0 до +5 В (больше не нужно — схему можно сжечь).
Обратим свое внимание на софт. Я решил для этой статьи оставить «движок» программы из прошлой статьи. Они почти полностью совпадают, за исключением того что теперь на отрисовку идут полноценные 8 бит данных а не 1 как было раньше в анализаторе. Как уже сказал — там ничего принципиально нового нет, поэтому рассматривать код не будем.
Итак, настало время первого запуска. Соединяем блок АЦП с модулем WoodmanUSB, подключаем все это к компьютеру. Для тестового анализа предлагаю использовать генератор прямоугольных импульсов — так проще будет настроить схему. Я использую микроконтроллер из предыдущей статьи. Запускаем программу. С очень большой степенью вероятности Вы должны увидеть нечто вот такое как на рисунке ниже, т.е. нечто весьма далекое от правды.
Рис. 1. Вид осциллограммы при расстроенном АЦП Чтобы исправить положение, необходимо с помощью подстроечных резисторов добиться оптимального режима работы блока АЦП, путем подбора таких значений сопротивлений, при которых полученная осциллограмма совпадает с входным аналоговым сигналом. По теории сопротивление R1 должно быть порядка 50 КОм, R2 — 10 КОм. Если все настроено верно, то в итоге должны получить вот такую картинку как на рисунке 2. Разумеется, если Вы используете в качестве тестового сигнала контроллер из прошлой статьи. Если у Вас свой источник опорного сигнала — должны увидеть то что подаете.
Рис. 2. Вид осциллограммы при настроенном АЦП Вот собственно и все — у Вас на руках вполне работоспособная версия цифрового USB осциллографа с частотой дискретизации 48 МГц. Согласитесь, внушительная цифра. Однако если нет необходимости в промышленной дорогостоящей установке, вполне можно использовать конструкцию, рассмотренную на этой странице.
Что еще необходимо сказать. Вернее, напомнить — данный осциллограф не обечспечивает непрерывной дескритизации! 48-ми мегагерцовый шаг будет обеспечен только в каждых 512 отсчетах внутри буфера данных, прочтенных из модуля, а между пакетами по 512 точек временное расстояние не известно. Поясним на примере. В идеале должно быть следующее: берем отрезок сигнала длительностью 1 сек. Получаем 48 миллионов отсчетов, причем временное расстояние между любыми двумя точками строго равно 1/48*10 6 сек. В связи с особенностями USB шины на таких скоростях мы не можем обеспечить непрерывный поток данных, при котором скорость передачи будет одинаковой для любого момента времени. В шине USB мгновенная скорость сильно «плавает», если такой термин вообще применим. Итого, точную временную синхронизацию можно гарантировать только для пакета данных размером равным размеру контрольной точки USB модуля, в данном случае 512 байт. Другой вопрос что модуль может обеспечить порядка 20000 таких пакетов по 512 байт за одну секунду. Итого, в данном случае мы имеем дело с
20 тыс. выборок входного сигнала в секунду по 512 байт каждая, причем внутри каждых этих 512 байт времеменное расстояние между отсчетами четко равно 1/48*10 6 сек. Подобные особенности не помешают нам, если мы анализируем переодические или медленно меняющиеся процессы.
USB осциллограф на PIC микроконтроллере
Этот простой и дешёвый USB осциллограф был придуман и сделан просто ради развлечения. Давным давно довелось чинить какой-то мутный видеопроцессор, в котором спалили вход вплоть до АЦП. АЦП оказались доступными и недорогими, я купил на всякий случай парочку, один пошёл на замену, а другой остался. Недавно он попался мне на глаза и почитав документацию к нему я решил употребить его для чего-нибудь полезного в хозяйстве. В итоге получился вот такой приборчик. Обошёлся в копейки (ну рублей 1000 примерно), и пару выходных дней. При создании я постарался уменьшить количество деталей до минимума, при сохранении минимально необходимой для осциллографа функциональности. Сначала я решил, что получился какой-то уж больно несерьёзный аппарат, однако, сейчас я им постоянно пользуюсь, потому что он оказался весьма удобным — места на столе не занимает, легко помещается в карман (он размером с пачку сигарет) и обладает вполне приличными характеристиками:
Для разных настроек и поиска неисправностей во всяких преобразователях питания, схемах управления бытовой техникой, для изучения всяких устройств и т.д., там где не требуются точные измерения и высокие частоты, а нужно просто посмотреть на форму сигнала частотой, скажем, до пары мегагерц — более чем достаточно.
Кнопка S2 — это часть железа нужного для бутлоадера. Если при подключении осциллографа к USB держать её нажатой, то PIC заработает в режиме бутлоадера и можно будет обновить прошивку осциллографа при помощи соответствующей утилиты. В качестве АЦП (IC3) была использована «телевизионная» микросхема — TDA8708A. Она вполне доступна во всяких «Чип и Дип»ах и прочих местах добычи деталей. На самом деле это не только АЦП для видеосигнала, но и коммутатор входов, выравниватель и ограничитель уровней белого — чёрного и т.д. Но все эти прелести в данной конструкции не используются. АЦП весьма шустр — частота дискретизации — 30 МГц. В схеме он работает на тактовой частоте 12 МГц — быстрее не нужно, потому что PIC18F2550 просто не сможет быстрее считывать данные. А чем выше частота — тем больше потребление АЦП. Вместо TDA8708A можно использовать любой другой быстродействующий АЦП с параллельным выводом данных, например TDA8703 или что-нибудь от Analog Devices.
Тактовую частоту для АЦП удалось хитрым образом извлечь из PIC’а — там запущен ШИМ с частотой 12 МГц и скважностью 0.25. Тактовый импульс положительной полярности проходит в цикле Q1 PIC’а так что при любом обращении к порту B, которое происходит в цикле Q2 данные АЦП будут уже готовы. Ядро PIC’а работает на частоте 48 МГц, получаемой через PLL от кварца 4 МГц. Команда копирования из регистра в регистр выполняется за 2 такта или 8 циклов. Таким образом, данные АЦП возможно сохранять в память с максимальной частотой 6 МГц при помощи непрерывной последовательности команд MOVFF PORTB, POSTINC0. Для буфера данных используется один банк RAM PIC18F2550 размером 256 байт.
Меньшие частоты дискретизации реализуются добавлением задержки между командами MOVFF. В прошивке реализована простейшая синхронизация по отрицательному или положительному фронту входного сигнала. Цикл сбора данных в буфер запускается командой от PC по USB, после чего можно эти данные по USB прочитать. В результате PC получает 256 8-битных отсчётов которые может, например, отобразить в виде изображения. Входная цепь проста до безобразия. Делитель входного напряжения без всяких изысков сделан на поворотном переключателе. К сожалению не удалось придумать как передавать в PIC положение переключателя, поэтому в графической морде осциллографа есть только значения напряжения в относительных единицах — делениях шкалы. Усилитель входного сигнала (IC2B) работает с усилением в 10 раз, смещение нуля, необходимое для АЦП (он воспринимает сигнал в диапазоне от Vcc — 2.41В до Vcc — 1.41В) обеспечивается напряжением с программируемого генератора опорного напряжения PIC (CVREF IC1, R7,R9) и делителем от отрицательного напряжения питания (R6,R10, R8). Т.к. в корпусе ОУ был «лишний» усилитель (IC2A), я использовал его как повторитель напряжения смещения.
Не забудьте про емкостные цепочки для частотной компенсации входной ёмкости вашего ОУ и ограничивающих диодов, которые отсутствуют на схеме — нужно подобрать ёмкости параллельно резисторам делителя и резистору R1, иначе частотные характеристики входной цепи загубят всю полосу пропускания. С постоянным током всё просто — входное сопротивление ОУ и закрытых диодов на порядки выше сопротивления делителя, так что делитель можно просто посчитать не учитывая входное сопротивление ОУ. Для переменного тока иначе — входная ёмкость ОУ и диодов составляют значительную величину по сравнению с ёмкостью делителя. Из сопротивления делителя и входной ёмкости ОУ и диодов получается пассивный ФНЧ, который искажает входной сигнал.
Чтобы нейтрализовать этот эффект нужно сделать так, чтобы входная ёмкость ОУ и диодов стала значительно меньше ёмкости делителя. Это можно сделать соорудив емкостной делитель параллельно резистивному. Посчитать такой делитель сложно, т.к. неизвестна как входная ёмкость схемы, так и ёмкость монтажа. Проще его подобрать.
Способ подбора такой:
1. Поставить конденсатор ёмкостью примерно 1000 пФ параллельно R18.
2. Выбрать самый чувствительный предел, подать на вход прямоугольные импульсы с частотой 1 кГц и размахом в несколько делений шкалы и подобрать конденсатор параллельно R1 так, чтобы прямоугольники на экране выглядели прямоугольниками, без пиков или завалов на фронтах.
3. Повторить операцию для каждого следующего предела, подбирая конденсаторы параллельно каждому резистору делителя соответственно пределу.
4. Повторить процесс с начала, и убедиться, что на всех пределах всё в порядке ( может проявиться ёмкость монтажа конденсаторов ), и, если что-то не так, слегка подкорректировать ёмкости.Сам ОУ — это Analog Devices AD823. Самая дорогая часть осциллографа. 🙂 Но зато полоса 16 МГц — что весьма неплохо.А кроме того, это первое из шустрого, что попалось в розничной продаже за вменяемые деньги.
Конечно же этот сдвоенный ОУ без всяких переделок можно поменять на что-то типа LM2904, но тогда придётся ограничится сигналами звукового диапазона. Больше 20-30 кГц оно не потянет.
Ну и форму прямоугольных, например, сигналов будет слегка искажать. А вот если удастся найти что-то типа OPA2350 (38МГц) — то будет наоборот замечательно.
Источник отрицательного напряжения питания для ОУ сделан на хорошо известной charge-pump ICL7660. Минимум обвязки и никаких индуктивностей. Ток по выходу -5 В конечно у неё невелик, но нам много и не надо. Цепи питания аналоговой части изолированы от помех цифры индуктивностями и ёмкостями (L2, L3, C5, C6). Индуктивности попались номиналом 180 uГн, вот их и поставил. Никаких помех по питанию даже на самом чувствительном пределе. Прошивка PIC заливается по USB с помощью бутлоадера который сидит с 0-го адреса в памяти программ и запускается если при включении удерживать нажатой кнопку S2. Так что прежде чем прошивать PIC — залейте туда сначала бутлоадер — будет проще менять прошивки.
Исходники драйвера осциллографа для ядер 2.6.X находятся в архиве с прошивкой. Там же есть консольная утилитка для проверки работоспособности осциллографа. Её исходники стоит посмотреть, чтобы разобраться как общаться с осциллографом, если хочется написать для него свой софт.
Программа для компьютера проста и аскетична, ее вид показан на рисунках 2 и 3. Подключить осциллограф к USB и запустить qoscilloscope. Требуется QT4.Рис2. Программа qoscilloscope
Adblock
detectorДля любых предложений по сайту: [email protected]