Собственные примеры проектов на К1948ВК018

ejsanyo

Active member
Что-ж, не пора ли нам немного поделиться своими наработками?
И начну, как обычно, с себя. Сделав что-то вроде автоматического тестера для плат, идущих в один из наших серийных приборов.
В общих чертах, имеется некая загадочная плата, состоящая из двух полностью гальванически развязанных каналов ЦАП с выходом по постоянному напряжению +/- 10В или току +/-20 мА, как выберем. Но сигналы в обоих каналах всегда одинаковые и синхронно изменяющиеся. Вход у платы - SPI с каналом, собственно, ЦАП и каналом управления типом выхода. Результат, выдаваемый этой платой, надо промерить с довольно высокой точностью (хотя бы 0,05%) и сообщить удивлённой тётеньке-наладчице, соответствует ли результат допустимой для платы погрешности, или нет.
Для реализации поставленной задачи мы имеем на описываемой приспособе:
  1. Собственно, наш знаменитый К1948ВК018 с обвесом;
  2. SPI флешку к нему, дабы не ютиться неоптимизированным RISC-V кодом в рамках встроенных 8кБ;
  3. JTAG-разъём, условно повторяющий распиновку USB Blaster-а;
  4. Достаточно точный двухканальный АЦП, способный перемолотить двухполярные сигналы с платы обратно в цифру. Подключенный через SPI (на тестируемую плату вводится, по сути, этот же SPI, только с другими SS_out);
  5. I2C EEPROM небольшой ёмкости, чтобы хранить калибровочные коэффициенты и прочие настройки. Знаю, вы для этого отвели бы сектор в основной флэхе, ну да ладно;
  6. Разъём "маму" стандарта DIN41612, чтобы втыкать тестируемую плату во всё это безобразие;
  7. Оптореле, чтобы переключать входы АЦП в режим или входа по напряжению, или по току. Разницы между режимами почти нет, упрощённо говоря, немного меняется входное сопротивление;
  8. ЖК экран текстовый скучный чёрно-белый "16x2". Подключенный, конечно, через старый добрый параллельный интерфейс. Подсветкой тоже можно помигать;
  9. Электромагнитную бибикалку, висит на выходе ШИМ Таймера 16_0;
  10. Пару кнопок для взаимодействия со счастливым пользователем;
  11. UART в виде более-менее типичного COM-порта, чтобы, например, смотреть логи происходящего;
  12. Блок питания, толстый, трансформаторный, с паровозным КПД чистейшими выходными напряжениями.
В жизни это всё пока выглядит как-то так:

Ах да, ещё кое-что: вот здесь можно скачать все файлы проекта платы в Altium Designer 10.
 
Последнее редактирование:

ejsanyo

Active member
Сразу сделаю некоторые комментарии:
  • Как несложно заменить, "Амур" сидит на основной плате не голью, а через плату-переходник из моего первого поста. Поэтому часть компонентов его обвеса на основной схеме как бы отсутствует. В архиве проекта есть дополнительная папка под названием "На_мелкой_плате", где я разрисовал, собственно, всё, что распаял на нём.
  • C21, C24, C25, C26 включены таким забавным образом по причине, о которой говорилось здесь. Я в 21 веке лучше уж так наддам пресловутого ESR, чем поставлю алюминий такой мелкой (для него) ёмкости.
  • В роли АЦП здесь выступает популярный сигма-дельта AD7792 MS5192 на встроенной опоре и смещении по IN- активного в текущий момент канала. Для наших целей его метрологии должно хватить, особенно после калибровки входов на "взрослом" калибраторе. Кстати, отличий в работе кетайца от рассого ADi замечено не было, что на этой плате, что раньше (в нашей серийной продукции).
  • Мир 3,3В и 5В логики здесь у нас сшивается с помощью открыто-стокового конвертера TXS0108 RS0108 для ЖК и небольшим "лайфхаком" с 74xCTлогикой. Как вы, разумеется, помните, её уровень лог.1 соответствует классическим ТТЛ-параметрам, т.е. в аккурат немного ниже КМОП-овских 3,3В. Любопытно кстати, что весь цивилизованный мир, вроде как, уже давно снял 74ACT34 с производства, а вот белорусы пока что не сдаются!
  • В жизни флешкой там впаян не Winbond, а EN25Q80B, выпаянная когда-то из раздолбанной кетайской бытовухи. Серьёзно. Что, впрочем, не мешает ей прошиваться и стабильно работать. Стандартизация интерфейса своё дело делает!
Да, сразу скажу, что схема проверена, все узлы на ней уже реально работают.
Если возникнет желание задавать вопросы, не стесняйтесь. Попробую ответить.
 
Последнее редактирование:

ejsanyo

Active member
А тем временем, хотя Чудище пока не получило рабочую версию прошивки, но какой-никакой корпус уже есть. :eek:

Что бы ещё сказать: как видно из схемы, обе ноги boot сидят на земле через "нулёвки" R11, R12, так что изначально грузимся мы во встроенную EEPROM. Тем не менее, основная прошивка, конечно, во внешней флешке, а в EEPROM я закинул bootloader из примера, который шёл с "Mikron IDE", предварительно слегка его пообрезав (выкинул код, мигающий светодиодами). Это, конечно, не то, к чему хотелось бы стремиться, но хотя бы позволяет коду из флешки выполняться с максимально возможной(?) для данной платформы скоростью.
 

cryptozoy

Member
Последнее редактирование:

ejsanyo

Active member
Али это, всё же знаете, такое себе... 🥴 Скорее всего повезёт, но могут прислать, например, перемаркированную более дешёвую флэху. Или вообще нерабочую пустышку. И вообще, не факт, что до вас доедет. Посему я стараюсь связываться с более официальными поставщиками.
 

ejsanyo

Active member
В процессе работы с этой своей поделкой заметил довольно неприятную вещь: при включении питания контроллер запускался не всегда, нет-нет, да зависнет. Пробовал включить вочдог - не спасает, похоже, всё подвисает до его инициализации. Пробовал активировать BOR, тоже ничего не даёт. Пришлось позвать на помощь иноагента ADM809TART. Нахлобучил его на плату следующим образом: GND на землю, Vcc на 3,3В, выход - прямо на вход Reset контроллера (нога 14). И с этого момента - ни единого зависания, как я не пытался дёргать питанием.
Я, конечно, вижу, что на готовых платах-отладках Reset на плюс подтягивается через резюк в 100 кОм, а у меня через 10, так что постоянная времени RC-цепочки в 10 раз меньше. Но значит, получается, встроенная схема "POR и BOR" сама по себе не обеспечивает требуемой длительности формирования импульса сброса (кстати, а какой она должна быть)? Не было ли с этим проблем в ваших проектах?
 

Caleb

New member
На мик-32 "Амур" у меня нет проектов потому, что у нас в магазинах его нет, а по почте заказывать - неизвестно, что придет. Пока работаю на avr, в частности на супермаленьком attiny15. Строил на нем свой импульсный блокиш. По обратной связи принимал им в ацп выходной вольтаж и в соответствии с ним выдавал нужный ШИМ-сигнал для открывания транзистора-ключа. И еще один мой неоконченый проект на контроллере - это гитарка, на которой можно играть двумя руками, а контроллер - по датчикам натяжения струн автоматически цепляет нажатые струны. Правда этот проект я пока подзабросил - не получается разобраться с закольцеванием процесса: после того как шаговый двигатель медиатором зацепит струну, опять срабатывает датчик и контроллер вновь хочет дергать эту струну и т.д.
 

ejsanyo

Active member
В процессе работы с приспособой выявился ещё один любопытный нюанс: с некоторыми экземплярами "загадочных плат" она работает стабильно и хорошо. А с некоторыми - ЦАП периодически сходит с ума и выставляет не то, что нужно. Выяснил, проблема в том, что вход ЦАП-а ловит "звон" на фронтах импульсов SCK. А он возникает: выходы у 74ACT достаточно мощные и быстрые, чтобы давать крутые фронты импульсов, а провода до платы у меня длинные-предлинные, можно увидеть это по фотографии. Вот мы и получаем "длинную линию с распределёнными параметрами" - длинный абы как проложенный проводок начинает "звенеть" на резонансной частоте затухающими колебаниями от ударного возбуждения. А микросхема ЦАП-а недостаточно умна, чтобы отличить эти паразитные колебания от настоящих тактовых импульсов интерфейса. Причём немного необычен тот факт, что если пытаться снизить скорость SPI, то это ничего не даёт, даже становится хуже.
В общем, помогло следующее: порезал печать на выходах DD4:1...DD4:4 и вставил в разрывы резисторы по 1 кОм. Причём резал печать прямо у самых выходов буфера, если это делать где-то посередине линии, то может не помочь.
К чему всё это рассказываю, если непосредственно к контроллеру это отношения не имеет? А вот, если будете проектировать схемы с SPI-подобным интерфейсом, то и у вас такая проблема может возникнуть. И теперь вы знаете, как с этим бороться.
 

Caleb

New member
А как вы это обнаружили эти помехи? Можно ли без осциллографа? По идее если помеха очень краткая, то даже так тяжело поймать.
 

ejsanyo

Active member
А как вы это обнаружили эти помехи?
Элементарно, Ватсон. 🕵️‍♂️ Во-первых, я уже с таким сталкивался ранее, хоть и на иных дискретных линиях передачи данных, гора-аздо длиннее этой. Во-вторых - логика: вижу, что с каждой посылкой от приспособы АЦП по выходу даёт значения напряжения стабильно, но кривые и с каждой посылкой немного разные, хотя я передаю такие отсчёты, которые должны выдавать ровные значения (а'ля 0,25В, 0,5В...). При этом значение, соответствующее 0В (т.е. код 0x0000) всегда и чётко отрабатывается на всех платах (ну конечно, если выход MOSI постоянно 0, как криво его ни проклокивай, ничего, кроме нуля, всё равно не выйдет). В третьих, беру, значит, в руки пластмассовый кондёр К10-17А (чтобы пальцами ёмкости и утечек, по возможности, не добавлять) на 100 пФ и тыкаю его прямо на работающей "загадочной плате" по интерфейсным линиям. Другая нога кондёра, естественно, прижата на GND на этой же плате и совсем рядом. Как только в ногу SCK ЦАП-а ткнул - всё стало хорошо и стабильно. И тут уже, по моему, всё становится понятно.
 

cryptozoy

Member
Али это, всё же знаете, такое себе... 🥴 Скорее всего повезёт, но могут прислать, например, перемаркированную более дешёвую флэху. Или вообще нерабочую пустышку. И вообще, не факт, что до вас доедет. Посему я стараюсь связываться с более официальными поставщиками.
Поиск "W25Q128FVS" в «ЧИП и ДИП»
 
Последнее редактирование:

Евгений

New member
У меня явных зависаний пока не происходило. Только если из-за официального загрузчика - который шьется в ЕЕПРОМ.
Что по проекту - дорабатываю модуль входов выходов. Там на проце висит дисплей SS1306, используется RS485 с модбасом, ну и 8 входов/выходов. Один из который АЦП, другой ЦАП (пока для тестов). Мой самодельный ПЛК с визуальным редактором LADDER запустился, но частоты не хватает - тормозит. Поэтому было принято решение использовать этот процессор для модуля удаленного управления входами/выходами. Эхх жаль хороший получился бы проект. Но нашу фирму прикрывают, так что довести проект до логического конца мне не получится. Возможно позже выложу какие то наработки по библиотекам на данный проц.
 

ejsanyo

Active member
Ну а пока что я рад представить вашему вниманию новую самоделку. Назовём её условно..."Глупый вольтамперметр". 🙃 Почему "глупый"? Потому что она, по сути, делает то же самое, что и вот такой копеечный кетайский приборчик:


И делает это примерно с такими же возможностями. На его основе был сделан вот такой вот "условно лабораторный" источник питания для технологических нужд:

Но расскажем по порядку, что же делает это чудо:
  • Питается от источника постоянного тока 24 или 27В. Хотя, в принципе, физически работоспособно где-то от 8 до 40В.
  • Через делитель измеряет это самое напряжение по одному аналоговому входу встроенного АЦП. Используя в работе встроенный же ИОН. Пересчитывает отсчёты АЦП в вольты.
  • С помощью специального датчика Холла из серии MT9523CTизмеряет проходящий во внешнюю нагрузку ток другим каналом АЦП. Ну да, как ни крути, куда-ж без Кетая? 🇨🇳
  • Третьим каналом АЦП измеряет калибровочный уровень нулевого сигнала MT9523. Поскольку сигналы с чипа превышают уровень встроенного ИОН-а, разумеется, на входы пришлось поставить резистивные делители.
  • Пересчитывает "токовые" отсчёты в амперы, с учётом нулевой точки. Побочный эффект этого - возможность двухполярного измерения тока, здесь не востребован.
  • Выводит вольты и амперы на пару светодиодных модулей на основе TM1637. Что там выше говорилось про Кетай?
  • В довесок, пишет на дисплее слово "OVFL.", если сигналы тока/напряжения превышают уровень, который нормально обрабатывается АЦП и, что даже важнее, датчиком тока.
Чтобы долго не томить, вот полностью архив проекта, схемы в Altium Designer 10, но есть и порт в pdf. Как и в прошлый раз, часть элементов стоит на "плате-переходнике". А какие именно - приводится отдельно в папке "На_мелкой_плате". Разводку основной платы, пожалуй, приводить не буду, ибо она ужасна, да ещё и корректировалась впоследствии МГТФ-ами :poop::

Уверен, если надо, вы сделаете гораздо изящнее.
 

ejsanyo

Active member
А теперь а том, что нам не удалось сделать в данном проекте:
  • Без кварцев почему-то не захотел работать watchdog.
  • Надеялся, что удастся задействовать каким-либо, хоть "костыльным" образом аппаратный I2C, чтобы порулить TM1637. Поэтому на схеме даже порты подписаны как "I2C". Да, казалось бы, на физическом уровне "кетайский протокол связи" TM1637 в целом похож на I2C. Только биты прокачиваются от младшего к старшему. Соответственно, если их инвертировать в прошивке, всё должно работать. И это действительно работает, но на I2C модулях попроще, в которых есть просто регистр на передачу/приём, а весь остальной уровень (разбивка на адрес, на данные) реализуется на уровне прошивки. Например, так есть на АтМегах или на контроллерах Миландра. Но не здесь. :censored: Здесь отдельные биты регистра хранят 7 (ну или 10) бит адреса, а последний бит r/w выставляется аппаратно. Так что, похоже, нельзя просто так взять и отправить "псевдо-адрес" с последним битом равным 1, а после него сразу же какие-то данные. А это необходимо, поскольку чип принимает данные только после команды "установить адрес", у которой последний бит всегда равен 1! В этом плане их более позднее изделие TM1650 имеет "условную совместимость" с I2C получше.
 

ejsanyo

Active member
Ещё пару слов про индикаторы на TM1637:
В итоге, когда всё это окончательно стало понятно, пришлось делать с ним связь более "традиционно" - с помощью программного "ногодрыга". :whistle: Ну по крайней мере задержки у нас реализуются при помощи таймера 16 в режиме однократного запуска. А раз так, то становится понятно, что анализировать бит подтверждения, который выдаёт TM1637 в конце байта, не обязательно, а значит, можно сделать связь с ним односторонней, сделав "более глупый" согласователь уровней логики 3,3 -> 5В. Что такая операция в принципе желательна, мы выяснили немного ранее. И делаем мы это при помощи буферных элементов с открытым коллектором SN74LS07 (советский аналог был бы К555ЛП9, но не уверен что именно в ТТЛШ версии он существовал). Забавный факт, что старая ТТЛ логика прекрасно работает с 3,3В выходными уровнями современных КМОП чипов, поскольку порог единицы там как раз на уровне пары с чем-то вольт.
Можно заметить, что частота CLK для модулей индикаторов сделана всего 2,5 кГц. И это значение превышать просто так я не рекомендую из-за того, что разработчики модуля на линии интерфейса повесили кондёры довольно большой ёмкости, 0,1 мкФ. Можно их отпаять и значительно ускорить интерфейс, но без необходимости, наверно, делать этого не стоит: я часто замечал, что без этих кондёров TM1637 могут сглючить и погаснуть от наводок и импульсных помех. Так что не просто так они их туда ставят. :unsure:
 
Последнее редактирование:

Евгений

New member
Ещё пару слов про индикаторы на TM1637:
В итоге, когда всё это окончательно стало понятно, пришлось делать с ним связь более "традиционно" - с помощью программного "ногодрыга". :whistle: Ну по крайней мере задержки у нас реализуются при помощи таймера 16 в режиме однократного запуска. А раз так, то становится понятно, что анализировать бит подтверждения, который выдаёт TM1637 в конце байта, не обязательно, а значит, можно сделать связь с ним односторонней, сделав "более глупый" согласователь уровней логики 3,3 -> 5В. Что такая операция в принципе желательна, мы выяснили немного ранее. И делаем мы это при помощи буферных элементов с открытым коллектором SN74LS07 (советский аналог был бы К555ЛП9, но не уверен что именно в ТТЛШ версии он существовал). Забавный факт, что старая ТТЛ логика прекрасно работает с 3,3В выходными уровнями современных КМОП чипов, поскольку порог единицы там как раз на уровне пары с чем-то вольт.
Можно заметить, что частота CLK для модулей индикаторов сделана всего 2,5 кГц. И это значение превышать просто так я не рекомендую из-за того, что разработчики модуля на линии интерфейса повесили кондёры довольно большой ёмкости, 0,1 мкФ. Можно их отпаять и значительно ускорить интерфейс, но без необходимости, наверно, делать этого не стоит: я часто замечал, что без этих кондёров TM1637 могут сглючить и погаснуть от наводок и импульсных помех. Так что не просто так они их туда ставят. :unsure:

А чем уже известный датчик тока ACS712 плох ? И он более доступен) Глянул ваш MT9523 - кроме как Китая его нигде не купить. Я в своих проектах обычно для согласования уровней пользую обычный полевой транзистор и два резистора - все работает в обе стороны. Модуль на TM1637 не подключал к АМУРУ поэтому сказать ничего не могу. Хотя в наличии он у меня имеется. Надо будет потом попробовать.)
SSD1306 по I2c работает нормально, но там да протокол немного другой.
 

ejsanyo

Active member
А чем уже известный датчик тока ACS712 плох ?
Собсно, ничем. У ACS712 есть настраиваемый фильтр, а у китайцев - выход нулевой опоры. Но в целом можно считать, что это практически то же самое, только от Allegro. А насчёт доступности, скажем, так, у всех ситуация разная.💹
На полевике схема известная, я кое-где тоже использовал. Теперь правда чаще ставлю специальные чипы серии TXS серии RS, внутри которых практически то же самое, но плюс есть какие-то "цепи, ускоряющие фронты импульсов". Разумеется, это имеет значение только на достаточно быстрых скоростях обмена. Был у меня ещё случай, когда подобный чип, нагруженный на большую ёмкость, превратился в "генератор", но всего один раз, и, возможно, я там плохо развёл землю.
А почему бы не работать SSD1306? У него вполне стандартный I2C интерфейс, не то что у этих.
 
Сверху