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


Воюем с USB


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

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

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

Когда есть переходник, мы можем всё что угодно делать с МК — переходник при этом будет работать и COM порт в системе никуда не денется.
С разгоном принято такое решение: в обычном состоянии МК работает на штатной частоте. Когда нам надо провести замер, мы разгоняем МК (да, в отличие от AVR он такое умеет прям на ходу), набираем данные, снижаем частоту и потихоньку передаём данные на комп.
Чтобы ничего не переключать после каждой перезагрузки/перепрошивки, смотрим на схему платы:

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

Теперь про разгон. Чтобы работал USB, МК как максимум может работать на таких частотах:

А для получения максимум скорости АЦП я его разгоняю до таких:

Чтобы изменить множитель 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% скорости оно того стоит.

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


Всё время до этого я использовал вот эту плату:

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

которую можно воткнуть в доску или легко впаять в другую плату.
Схему этой платы с трудом удалось найти на форуме.
Несколько впечатлений. В общем, она порадовала. Слева находятся штырьки 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. Схема подключения взята из даташита, поэтому подробно описывать её не буду.

Итог


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

понимаю, что выполнил 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)


  1. joker-zzz
    28.01.2016 20:59
    +1

    Интересно, на каком проценте плат микроконтроллер (штатно max 72 МГц) заведется на 128МГц SYSCLK?
    Мелкие платы с МК действительно интересны, не нужно ЛУТом плату с мелким LQFP48 травить, и еще дешево. Плюс из одной такой можно элементарно напаяв пару резисторов получить полный клон STLink V2, задействовать SWD, trace и существенно увеличить удобство работы, например в Keil uVision.
    А не задумывались о переходе на более старшее семейство с более высокими частотами?


    1. xedas
      28.01.2016 21:39

      У меня в 2 из 2 завёлся. Ещё у кого-то читал положительные отзывы о разгоне этих МК. Мне интересно где у них предел. Множителями его больше не разогнать, но ведь можно вместо кварца 8 МГц поставить 12-16 МГц!

      Получить клон STLink V2 из такой платы можно, но бессмысленно. Тот которым я пользуюсь (на фото) сейчас можно купить за $5. Он гораздо удобней, чем если из аналогичной платы делать. SWD я пользуюсь. В первой части про него чуть подробней написал.

      К STM32 с более высокими частотами присматривался. STM32F103C8T6 был выбран по одной причине — доступность дешёвых плат на нём. Когда не было уверенности, что я смогу на нём хотя бы мигалку диодом сделать, хотелось чтобы в случае неудачи денег оказалось потрачено поменьше.
      Сейчас ситуация такая: я точно знаю, что STM32F103C8T6 хорошо разгоняется и с него можно получить как минимум 9 MSPS. Про разгон других МК я мало что знаю, а в штатных режимах большого преимущества в скорости АЦП перед этим разогнанным у них нет. Вдобавок, чтобы реализовать ещё большую скорость других МК надо и аналоговую часть делать соответствующую… В итоге получается сейчас полезней и интересней довести устройство до ума на этих МК и ОУ.


  1. retrograde
    28.01.2016 20:59

    В чём соль параллельных R1, R2 и R11, R12? Не лучше ли поставить 2-3 нормированных операционника каскадом и читать нужный.

    Хотя я с действительно большими диапазонами не работал.


    1. xedas
      28.01.2016 22:15

      Параллельные резисторы для переключения коэффициентов деления и усиления микроконтроллером. Например, если взять
      R1 = 0.1*R3
      R2 = 0.01*R3
      то сможем выбирать коэффициент деления между 1, 11 и 101 простым переключением состояний выходов МК.
      Лучше ли взять несколько ОУ — не знаю. Может быть, лучше, но дешевле и проще так:

      1. Эти высокочастотные операционники стоят дороже МК за спаренный ОУ, а если осциллограф делать многоканальным, то совсем дорого выйдет;
      2. Помимо самих ОУ к каждому нужна обратная связь, так что в результате количество элементов сильно возрастёт.

      Я не электронщик. Наверняка можно сделать аналоговую часть оптимальней. Предлагайте альтернативные варианты!


      1. retrograde
        28.01.2016 22:27

        >>Лучше ли взять несколько ОУ — не знаю. Может быть, лучше, но дешевле и проще так:

        Обычно операционников по 2 или 4 на кристалле. (судя по фото из прошлой статьи у автора 4).

        Ацп на этом контроллере то-ли 6, то-ли 8 на 10 бит.

        Вопрос цены тут не стоит никак.


        1. xedas
          29.01.2016 00:19

          Операционники сейчас у меня по 2 в корпусе.
          АЦП 2 штуки на 12 бит каждый, 10 каналов.
          Но рассчитаны АЦП на преобразования с частотой 1 MSPS каждый, а работают на 4.5 MSPS и время выборки у них тоже в 4.5 раза меньше, чем должно быть. Поэтому ожидать погрешности в пределах 1 деления тут не стоит.
          Помимо цены не хочется увеличивать сложность монтажа за счёт увеличения количества элементов.

          Было бы здорово посмотреть схему, а то я не понимаю что именно вы предлагаете.


          1. retrograde
            29.01.2016 11:27
            +1

            Забейте. Я тут помозговал, и понял что каскад хорош только на известном максимуме входа. И максимум этот весьма низковольтный.


      1. Konachan700
        29.01.2016 10:13

        Вместо простых резисторов и кучи ножек контроллера лучше поставить регулируемый i2c-резистор. Тогда диапазон будет широченным и все это будет управляться программно.


        1. retrograde
          29.01.2016 11:24

          Тоже об этом подумал. Управление на обратке рулит.


          1. retrograde
            29.01.2016 11:30

            Хотя тут лучше входным.


  1. golf2109
    28.01.2016 22:04

    желательно довести до ума проект с рисовалкой графика, совсем непонятно номер СОМ порта и его параметры и назначение кнопок button1 & button2


    1. xedas
      28.01.2016 22:22

      Да. Там много чего ещё до ума доводить. Оно пока в стадии «О! Клёво! Заработало!». Но если рисовалка ещё более-менее понятна из кода (его там не много), то в коде прошивки вообще пока что хлам.


  1. kalbasa
    28.01.2016 22:24

    в первой статье прочитал что выгружаете записанные данные в компьютер. USART HMI не рассматривали в качестве идеи о портативном осциллографе?
    www.itead.cc/display/nextion.html


    1. xedas
      28.01.2016 22:36

      Для себя не рассматривал потому что:

      1. Экран компа/ноута больше, качественней и, самое главное, есть (бесплатен);
      2. Писать программу для ПК проще чем для МК;
      3. На текущем этапе очень не хочется подключать дополнительные железки.

      Может быть, через некоторое время появится интерес к таким экранам, но не сейчас.


  1. gleb_l
    28.01.2016 22:31
    +2

    Что-то мне кажется, что при программном выборе коэффициента деления входного усилителя показанным способом а) в цепь сигнала насосется много шума с цифровой земли и б) потребуется ВЧ-коррекция получившегося делителя — см, например, здесь. Лучше уж герконовыми реле.

    PS — за полезную инфу о workaround'ах c PLL и USB — спасибо!


  1. HWman
    29.01.2016 09:43
    +1

    image

    Очень элегантное решение, спасибо большое.


  1. obsolete
    29.01.2016 11:28

    На всякий случай. Опытным путём установлено, что диапазон измерения у АЦП STM32 не до 3,3, а только до 3 В.
    По крайней мере, на нулевой, сотой и трёхсотой сериях так.


  1. olekl
    29.01.2016 13:06

    Вместо двуполярного питания можно же использовать однополярное и подтянуть сигнал к середине.


    1. xedas
      29.01.2016 18:02

      Можно. Вначале я так и делал, но потом отошёл от этого потому что:

      1. Быстрые ОУ из тех что я видел, требуют достаточно большого напряжения питания, а при малом напряжении питания у них ухудшаются частотные характеристики. Тот же AD826 может работать начиная с напряжения питания в 5 В, а с платки я могу получить максимум 4.2В (замерял).
      2. ОУ плохо умеют притягивать выход к питанию. Если мы сделаем -Vs = 0В и +Vs = 5 В, то на выходе сможем получить напряжение от 1.5 В до 3.5 В (согласно даташиту) и не сможем использовать весь диапазон АЦП.

      Хотя, конечно, идея отказаться от источника двуполярного питания выглядит очень заманчиво.


  1. svitoglad
    29.01.2016 15:56

    Есть в планах сделать 2 канала?


    1. xedas
      29.01.2016 18:12

      Есть! Причём т.к. АЦП в МК физических два, то можно оба канала выбирать одновременно. А если по очереди замерять, то можно количество каналов вообще до 10 довести. Насколько я понял из документации, МК может без участия программы сканировать нужные каналы и складывать данные в буфер.


      1. svitoglad
        29.01.2016 21:52

        Когда мерять по очередно то частота выборки уменьшится. На мой взгляд если нужно больше 2- х каналов то неплохо бы предусмотреть внешнюю синхронизацию и поключить еще один микроконтроллер.


        1. xedas
          29.01.2016 22:13

          Она в любом случае будет уменьшаться. Всего 2 АЦП по 4.5 MSPS каждый. Сейчас они поочерёдно меряют один канал — получаю 9 MSPS.
          Если ими мерить 2 канала одновременно — будет 4.5 MSPS на каждом.
          Больше каналов — ещё меньше преобразований для каждого.

          До синхронизации со вторым МК мне ещё очень далеко.


          1. GarryC
            01.02.2016 10:55

            Все таки не очень понимаю, откуда 4.5, вроде в даташите везде 0.9 фигурирует, или это при разгоне камня и уменьшении делителя? Но тогда точность не гарантирована?