С хорошим микроконтроллером и время летит быстро или осциллограф выходного дня / Хабр
Некоторое время назад автор этих строк взялся разрабатывать компактный регистратор одно-полярного аналогового сигнала в пределах 3 вольт с максимально возможной скоростью считывания и минимально возможными затратами и размерами. В список минимально возможных затрат я вписал также и свою головную боль и выбрал хорошо знакомый мне STM32F303. Это, напомню, Cortex-M4 на 72 мегагерца от известной компании, со встроенными 12 разрядными, довольно шустрыми, аналого-цифровыми преобразователями (АЦП или ADC, кому как нравится) и с CAN интерфейсом на борту.
Таких небольших регистраторов требовалось несколько десятков. А наличие у микроконтроллера корпуса о 48-ми ногах вселяло надежду на то, что получится назвать этот считыватель компактным. Интерфейс CAN, с которым у меня уже тогда были хорошие отношения, давал мне возможность объединить весь этот джаз в достаточно удобной манере.
Скорость, с которой, в конце концов, все это заработало, оказалась вполне подходящей, чтобы заявить о работоспособности выбранного подхода. Удалось добиться пол микросекундного шага дискретизации. Головной боли и ассемблера избежать не удалось, но кто об этом сейчас вспоминает?
Однако, некоторый осадок остался. Осталась мысль, что, в отношении быстродействия, выжато было не все.
И вот, совсем недавно появляется серия STM32G4 с тактовой частотой до 170 мегагерц с вариантом в маленьком корпусе, и с почти такими же шустрыми АЦП на борту в количестве пяти штук. Надо было что-то делать.
Над душой теперь никто не стоял и можно было не беспокоиться о сроках и планах.
Действительно, если об этом не думать, то можно получить удовольствие даже от работы. Но, честно говоря, о времени думать пришлось. Думать долго о времени малом (а что, поэтично).
Напрашивалась мысль, что надо начать немного с другого конца. То есть, надо исходить из минимально возможного времени выборки АЦП, которое, если исходить из описания, занимает 2.5 такта и составляет на 40 МГц (160 МГц / 4) 62.5 наносекунды. Тогда сам собой напрашивается шаг дискретизации в 100 наносекунд. Число круглое и, главное, довольно маленькое и красивое, почему бы и не попробовать?
К тому же, появилась в продаже и была куплена подходящая для экспериментов плата NUCLEO-G474RE, к которой разумно было добавить дополнительную макетную плату с двумя двухрядными разъемами, чтобы припаивать всякие провода и детали к макетной плате и не портить основную. Вот как это выглядит в готовом виде.
Там, снизу, есть несколько проводков и резистор с конденсатором, уж поверьте мне на слово.
Теперь надо подать подходящий электрический сигнал сразу на все четыре АЦП, затем запускать их друг за другом с постоянным шагом (сначала, при отладке, не очень коротким). Почему четыре? В соответствии с описанием, на одно преобразование каждый АЦП тратит 15 тактов или 0.025*15=375 наносекунд (почти 400). Поэтому при шаге 100 потребуется конвейер из четырех АЦП.
В качестве входного сигнала использовалась RC цепь, на которую подавалось напряжение просто от ножки контроллера. Этой ножкой я назначил управлять таймер TIM5 в режиме одиночных импульсов.
Минимальная схема соединений выглядела как показано на рисунке ниже.
Были задействованы ADC1-ADC4. Разрядность можно было снизить для некоторого повышения быстродействия, но 12 разрядов перевесили, поскольку не хотелось терять в точности измерений. Для запуска каждого АЦП в нужном порядке и с требуемым шагом используются три таймера (TIM2, TIM3, TIM4) и еще один таймер (TIM1) служит для синхронизации вышеуказанных трех. На рисунке 2 ниже показаны сигналы, вокруг которых все строится.
Зеленые стрелки показывают фронты импульсов, по которым происходит запуск соответствующих преобразователей ADC1-ADC4.
Чтобы получить задуманные 100 наносекунд пришлось снизить тактовую частоту до 160 мегагерц, чтобы все там делилось нацело как следует. Сначала шаг был установлен значительно медленнее, 4 микросекунды, чтобы спокойно проверить работу таймеров, используя прерывания, выходные порты и осциллограф. Затем по прерываниям был отлажен и заработал прямой доступ к памяти. В конечном счете только одно прерывание обрабатывается — это прерывание окончания работы от четвертого (последнего) канала прямого доступа к памяти. На рисунке ниже показаны соединения участвующих в процессе аппаратных блоков, а также четыре выходных буфера памяти.
Из четырех буферов памяти (на рисунке — справа) отсчеты собираются программно в один буфер результата.
В этом контроллере, в отличие от STM32F303, есть блок коммутации запросов (DMAMUX), который позволяет перенаправлять огромное количество запросов от периферийных устройств всего на 16 каналов DMA1 и на 16 каналов DMA2. В справочном руководстве (Reference manual) выходные запросы DMAMUX отсчитываются от 0, а входы каналов DMA блоков отсчитываются от 1. Не стал менять, оставил как в первоисточнике.
В качестве генератора одиночного импульса используется таймер TIM5. В нем предусмотрен удобный режим одиночного импульса. Удобство заключается в возможности установки времени до начала импульса и установки длительности самого импульса. Этот импульс получился таким как показано ниже на картинке, любезно предоставленной осциллографом, взятым напрокат.
Из осциллограммы видно, что подъем импульса длится 10 микросекунд, значит он должен вместить порядка 100 отсчетов.
Проект делался в IAR 8.4 вручную (то есть, без Куба и Шара), но, надеюсь, будет понятен самым разным конфессиям. Его можно посмотреть здесь.
Вот картинка содержимого отдельного буфера ADC1 и собранного из четырех источников буфера результата в районе начала входного импульса.
А вот содержимое этих буферов в районе пика импульса (там, где значение доходит до 2508).
Как видим, на участок от начала импульса до его вершины потрачен 196-95=101 отсчет.
Значит частота дискретизации составляет 10 мегагерц. Заработало на такой скорости не сразу.
Для того, чтобы добиться этого пришлось останавливать процессор пред началом работы прямого доступа к памяти (DMA1). Хорошо, что у Cortex-M4 есть специальная ассемблерная инструкция WFI (Ждать прерывания). Если этого не сделать то процессор будет мешаться под ногами у DMA и занимать шину обращениями в память, которые вполне могут подождать.
Если увеличить шаг отсчетов до 200 наносекунд, то они перестанут толкаться и заживут мирно и счастливо.
Если вовлечь в работу компаратор COMP4 и соединить его положительный вход (порт PB0) с входным сигналом, а затем использовать ЦАП (DAC1) и соединить его выход (Ch2) с отрицательным входом компаратора (внутри контроллера), то получим пороговое устройство с регулируемым порогом. Прерывания от срабатывания компаратора позволят запускать общий тактовый таймер TIM1 и получить ждущий режим, как в осциллографе.
USB осциллограф на PIC микроконтроллере
Этот простой и дешёвый USB осциллограф был придуман и сделан просто ради развлечения. Давным давно довелось чинить какой-то мутный видеопроцессор, в котором спалили вход вплоть до АЦП. АЦП оказались доступными и недорогими, я купил на всякий случай парочку, один пошёл на замену, а другой остался.
– Максимальная частота дискретизации – 6 МГц;
– Полоса пропускания входного усилителя – 0-16 МГц;
– Входной делитель – от 0.01 В/дел до 10 В/дел;
– Входное сопротивление – 1 МОм;
– Разрешение – 8 бит.Принципиальная схема осциллографа показана на рисунке 1.
Для разных настроек и поиска неисправностей во всяких преобразователях питания, схемах управления бытовой техникой, для изучения всяких устройств и т.д., там где не требуются точные измерения и высокие частоты, а нужно просто посмотреть на форму сигнала частотой, скажем, до пары мегагерц – более чем достаточно.
Кнопка 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.
Во вложении- все файлы к проекту
Источник: http://shemotehnik.ru/
Самый милый осциллограф из когда-либо созданных
- по: Шэрон Лин
Если вы считаете, что портативный цифровой осциллограф является самым портативным инструментом анализа сигналов, то вас ждет сюрприз. Этот осциллограф, сделанный [Mark Omo], измеряет всего один квадратный дюйм, при этом большую часть пространства занимает OLED-экран.
Он складывается, превращаясь в более удобный инструмент, и, по общему признанию, требует внешних входов, так что это не совсем автономный инструмент. Осциллограф работает на процессоре PIC32MZ EF, обеспечивающем скорость 20 Мвыб/с и полосу пропускания 1 МГц. Первый чередует внутренние АЦП процессора для достижения его скорости.
Для аналогового внешнего интерфейса сигналы сначала поступают на оконечную нагрузку 1 МОм, которая делит сигналы в 10 раз, чтобы измерить их за пределами рельсов. Затем они проходят через пару диодов, подключенных к шинам, ограничивая напряжение, чтобы предотвратить повреждение. Делитель центрирует входящий сигнал переменного тока около 1,65 В, на полпути между AGND и +3,3 В. В качестве дополнительной меры безопасности между сигналами и диодами установлен резистор на 909 кОм большего размера, чтобы предотвратить прохождение большого тока через диод в случае поступления в систему большого напряжения.
Следующий компонент — каскад переменного усиления, обеспечивающий 10-кратное, 5-кратное или 1-кратное усиление, соответствующее 1-кратному, 0,5-кратному и 0,1-кратному усилению системы. В подсистеме используются операционный усилитель TLV3541 и аналоговый переключатель ADG633 с двумя однополюсными переключателями, чтобы обеспечить полосу пропускания по мощности вокруг отклика системы из-за проблем с возбуждением. Примечательно, что сопротивлением переключателя нельзя пренебречь, оно потенциально зависит от напряжения. К счастью, экран, используемый в осциллографе, требует 12 В, поэтому подача 12 В на мультиплексор приводит к более низкому напряжению и, следовательно, к более ровной характеристике.
Модуль АЦП, PIC32MZ1024EFH064, представляет собой 12-разрядный АЦП последовательного приближения. Одним из преимуществ его конкретного АЦП является то, что дополнительные биты разрешения требуют только постоянного времени, поэтому скорость и точность могут быть компромиссом. Преобразование начинается с выборки и последовательности хранения, используя сохраненное напряжение на конденсаторе для расчета напряжения.
Несколько АЦП используются параллельно для выборки одновременно, в результате чего чередование улучшает частоту выборки. Поскольку от модуля АЦП поступает 120 мегабит данных в секунду, периферийное устройство прямого доступа к памяти (DMA) на PIC32MZ позволяет записывать данные непосредственно в память микроконтроллера без участия процессора.
В настоящее время прошивка доступна на GitHub, а схемы опубликованы на странице проекта.
ОШИБКА – 404 – НЕ НАЙДЕНА
- Главная
- У нас было лишнее масло.
Наши серверные гномы не смогли найти страницу, которую вы ищете.
Похоже, вы неправильно набрали URL-адрес в адресной строке или перешли по старой закладке.
Возможно, некоторые из них могут вас заинтересовать?
Вывод поворотного энкодера SparkFun — с подсветкой (RG/RGB)
В наличии БОБ-11722
2
Избранное Любимый 17
Список желаний
Транзистор – NPN, 60В 4А (2N5192G)
Нет в наличии COM-13951
Избранное Любимый 8
Список желаний
Стартовый комплект SparkFun Qwiic PIR (170 мкА)
Нет в наличии КОМПЛЕКТ-19517
Избранное Любимый 2
Список желаний
MIKROE AudioAmp 6 Click
Нет в наличии COM-19816
14,95 $
Избранное Любимый 1
Список желаний
Ped Dead Reckoning II: на этот раз инерционный
28 апреля 2021 г.