STM32F103C8T6 — первые шаги. Продолжаем делать осциллограф

Продолжение статьи. На этот раз попробуем подключить USB без падения частоты измерений и соберём одноканальную аналоговую часть.
e0c0e8b759a64d2db4c8d7569bdb60eb.JPG

Воюем с USB


В нашем МК есть аппаратный USB. Его очень хотелось использовать. Ещё до покупки хотелось. Но из-за сложностей, он был отложен «на потом». А сложности такие:

  • У разработчиков USB, видимо, было слишком много времени и интеллекта. Беда в том, что они посчитали, что у всех остальных должно быть их не меньше. Если пытаться разобраться с USB по документации, то это занятие явно не на один день.
  • При подключении библиотек постоянно возникали сложности. Как их подключать в проектах Coocox я так и не разобрался.


В итоге на одном форуме нашёл сконвертированный в Coocox пример, который заработал.

На этом проблемы с нашим USB не закончились. Отдельный переходник USB <-> USART имеет преимущество в том, что он отдельный, а значит его работа не зависит от нашего МК, а именно от:

  • Частоты (для большей частоты преобразований, МК я разогнал);
  • Перезагрузок, которые случаются при перепрошивке.


Когда есть переходник, мы можем всё что угодно делать с МК — переходник при этом будет работать и COM порт в системе никуда не денется.
С разгоном принято такое решение: в обычном состоянии МК работает на штатной частоте. Когда нам надо провести замер, мы разгоняем МК (да, в отличие от AVR он такое умеет прям на ходу), набираем данные, снижаем частоту и потихоньку передаём данные на комп.
Чтобы ничего не переключать после каждой перезагрузки/перепрошивки, смотрим на схему платы:
f128c92c1de44dc8904015715b418043.png
Джампером тут один из проводов подтягивается к +3.3 В, и комп видит, что устройство подключено. Опытным путём выяснено, что после перепрошивки МК, чтобы COM порт снова заработал, надо либо выдернуть и снова воткнуть разъём USB либо снять и снова поставить перемычку. Второй вариант автоматизировать гораздо проще. Второй пин разъёма джампера через резистор подключил к ноге МК и после перезагрузки через некоторое время подаю на него высокий уровень. В результате комп думает, что устройство было отключено и снова включено. Тут ещё один момент: если устройство отключить при открытом порте, а потом снова включить, то COM порт появится в диспетчере устройств, но открыть его будет нельзя (я использую Windows 7).

Теперь про разгон. Чтобы работал USB, МК как максимум может работать на таких частотах:
5f85c9444c014d19abf66f8b1db01cc9.png
А для получения максимум скорости АЦП я его разгоняю до таких:
b8d558b002af45f8951f1c7c17128a17.png
Чтобы изменить множитель PLL, его надо отключить. А когда хоть на мгновение отключается PLL, то тактируемому от него USB это не нравится и приложение на компе в большинстве случаев виснит с открытым портом. После безрезультатного гугления проблемы был найден способ совмещения встроенного USB и разгона:

  1. Приложение на ПК посылает МК команду на выполнение серии преобразований и сразу же закрывает порт;
  2. МК ждёт некоторое время (чтобы приложение успело закрыть порт) и отключает подтяжку линии USBDP к +3.3 В;
  3. МК отключает PLL, меняет множитель с 9 на 16 и снова включает PLL;
  4. МК проводит серию преобразований запоминая результат;
  5. МК отключает PLL, меняет множитель обратно с 16 на 9 и снова включает PLL;
  6. МК включает подтяжку линии USBDP к +3.3 В;
  7. На ПК через какое-то время снова появляется виртуальный COM порт;
  8. Приложение на ПК вновь открывает порт и посылает в МК команду на забор результата;
  9. МК неспеша передаёт результат, приложение строит график.


Не удобно, но ради того, чтобы отказаться от аппаратного переходника USB USART и не потерять при этом 7/16 = 44% скорости оно того стоит.

Берём другую плату


Всё время до этого я использовал вот эту плату:
697649e6809f4a85a911504630d56d0c.png
Она удобна когда является основной в устройстве, но подключать её проводами к макетной доске не хочется. Для этого ещё давно была заказана другая плата
4c0bdf09f0f64779a0a54c2dab2c7c89.png
которую можно воткнуть в доску или легко впаять в другую плату.
Схему этой платы с трудом удалось найти на форуме.
Несколько впечатлений. В общем, она порадовала. Слева находятся штырьки SWD, каждый контакт подписан и, если бы китайцы не впаяли туда угловой разъём, подписи даже было бы видно и было бы удобней, чем каждый раз смотреть на распиновку JTAG на предыдущей плате. Всё без проблем прошилось, USB появился, но с ним возникла небольшая проблема: линия USBDP наглухо прятянута к +3.3 В резистором. Так что USB получился неотключаемым… пришлось выпаять этот резистор и подпаять линию через резистор к свободной ноге МК.

Аналоговая часть


До этого я работал только с сигналами из диапазона 0 — 3.3В. Причём это не какой-то там плавающий ноль, а земля пришедшая с USB кабелем. Я же хочу чтобы осциллографом можно было как смотреть на форму сетевого напряжения (сотни вольт), так и на ЭКГ (доли милливольт).
Задача в общем-то простая: взять входной диапазон осциллографа и отобразить его на входной диапазон АЦП (0 — 3.3В). Схема придумана вот такая:
d08cddde815d4cc4833a38554cab9f80.png
R1, R2, R3 — входной делитель. Переводя ноги МК в режим входа или выхода можем изменять коэффициент деления.
R11, R12, R13 — резисторы не инвертирующего усилителя. Коэффициент усиления зависит от состояния ног контроллера.

Были сомнения в том, что можно ли использовать цифровые выходы МК для таких целей. Замер показал, что ток через вывод МК в 3.3 мА уводит вывод на 80 мВ, т. е. сопротивление выхода около 24 Ом. Потенциал висящего в воздухе выхода на 3–4 мВ отличается он земли/питания. Для не особо точной системы результат вполне приемлемый.

Чтобы не угробить частотные характеристики за которые я так боролся, операционник нужен не абы какой, а быстрый. Выбрал AD826. И тут возникли траблы. Кому интересно, можете почитать историю тут и тут. Вкратце: на Ebay продаются поддельные микросхемы.

ОУ нужно двуполярное питание. Для этого понадобилась ещё одна микросхема — LT1054. Схема подключения взята из даташита, поэтому подробно описывать её не буду.

Итог


Вспоминая планы из первой части статьи:

  1. Победить USB, чтобы отказаться от преобразователя USB <-> USART;
  2. Доделать аналоговую часть, чтобы диапазон входных напряжений был не 0 — 3.3 В, а более приличным;
  3. Сделать многоканальный режим;
  4. Реализовать управление с ПК;
  5. Сделать законченное устройство в корпусе;


понимаю, что выполнил 1, 2 и частично 4-й пункт.

Нужен ли такой девайс в хозяйстве? Ну если сравнивать его с аналоговым С1–117, то по частоте C1–117 его в разы превосходит. Зато тут можно записать сигнал в течении достаточно продолжительного времени и потом не спеша его разглядывать. Так, например, я увидел срабатывание прерывания у моего генератора на Arduino:
7bcd40c7d8974e0db01f04c5fa919f9e.png

Если сравнивать с поделками на AVR или звуковой карте, то эта значительно их превосходит по частоте преобразования.
По стоимости компонентов получается:

  • LT1054 — $0.8;
  • плата с контроллером — $4;
  • операционник — $3;
  • резисторы, конденсаторы, диоды — не более $1.


Всего получается порядка $9 + плата + корпус.
Частота преобразований 9 MSPS позволяет наблюдать сигнал частотой до 1 MHz. За $60 можно купить PC Based осциллограф с лучшими характеристиками, но за получившуюся сумму предложений просто нет.

Однако, самым ценным для меня оказался не сам девайс, а опыт полученный в результате попытки сделать что-то сложнее мигания диодом и с претензией на полезность! Я никогда не был связан с электроникой по работе и, как любитель, могу сказать, что это не сложно. Долго — да. Нужна какая-то функция — начинаешь делать. По пути собираешь много граблей, но в конце концов она получается. И так много раз. Даже в такой, казалось бы, небольшой задаче как эта, так было много раз. Например, сделать двуполярное питание для ОУ у меня получилось только с третьей попытки. Но, если хватит упорства и задача была в принципе реализуемой, то в результате обязательно получится что-то похожее на изначально задуманное!

Внешний вид поделки:
e441ba2296a4499fac32f3a560fab1ed.JPG
Рисовалка графика на С#
Проект в CooCox — прошивка МК

© Geektimes