STM32F103C8T6 — первые шаги. Продолжаем делать осциллограф
Продолжение статьи. На этот раз попробуем подключить USB без падения частоты измерений и соберём одноканальную аналоговую часть.
Воюем с 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 — прошивка МК