Продолжение статьи. На этот раз попробуем подключить USB без падения частоты измерений и соберём одноканальную аналоговую часть.
![](https://habrastorage.org/files/e0c/0e8/b75/e0c0e8b759a64d2db4c8d7569bdb60eb.JPG)
В нашем МК есть аппаратный USB. Его очень хотелось использовать. Ещё до покупки хотелось. Но из-за сложностей, он был отложен «на потом». А сложности такие:
В итоге на одном форуме нашёл сконвертированный в Coocox пример, который заработал.
На этом проблемы с нашим USB не закончились. Отдельный переходник USB <-> USART имеет преимущество в том, что он отдельный, а значит его работа не зависит от нашего МК, а именно от:
Когда есть переходник, мы можем всё что угодно делать с МК — переходник при этом будет работать и COM порт в системе никуда не денется.
С разгоном принято такое решение: в обычном состоянии МК работает на штатной частоте. Когда нам надо провести замер, мы разгоняем МК (да, в отличие от AVR он такое умеет прям на ходу), набираем данные, снижаем частоту и потихоньку передаём данные на комп.
Чтобы ничего не переключать после каждой перезагрузки/перепрошивки, смотрим на схему платы:
![](https://habrastorage.org/r/w1560/files/f12/8c9/2c1/f128c92c1de44dc8904015715b418043.png)
Джампером тут один из проводов подтягивается к +3.3 В, и комп видит, что устройство подключено. Опытным путём выяснено, что после перепрошивки МК, чтобы COM порт снова заработал, надо либо выдернуть и снова воткнуть разъём USB либо снять и снова поставить перемычку. Второй вариант автоматизировать гораздо проще. Второй пин разъёма джампера через резистор подключил к ноге МК и после перезагрузки через некоторое время подаю на него высокий уровень. В результате комп думает, что устройство было отключено и снова включено. Тут ещё один момент: если устройство отключить при открытом порте, а потом снова включить, то COM порт появится в диспетчере устройств, но открыть его будет нельзя (я использую Windows 7).
Теперь про разгон. Чтобы работал USB, МК как максимум может работать на таких частотах:
![](https://habrastorage.org/r/w1560/files/5f8/5c9/444/5f85c9444c014d19abf66f8b1db01cc9.png)
А для получения максимум скорости АЦП я его разгоняю до таких:
![](https://habrastorage.org/r/w1560/files/b8d/558/b00/b8d558b002af45f8951f1c7c17128a17.png)
Чтобы изменить множитель PLL, его надо отключить. А когда хоть на мгновение отключается PLL, то тактируемому от него USB это не нравится и приложение на компе в большинстве случаев виснит с открытым портом. После безрезультатного гугления проблемы был найден способ совмещения встроенного USB и разгона:
Не удобно, но ради того, чтобы отказаться от аппаратного переходника USB <-> USART и не потерять при этом 7/16 = 44% скорости оно того стоит.
Всё время до этого я использовал вот эту плату:
![](https://habrastorage.org/r/w1560/files/697/649/e68/697649e6809f4a85a911504630d56d0c.png)
Она удобна когда является основной в устройстве, но подключать её проводами к макетной доске не хочется. Для этого ещё давно была заказана другая плата
![](https://habrastorage.org/r/w1560/files/4c0/bdf/09f/4c0bdf09f0f64779a0a54c2dab2c7c89.png)
которую можно воткнуть в доску или легко впаять в другую плату.
Схему этой платы с трудом удалось найти на форуме.
Несколько впечатлений. В общем, она порадовала. Слева находятся штырьки SWD, каждый контакт подписан и, если бы китайцы не впаяли туда угловой разъём, подписи даже было бы видно и было бы удобней, чем каждый раз смотреть на распиновку JTAG на предыдущей плате. Всё без проблем прошилось, USB появился, но с ним возникла небольшая проблема: линия USBDP наглухо прятянута к +3.3 В резистором. Так что USB получился неотключаемым… пришлось выпаять этот резистор и подпаять линию через резистор к свободной ноге МК.
До этого я работал только с сигналами из диапазона 0 — 3.3В. Причём это не какой-то там плавающий ноль, а земля пришедшая с USB кабелем. Я же хочу чтобы осциллографом можно было как смотреть на форму сетевого напряжения (сотни вольт), так и на ЭКГ (доли милливольт).
Задача в общем-то простая: взять входной диапазон осциллографа и отобразить его к входному диапазону АЦП (0 — 3.3В). Схема придумана вот такая:
![](https://habrastorage.org/r/w1560/files/d08/cdd/de8/d08cddde815d4cc4833a38554cab9f80.png)
R1, R2, R3 — входной делитель. Переводя ноги МК в режим входа или выхода можем изменять коэффициент деления.
R11, R12, R13 — резисторы не инвертирующего усилителя. Коэффициент усиления зависит от состояния ног контроллера.
Были сомнения в том, что можно ли использовать цифровые выходы МК для таких целей. Замер показал, что ток через вывод МК в 3.3 мА уводит вывод на 80 мВ, т. е. сопротивление выхода около 24 Ом. Потенциал висящего в воздухе выхода на 3-4 мВ отличается он земли/питания. Для не особо точной системы результат вполне приемлемый.
Чтобы не угробить частотные характеристики за которые я так боролся, операционник нужен не абы какой, а быстрый. Выбрал AD826. И тут возникли траблы. Кому интересно, можете почитать историю тут и тут. Вкратце: на Ebay продаются поддельные микросхемы.
ОУ нужно двуполярное питание. Для этого понадобилась ещё одна микросхема — LT1054. Схема подключения взята из даташита, поэтому подробно описывать её не буду.
Вспоминая планы из первой части статьи:
понимаю, что выполнил 1, 2 и частично 4-й пункт.
Нужен ли такой девайс в хозяйстве? Ну если сравнивать его с аналоговым С1-117, то по частоте C1-117 его в разы превосходит. Зато тут можно записать сигнал в течении достаточно продолжительного времени и потом не спеша его разглядывать. Так, например, я увидел срабатывание прерывания у моего генератора на Arduino:
![](https://habrastorage.org/r/w1560/files/7bc/d40/c7d/7bcd40c7d8974e0db01f04c5fa919f9e.png)
Если сравнивать с поделками на AVR или звуковой карте, то эта значительно их превосходит по частоте преобразования.
По стоимости компонентов получается:
Всего получается порядка $9 + плата + корпус.
Частота преобразований 9 MSPS позволяет наблюдать сигнал частотой до 1 MHz. За $60 можно купить PC Based осциллограф с лучшими характеристиками, но за получившуюся сумму предложений просто нет.
Однако, самым ценным для меня оказался не сам девайс, а опыт полученный в результате попытки сделать что-то сложнее мигания диодом и с претензией на полезность! Я никогда не был связан с электроникой по работе и, как любитель, могу сказать, что это не сложно. Долго — да. Нужна какая-то функция — начинаешь делать. По пути собираешь много граблей, но в конце концов она получается. И так много раз. Даже в такой, казалось бы, небольшой задаче как эта, так было много раз. Например, сделать двуполярное питание для ОУ у меня получилось только с третьей попытки. Но, если хватит упорства и задача была в принципе реализуемой, то в результате обязательно получится что-то похожее на изначально задуманное!
Внешний вид поделки:
![](https://habrastorage.org/files/e44/1ba/229/e441ba2296a4499fac32f3a560fab1ed.JPG)
Продолжение
Воюем с USB
В нашем МК есть аппаратный USB. Его очень хотелось использовать. Ещё до покупки хотелось. Но из-за сложностей, он был отложен «на потом». А сложности такие:
- У разработчиков USB, видимо, было слишком много времени и интеллекта. Беда в том, что они посчитали, что у всех остальных должно быть их не меньше. Если пытаться разобраться с USB по документации, то это занятие явно не на один день.
- При подключении библиотек постоянно возникали сложности. Как их подключать в проектах Coocox я так и не разобрался.
В итоге на одном форуме нашёл сконвертированный в Coocox пример, который заработал.
На этом проблемы с нашим USB не закончились. Отдельный переходник USB <-> USART имеет преимущество в том, что он отдельный, а значит его работа не зависит от нашего МК, а именно от:
- Частоты (для большей частоты преобразований, МК я разогнал);
- Перезагрузок, которые случаются при перепрошивке.
Когда есть переходник, мы можем всё что угодно делать с МК — переходник при этом будет работать и COM порт в системе никуда не денется.
С разгоном принято такое решение: в обычном состоянии МК работает на штатной частоте. Когда нам надо провести замер, мы разгоняем МК (да, в отличие от AVR он такое умеет прям на ходу), набираем данные, снижаем частоту и потихоньку передаём данные на комп.
Чтобы ничего не переключать после каждой перезагрузки/перепрошивки, смотрим на схему платы:
![](https://habrastorage.org/files/f12/8c9/2c1/f128c92c1de44dc8904015715b418043.png)
Джампером тут один из проводов подтягивается к +3.3 В, и комп видит, что устройство подключено. Опытным путём выяснено, что после перепрошивки МК, чтобы COM порт снова заработал, надо либо выдернуть и снова воткнуть разъём USB либо снять и снова поставить перемычку. Второй вариант автоматизировать гораздо проще. Второй пин разъёма джампера через резистор подключил к ноге МК и после перезагрузки через некоторое время подаю на него высокий уровень. В результате комп думает, что устройство было отключено и снова включено. Тут ещё один момент: если устройство отключить при открытом порте, а потом снова включить, то COM порт появится в диспетчере устройств, но открыть его будет нельзя (я использую Windows 7).
Теперь про разгон. Чтобы работал USB, МК как максимум может работать на таких частотах:
![](https://habrastorage.org/files/5f8/5c9/444/5f85c9444c014d19abf66f8b1db01cc9.png)
А для получения максимум скорости АЦП я его разгоняю до таких:
![](https://habrastorage.org/files/b8d/558/b00/b8d558b002af45f8951f1c7c17128a17.png)
Чтобы изменить множитель PLL, его надо отключить. А когда хоть на мгновение отключается PLL, то тактируемому от него USB это не нравится и приложение на компе в большинстве случаев виснит с открытым портом. После безрезультатного гугления проблемы был найден способ совмещения встроенного USB и разгона:
- Приложение на ПК посылает МК команду на выполнение серии преобразований и сразу же закрывает порт;
- МК ждёт некоторое время (чтобы приложение успело закрыть порт) и отключает подтяжку линии USBDP к +3.3 В;
- МК отключает PLL, меняет множитель с 9 на 16 и снова включает PLL;
- МК проводит серию преобразований запоминая результат;
- МК отключает PLL, меняет множитель обратно с 16 на 9 и снова включает PLL;
- МК включает подтяжку линии USBDP к +3.3 В;
- На ПК через какое-то время снова появляется виртуальный COM порт;
- Приложение на ПК вновь открывает порт и посылает в МК команду на забор результата;
- МК неспеша передаёт результат, приложение строит график.
Не удобно, но ради того, чтобы отказаться от аппаратного переходника USB <-> USART и не потерять при этом 7/16 = 44% скорости оно того стоит.
Берём другую плату
Всё время до этого я использовал вот эту плату:
![](https://habrastorage.org/files/697/649/e68/697649e6809f4a85a911504630d56d0c.png)
Она удобна когда является основной в устройстве, но подключать её проводами к макетной доске не хочется. Для этого ещё давно была заказана другая плата
![](https://habrastorage.org/files/4c0/bdf/09f/4c0bdf09f0f64779a0a54c2dab2c7c89.png)
которую можно воткнуть в доску или легко впаять в другую плату.
Схему этой платы с трудом удалось найти на форуме.
Несколько впечатлений. В общем, она порадовала. Слева находятся штырьки SWD, каждый контакт подписан и, если бы китайцы не впаяли туда угловой разъём, подписи даже было бы видно и было бы удобней, чем каждый раз смотреть на распиновку JTAG на предыдущей плате. Всё без проблем прошилось, USB появился, но с ним возникла небольшая проблема: линия USBDP наглухо прятянута к +3.3 В резистором. Так что USB получился неотключаемым… пришлось выпаять этот резистор и подпаять линию через резистор к свободной ноге МК.
Аналоговая часть
До этого я работал только с сигналами из диапазона 0 — 3.3В. Причём это не какой-то там плавающий ноль, а земля пришедшая с USB кабелем. Я же хочу чтобы осциллографом можно было как смотреть на форму сетевого напряжения (сотни вольт), так и на ЭКГ (доли милливольт).
Задача в общем-то простая: взять входной диапазон осциллографа и отобразить его к входному диапазону АЦП (0 — 3.3В). Схема придумана вот такая:
![](https://habrastorage.org/files/d08/cdd/de8/d08cddde815d4cc4833a38554cab9f80.png)
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:
![](https://habrastorage.org/files/7bc/d40/c7d/7bcd40c7d8974e0db01f04c5fa919f9e.png)
Если сравнивать с поделками на AVR или звуковой карте, то эта значительно их превосходит по частоте преобразования.
По стоимости компонентов получается:
- LT1054 — $0.8;
- плата с контроллером — $4;
- операционник — $3;
- резисторы, конденсаторы, диоды — не более $1.
Всего получается порядка $9 + плата + корпус.
Частота преобразований 9 MSPS позволяет наблюдать сигнал частотой до 1 MHz. За $60 можно купить PC Based осциллограф с лучшими характеристиками, но за получившуюся сумму предложений просто нет.
Однако, самым ценным для меня оказался не сам девайс, а опыт полученный в результате попытки сделать что-то сложнее мигания диодом и с претензией на полезность! Я никогда не был связан с электроникой по работе и, как любитель, могу сказать, что это не сложно. Долго — да. Нужна какая-то функция — начинаешь делать. По пути собираешь много граблей, но в конце концов она получается. И так много раз. Даже в такой, казалось бы, небольшой задаче как эта, так было много раз. Например, сделать двуполярное питание для ОУ у меня получилось только с третьей попытки. Но, если хватит упорства и задача была в принципе реализуемой, то в результате обязательно получится что-то похожее на изначально задуманное!
Внешний вид поделки:
Продолжение