Воюем с USB
В нашем МК есть аппаратный USB. Его очень хотелось использовать. Ещё до покупки хотелось. Но из-за сложностей, он был отложен «на потом». А сложности такие:
- У разработчиков USB, видимо, было слишком много времени и интеллекта. Беда в том, что они посчитали, что у всех остальных должно быть их не меньше. Если пытаться разобраться с USB по документации, то это занятие явно не на один день.
- При подключении библиотек постоянно возникали сложности. Как их подключать в проектах Coocox я так и не разобрался.
В итоге на одном форуме нашёл сконвертированный в Coocox пример, который заработал.
На этом проблемы с нашим USB не закончились. Отдельный переходник USB <-> USART имеет преимущество в том, что он отдельный, а значит его работа не зависит от нашего МК, а именно от:
- Частоты (для большей частоты преобразований, МК я разогнал);
- Перезагрузок, которые случаются при перепрошивке.
Когда есть переходник, мы можем всё что угодно делать с МК — переходник при этом будет работать и COM порт в системе никуда не денется.
С разгоном принято такое решение: в обычном состоянии МК работает на штатной частоте. Когда нам надо провести замер, мы разгоняем МК (да, в отличие от AVR он такое умеет прям на ходу), набираем данные, снижаем частоту и потихоньку передаём данные на комп.
Чтобы ничего не переключать после каждой перезагрузки/перепрошивки, смотрим на схему платы:
Джампером тут один из проводов подтягивается к +3.3 В, и комп видит, что устройство подключено. Опытным путём выяснено, что после перепрошивки МК, чтобы COM порт снова заработал, надо либо выдернуть и снова воткнуть разъём USB либо снять и снова поставить перемычку. Второй вариант автоматизировать гораздо проще. Второй пин разъёма джампера через резистор подключил к ноге МК и после перезагрузки через некоторое время подаю на него высокий уровень. В результате комп думает, что устройство было отключено и снова включено. Тут ещё один момент: если устройство отключить при открытом порте, а потом снова включить, то COM порт появится в диспетчере устройств, но открыть его будет нельзя (я использую Windows 7).
Теперь про разгон. Чтобы работал USB, МК как максимум может работать на таких частотах:
А для получения максимум скорости АЦП я его разгоняю до таких:
Чтобы изменить множитель PLL, его надо отключить. А когда хоть на мгновение отключается PLL, то тактируемому от него USB это не нравится и приложение на компе в большинстве случаев виснит с открытым портом. После безрезультатного гугления проблемы был найден способ совмещения встроенного USB и разгона:
- Приложение на ПК посылает МК команду на выполнение серии преобразований и сразу же закрывает порт;
- МК ждёт некоторое время (чтобы приложение успело закрыть порт) и отключает подтяжку линии USBDP к +3.3 В;
- МК отключает PLL, меняет множитель с 9 на 16 и снова включает PLL;
- МК проводит серию преобразований запоминая результат;
- МК отключает PLL, меняет множитель обратно с 16 на 9 и снова включает PLL;
- МК включает подтяжку линии USBDP к +3.3 В;
- На ПК через какое-то время снова появляется виртуальный COM порт;
- Приложение на ПК вновь открывает порт и посылает в МК команду на забор результата;
- МК неспеша передаёт результат, приложение строит график.
Не удобно, но ради того, чтобы отказаться от аппаратного переходника USB <-> USART и не потерять при этом 7/16 = 44% скорости оно того стоит.
Берём другую плату
Всё время до этого я использовал вот эту плату:
Она удобна когда является основной в устройстве, но подключать её проводами к макетной доске не хочется. Для этого ещё давно была заказана другая плата
которую можно воткнуть в доску или легко впаять в другую плату.
Схему этой платы с трудом удалось найти на форуме.
Несколько впечатлений. В общем, она порадовала. Слева находятся штырьки SWD, каждый контакт подписан и, если бы китайцы не впаяли туда угловой разъём, подписи даже было бы видно и было бы удобней, чем каждый раз смотреть на распиновку JTAG на предыдущей плате. Всё без проблем прошилось, USB появился, но с ним возникла небольшая проблема: линия USBDP наглухо прятянута к +3.3 В резистором. Так что USB получился неотключаемым… пришлось выпаять этот резистор и подпаять линию через резистор к свободной ноге МК.
Аналоговая часть
До этого я работал только с сигналами из диапазона 0 — 3.3В. Причём это не какой-то там плавающий ноль, а земля пришедшая с USB кабелем. Я же хочу чтобы осциллографом можно было как смотреть на форму сетевого напряжения (сотни вольт), так и на ЭКГ (доли милливольт).
Задача в общем-то простая: взять входной диапазон осциллографа и отобразить его к входному диапазону АЦП (0 — 3.3В). Схема придумана вот такая:
R1, R2, R3 — входной делитель. Переводя ноги МК в режим входа или выхода можем изменять коэффициент деления.
R11, R12, R13 — резисторы не инвертирующего усилителя. Коэффициент усиления зависит от состояния ног контроллера.
Были сомнения в том, что можно ли использовать цифровые выходы МК для таких целей. Замер показал, что ток через вывод МК в 3.3 мА уводит вывод на 80 мВ, т. е. сопротивление выхода около 24 Ом. Потенциал висящего в воздухе выхода на 3-4 мВ отличается он земли/питания. Для не особо точной системы результат вполне приемлемый.
Чтобы не угробить частотные характеристики за которые я так боролся, операционник нужен не абы какой, а быстрый. Выбрал AD826. И тут возникли траблы. Кому интересно, можете почитать историю тут и тут. Вкратце: на Ebay продаются поддельные микросхемы.
ОУ нужно двуполярное питание. Для этого понадобилась ещё одна микросхема — LT1054. Схема подключения взята из даташита, поэтому подробно описывать её не буду.
Итог
Вспоминая планы из первой части статьи:
- Победить USB, чтобы отказаться от преобразователя USB <-> USART;
- Доделать аналоговую часть, чтобы диапазон входных напряжений был не 0 — 3.3 В, а более приличным;
- Сделать многоканальный режим;
- Реализовать управление с ПК;
- Сделать законченное устройство в корпусе;
понимаю, что выполнил 1, 2 и частично 4-й пункт.
Нужен ли такой девайс в хозяйстве? Ну если сравнивать его с аналоговым С1-117, то по частоте C1-117 его в разы превосходит. Зато тут можно записать сигнал в течении достаточно продолжительного времени и потом не спеша его разглядывать. Так, например, я увидел срабатывание прерывания у моего генератора на Arduino:
Если сравнивать с поделками на AVR или звуковой карте, то эта значительно их превосходит по частоте преобразования.
По стоимости компонентов получается:
- LT1054 — $0.8;
- плата с контроллером — $4;
- операционник — $3;
- резисторы, конденсаторы, диоды — не более $1.
Всего получается порядка $9 + плата + корпус.
Частота преобразований 9 MSPS позволяет наблюдать сигнал частотой до 1 MHz. За $60 можно купить PC Based осциллограф с лучшими характеристиками, но за получившуюся сумму предложений просто нет.
Однако, самым ценным для меня оказался не сам девайс, а опыт полученный в результате попытки сделать что-то сложнее мигания диодом и с претензией на полезность! Я никогда не был связан с электроникой по работе и, как любитель, могу сказать, что это не сложно. Долго — да. Нужна какая-то функция — начинаешь делать. По пути собираешь много граблей, но в конце концов она получается. И так много раз. Даже в такой, казалось бы, небольшой задаче как эта, так было много раз. Например, сделать двуполярное питание для ОУ у меня получилось только с третьей попытки. Но, если хватит упорства и задача была в принципе реализуемой, то в результате обязательно получится что-то похожее на изначально задуманное!
Внешний вид поделки:
Рисовалка графика на С#
Проект в CooCox — прошивка МК
Комментарии (25)
retrograde
28.01.2016 20:59В чём соль параллельных R1, R2 и R11, R12? Не лучше ли поставить 2-3 нормированных операционника каскадом и читать нужный.
Хотя я с действительно большими диапазонами не работал.xedas
28.01.2016 22:15Параллельные резисторы для переключения коэффициентов деления и усиления микроконтроллером. Например, если взять
R1 = 0.1*R3
R2 = 0.01*R3
то сможем выбирать коэффициент деления между 1, 11 и 101 простым переключением состояний выходов МК.
Лучше ли взять несколько ОУ — не знаю. Может быть, лучше, но дешевле и проще так:
- Эти высокочастотные операционники стоят дороже МК за спаренный ОУ, а если осциллограф делать многоканальным, то совсем дорого выйдет;
- Помимо самих ОУ к каждому нужна обратная связь, так что в результате количество элементов сильно возрастёт.
Я не электронщик. Наверняка можно сделать аналоговую часть оптимальней. Предлагайте альтернативные варианты!retrograde
28.01.2016 22:27>>Лучше ли взять несколько ОУ — не знаю. Может быть, лучше, но дешевле и проще так:
Обычно операционников по 2 или 4 на кристалле. (судя по фото из прошлой статьи у автора 4).
Ацп на этом контроллере то-ли 6, то-ли 8 на 10 бит.
Вопрос цены тут не стоит никак.xedas
29.01.2016 00:19Операционники сейчас у меня по 2 в корпусе.
АЦП 2 штуки на 12 бит каждый, 10 каналов.
Но рассчитаны АЦП на преобразования с частотой 1 MSPS каждый, а работают на 4.5 MSPS и время выборки у них тоже в 4.5 раза меньше, чем должно быть. Поэтому ожидать погрешности в пределах 1 деления тут не стоит.
Помимо цены не хочется увеличивать сложность монтажа за счёт увеличения количества элементов.
Было бы здорово посмотреть схему, а то я не понимаю что именно вы предлагаете.retrograde
29.01.2016 11:27+1Забейте. Я тут помозговал, и понял что каскад хорош только на известном максимуме входа. И максимум этот весьма низковольтный.
Konachan700
29.01.2016 10:13Вместо простых резисторов и кучи ножек контроллера лучше поставить регулируемый i2c-резистор. Тогда диапазон будет широченным и все это будет управляться программно.
golf2109
28.01.2016 22:04желательно довести до ума проект с рисовалкой графика, совсем непонятно номер СОМ порта и его параметры и назначение кнопок button1 & button2
xedas
28.01.2016 22:22Да. Там много чего ещё до ума доводить. Оно пока в стадии «О! Клёво! Заработало!». Но если рисовалка ещё более-менее понятна из кода (его там не много), то в коде прошивки вообще пока что хлам.
kalbasa
28.01.2016 22:24в первой статье прочитал что выгружаете записанные данные в компьютер. USART HMI не рассматривали в качестве идеи о портативном осциллографе?
www.itead.cc/display/nextion.htmlxedas
28.01.2016 22:36Для себя не рассматривал потому что:
- Экран компа/ноута больше, качественней и, самое главное, есть (бесплатен);
- Писать программу для ПК проще чем для МК;
- На текущем этапе очень не хочется подключать дополнительные железки.
Может быть, через некоторое время появится интерес к таким экранам, но не сейчас.
gleb_l
28.01.2016 22:31+2Что-то мне кажется, что при программном выборе коэффициента деления входного усилителя показанным способом а) в цепь сигнала насосется много шума с цифровой земли и б) потребуется ВЧ-коррекция получившегося делителя — см, например, здесь. Лучше уж герконовыми реле.
PS — за полезную инфу о workaround'ах c PLL и USB — спасибо!
obsolete
29.01.2016 11:28На всякий случай. Опытным путём установлено, что диапазон измерения у АЦП STM32 не до 3,3, а только до 3 В.
По крайней мере, на нулевой, сотой и трёхсотой сериях так.
olekl
29.01.2016 13:06Вместо двуполярного питания можно же использовать однополярное и подтянуть сигнал к середине.
xedas
29.01.2016 18:02Можно. Вначале я так и делал, но потом отошёл от этого потому что:
- Быстрые ОУ из тех что я видел, требуют достаточно большого напряжения питания, а при малом напряжении питания у них ухудшаются частотные характеристики. Тот же AD826 может работать начиная с напряжения питания в 5 В, а с платки я могу получить максимум 4.2В (замерял).
- ОУ плохо умеют притягивать выход к питанию. Если мы сделаем -Vs = 0В и +Vs = 5 В, то на выходе сможем получить напряжение от 1.5 В до 3.5 В (согласно даташиту) и не сможем использовать весь диапазон АЦП.
Хотя, конечно, идея отказаться от источника двуполярного питания выглядит очень заманчиво.
svitoglad
29.01.2016 15:56Есть в планах сделать 2 канала?
xedas
29.01.2016 18:12Есть! Причём т.к. АЦП в МК физических два, то можно оба канала выбирать одновременно. А если по очереди замерять, то можно количество каналов вообще до 10 довести. Насколько я понял из документации, МК может без участия программы сканировать нужные каналы и складывать данные в буфер.
svitoglad
29.01.2016 21:52Когда мерять по очередно то частота выборки уменьшится. На мой взгляд если нужно больше 2- х каналов то неплохо бы предусмотреть внешнюю синхронизацию и поключить еще один микроконтроллер.
xedas
29.01.2016 22:13Она в любом случае будет уменьшаться. Всего 2 АЦП по 4.5 MSPS каждый. Сейчас они поочерёдно меряют один канал — получаю 9 MSPS.
Если ими мерить 2 канала одновременно — будет 4.5 MSPS на каждом.
Больше каналов — ещё меньше преобразований для каждого.
До синхронизации со вторым МК мне ещё очень далеко.GarryC
01.02.2016 10:55Все таки не очень понимаю, откуда 4.5, вроде в даташите везде 0.9 фигурирует, или это при разгоне камня и уменьшении делителя? Но тогда точность не гарантирована?
joker-zzz
Интересно, на каком проценте плат микроконтроллер (штатно max 72 МГц) заведется на 128МГц SYSCLK?
Мелкие платы с МК действительно интересны, не нужно ЛУТом плату с мелким LQFP48 травить, и еще дешево. Плюс из одной такой можно элементарно напаяв пару резисторов получить полный клон STLink V2, задействовать SWD, trace и существенно увеличить удобство работы, например в Keil uVision.
А не задумывались о переходе на более старшее семейство с более высокими частотами?
xedas
У меня в 2 из 2 завёлся. Ещё у кого-то читал положительные отзывы о разгоне этих МК. Мне интересно где у них предел. Множителями его больше не разогнать, но ведь можно вместо кварца 8 МГц поставить 12-16 МГц!
Получить клон STLink V2 из такой платы можно, но бессмысленно. Тот которым я пользуюсь (на фото) сейчас можно купить за $5. Он гораздо удобней, чем если из аналогичной платы делать. SWD я пользуюсь. В первой части про него чуть подробней написал.
К STM32 с более высокими частотами присматривался. STM32F103C8T6 был выбран по одной причине — доступность дешёвых плат на нём. Когда не было уверенности, что я смогу на нём хотя бы мигалку диодом сделать, хотелось чтобы в случае неудачи денег оказалось потрачено поменьше.
Сейчас ситуация такая: я точно знаю, что STM32F103C8T6 хорошо разгоняется и с него можно получить как минимум 9 MSPS. Про разгон других МК я мало что знаю, а в штатных режимах большого преимущества в скорости АЦП перед этим разогнанным у них нет. Вдобавок, чтобы реализовать ещё большую скорость других МК надо и аналоговую часть делать соответствующую… В итоге получается сейчас полезней и интересней довести устройство до ума на этих МК и ОУ.