Самодельная Мега2560, 128А с памятью 512кб

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Тема поднята и перенесена в проекты, поскольку проект вышел на "финишную прямую"

Поскольку "так получилось", что мой дитенок остался с последней полупаленой Наной, то заказал 2 микросхемы ATmega2560-16au (уже едут) и у коллеги тоже уже едет 5шт ATmega128A, а в наличии уже лежит 5 комплектов для изготовления блока расширения внутренней памяти до 512кб и к комплектам уже тоже есть готовая схема (пока только отрисована) .. то решился взяться за изготовления своей платы. В связи с чем возникли "муки творчества", которые надеюсь тут мне помогут преодолеть. И так:

1. Что лучше проектировать:

а) полные платы с USB-адаптером, стабилизатором и памятью по типу полноценных "ардуино" плат или "микро" варианты по типу "мини", "микро", "нано" и делать отдельные блоки стабилизатора, памяти, адаптера USB? На пробу развел мини-вариант платы для AtMega128A .. для размера проводников 0.38мм получается не такой уж и "мелкий" размер: 50х50мм. только кристалл с минимальной обвязкой, кнопкой ресет и разъемами.. делать проводники тоньше - по опыту лично мне будет сложно их протравить и потом сделать плату.. (где-то они конечно и тоньше..)

б) стоит ли на Atmega128A добавлять "расширительный" функционал, типа HC595, PCF8574 (+8 пинов по I2C), CD4051 (+8 аналоговых входов к примеру), PCA9685, TLC5940 (+16 12-bit PWM Controller I2C/SPI), особенно учитывая тот факт, что 128-я мега имеет ограниченный функционал и все ноги "расписаны" на доп. функции, а то и не по разу.. или его можно запроектировать "потом" как дополнение?

в) учитывать ли при проектировании "развитие" в том смысле, что платы 128-й и 2560-й мег делать совместимыми снизу-вверх по местоположению разъемов или "оно того не стоит"?

2. Комплектация плат помимо памяти:

а) для наших целей управления и построения разных роботов, весьма полезно воткнуть на плату сразу же драйвера моторов не менее 4шт (тут есть целая тема, есть уже опробованные варианты и их разводки)

б) гироскоп (есть GY-521) + гирокомпас (есть на MPU6050) + альтиметр (есть BMP-180) .. все это управляется по I2C и можно тоже развести сюда или на "доп. шилд" вместе.

3. Типоразмер .. их каких только нет, но пока как критерий вижу размеры батарейных блоков .. но они тоже есть на базе ААА, АА и Li-ion 18650 .. последний мне все больше кажется предпочтительным (емкость до 3500мач!), но не могу сделать выбор между 2S и 3S вариантами .. есть иные полезные критерии по размеру плат?

4. Стабилизатор, если на плату .. лично мне уже понятно что AMS1117-5.0 не годится никуда, кроме как в маркетинговых целях .. кто, что посоветует? У меня хорошо прижились LM2596, но может кто что знает получше и недорогое?

По стабилизатору есть отдельный вопрос: зачем стандартно использован мосфетный ключ с ОУ для выключения внешнего питания при подключении к USB? разве нельзя сделать "диодное ИЛИ"? Есть какой-то затык?

5. "расширительный шилд" .. по опыту эксплуатации давно оценил что рядом с каждым выводом надо разводить ещё и пару "земля-питание" .. но, можно (и делал так) сделать планки по три ноги и запаять их вертикально в разъем платы, так чтобы выводы выходили наружу горизонтально (тут есть фотки) .. что лучше: увеличить габарит платы и сделать по три вывода на ногу или предусмотреть возможность такого "развития" доп. планками-расширителями?

6. Разводка выводов по сторонам платы. Тут есть пример "ардуино", где они попытались сгруппировать (на большой меге по крайней мере) выводы по функциональному назначению .. есть смысл, у кого какой опыт эксплуатации? Разведя "как получится" можно сэкономить на размерах и/или упростить изготовление ..

P.S. Лично мне интересно изготовление плат, которые потом можно вставлять в Лего без проблем, соответственно типоразмер буду подбирать кратно 4 или 8мм. Пока для себя вижу такой "бутерброд":

1. полноценная плата с МК + с обратной стороны "память";

2. плата с драйверами моторов 4шт (есть разводка и изготовленный вариант "на пробу" по 2 управляющих вывода на мотор;

3. плата с I2C периферией (гироскоп + гирокомпас + альтиметр);

4. плата питания с защитой и балансирной зарядкой Li-ion и дополнительными блоками питания на LM2596 для подключения к расширительным линейкам.

Но, если все это ставить "друг на друга" .. получается высокий "Лего-кирпич", а вместе с батарейками ещё и тяжелый .. есть какие-то идеи на эту тему?

P.P.S. Если все получится удачно, в нагрузку могу отдать готовые инструкции владельцу сайта для выкладывания в раздел "Проекты" (на сам сайт, а не на форум). Думаю он "не обидится". :)

Приглашаю всех заинтересованных к участию и активному обсуждению пока едут камни ..

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

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

И так, схемы расширения SRAM на мегах, имеющих X-ram интерфейс, с конца (кликабельно):

Это последняя версия платы расширения внутреннего ОЗУ (SRAM) мег, у которых есть интерфейс расширения X-RAM: ATmega128A, ATmega64, ATmega640, ATmega1280(1), ATmega2560(1), может есть ещё какие - не интересовался.

Для тех "кто в танке" (не в курсе) - предистория:

Внутренняя оперативная память (ОЗУ или SRAM), та где храним переменные, у семейства Atmel Mega не велика и не превышает 16кб для ATmega1284 кажется (точно не помню), для 328-й (UNO, NANO и пр.) она и вовсе 2 килобайта, для 128-й (Crumbuino) составляет 4кб и для 2560-й (Arduino Mega) - 8кб.

Но, это далеко не всё! Система команд AVR вполне нормально адресует 64килобайта, и, часть МК семейства Мег имеет на внешних ножках 19-и ногий интерфейс X-RAM, который позволяет подключать внешние модули SRAM и использовать все адресное пространство ОЗУ для хранения данных .. т.е. все 64килобайта!

Даташит содержит конкретные указания и регистры МК: что, как и куда подключать и как это использовать, а компилятор GCC и G++ вполне можно настроить (в т.ч и силами boards.txt) на правильное размещение данных по всему адресному пространству МК. В даташитах прямо указываются схемные решения как нарастить ОЗУ до заветных 64 килобайт.

Однако, на рынке что 64кб, что 512кб сейчас стоят по цене корпуса практически одинаково в районе 40-60руб/шт., что явно "не деньги" для решения задачи "где взять место под массивчик?" :)

512кб можно "разделить" на блоки по 64кб - "страницы" или "банки" и использовать по очереди. В сети есть готовое решение, хорошо описано например тут: http://www.rlocman.ru/shem/schematics.html?di=71093, http://www.rlocman.ru/shem/schematics.html?di=71095, http://www.rlocman.ru/forum/showthread.php?t=8519

Недостатков у такого решения 3: требуется использование доп. ножек (3шт + 19ножек интерфейса!) микроконтроллера для переключения банков И банки невидимы одновременно, что затрудняет перенос/копирование/обработку данных, размещенных в разных банках памяти. И третье: в каждом банке по 64кб не возможно использовать младшие адреса, которые совпадают с адресами внутренней SRAM - МК их просто не выдает на шину X-RAM от слова вовсе. Итого имеем для 2560 потерянными по 8 кб на каждом из 8 банков .. итого 64 кб "невидимы"... многовато.

Описание последней версии схемы:

Данный контроллер внешней SRAM делит все адресное пространство МК на 3 зоны:

1) 0..32кб -- обращение всегда идет или к внутренней SRAM МК или к одному и тому же месту внешней SRAM (последние 16кб в каждой половине адресов) .. это "общая страница" из двух частей внешней SRAM;

2) 32..48кб -- в этих адресах можно переключать страницы внешней SRAM по 16кб с абс. адресами 0..256кб. Всего таких страниц 16 с номерами 0..15 (4 бита) и последний номер совпадает с младшей половиной "общей страницы";

3) 48..64кб -- в этих адресах МК можно независимо переключать страницы внешней SRAM с адресами 256..512кб. Аналогично есть 16 страниц и последняя совпадает со старшей частью "общей страницы";

Устранены все недостатки предыдущего решения, а именно: не использовано ни одной дополнительной ноги микроконтроллеров (и так отжимается 19 ног!); при желании можно использовать все 512кб полностью; и можно одновременно видеть 3 разные области внешнего ОЗУ.

Кроме этого, в схему добавлен сигнал EN на шину, позволяющий запрещать работу этого ОЗУ иными устройствами, смаппированными на адреса памяти или нарастить объем ОЗУ далее. А также на внешний интерфейс выведен весь адрес А0..А15, page0..3, что упрощает разработку таких устройств.

.. продолжение следует ..

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Вариант платы с двумя окнами в адресном пространстве: 0..32кб и 32..64кб (управление 15 битом шины адреса - PC7). При обращении к младшим адресам (нижнее окно) всегда доступна последняя страница SRAM №15. При обращении к старшему окну - видим любую страницу 0..15 по 32кб. Сигнал CS памяти разрешен только для страниц 0..15, и при наличии внешнего разрешения. Можно легко наращивать память свыше 512кб .. или использовать старшие 4 бита регистра страниц как расширение ножек.

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

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Передняя (зеркально), задняя стороны платы (.svg под ЛУТ, можно брать прямо отсюда) и схема расположения деталек на плате под последний вариант (пост №2) принципиальной схемы с 3-я окнами доступа. Слой F-silk (расположение деталек - поправил на нормальное расположение).

Размер платы 55.8 х 71.12мм с разводкой контактов под платы "МУРК". Мне пришли в реальности SRAM HM628512AFLP-5, с циклом доступа в 55нсек, что должно надежно хватить в т.ч. и для тактовой 20Мгц для имеющейся платы МУРК-128 (перенесу сюда тоже).

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Плата "МУРК-128" (Мега128 Универсально Расширительный Контроллер :) ) на базе ATmega128a в этом типоразмере (55.8х71.12), переношу сюда тоже:

Аналогично: передняя сторона зеркально, задняя сторона и схема расположения детале, вид сверху. Формат сторон - .svg подготовлен для прямого скачивания отсюда и изготовления ЛУТом. Электрическую схему не привожу, она примитивна и практически кроме типовой обвязки не содержит ничего лишнего. Конденсатор С3 - ставить не нужно .. ошибочка.

Первая рабочая плата. :)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Пока распаиваю модуль SRAM512k3w (512 килобайт с 3 окнами), да едут дисплеи, начал потихоньку разбираться как на этом сделать осцилограф и что из этого выходит.

1. Проверил работу АЦП на повышенных частотах: В общем, на Мега2560 с 16Мгц кварцем, делитель ADPS при установке 1:2 (ADPS=1) на внутреннем опорном 5в и 2.56в - работает вполне нормально и позволяет снимать оцифровку со скоростью 16Мгц/2/13=615 kilo sample/sec. Это даже несколько лучше чем пультоскоп 27Мгц!

На опорном 1.1в - ещё не тестил и точность измерения требует уточнения, но по крайней мере визуально косяков не обнаружено в 8-и битном режиме на плоттере ИДЕ 1.8.2.

Как идею, для ждущей развертки хочу использовать внутренний компаратор, включив его в режиме сравнения выхода АЦП с заданным уровнем.

 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Детальное описание эксперимента с АЦП платы МУРК-2560:

делитель 1:2 в ADCSRA не вырубает АЦП, и тактирует его нормально восемью мегагерцами. Скорость снятия оцифровки из ADCH (8бит) получилась 615 кило сэмплов в сек. Точность оценивал так: 5-й таймер настроил делитель 1:1, режим "FAST-PWM-8bit" и скважность выхода А в 50% (OCCR5A = 128), на этот выход делитель 1:2 из резисторов по 1кОм, и к нижнему прикручен конденсатор на 100нф. в качестве интегратора пилообразного сигнала. Опорное АЦП выставлялось "вн. Vcc" и "внутр. источник 2.56в". Опорное 1.1в - не проверялось.

Визуально, на встроенном в ИДЕ 1.8.2 плоттере сигнал отображается практически ровно и ОДИНАКОВО на всем протяжении в 4096 снятых точек.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Пришли DC-DC регуляторы RT8289 (500кгц, 5А). Разводку и файлы для ЛУТ предыдущего варианта МУРК-2560 поэтому не выкладываю, буду делать вторую версию на этом источнике питания. Возможно придется переставлять разъемы в боковых линейках местами, группируя выходы PWM от таймеров вместе для возможности подачи на них питания от внешнего источника. Входным ногам таймеров - то не надо ни разу.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Перепроверил работу АЦП на повышенных частотах.

Увы, "чудес не бывает". В том смысле, что при увеличении частоты дискретизации АЦП блока .. нет, точность остается в пределах заданных 8 бит, как и велено по даташиту .. но эта "зараза" тупо игнорит такты своей частоты и максимально чего отдает - это около 335 кГц. По крайней мере для Мега2560. Установка делителя 1:2 на самом деле не ускоряет блок АЦП до ожидаемых 16/2/13 = 615кГц результатов. Только чуть больше 300: примерно 5,4 тиков АЦП на период таймера на предельной частоте его работы 16/256=62,5кГц. (на 100 отсчетов АЦП попадает 18.5 периода)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

<del> Предыдущие выводы оказались неверны при "детальном осмотре". :)

И так работа АЦП ATmega2560-16au с кварцем 16Мгц.

1. АЦП нормально функционирует на всех режимах делителя АЦП (ADPS0..ADPS2), в т.ч. на частотах блока АЦП в 8,4,2 Мгц, кроме заявленного в даташит "max 1Mhz". В том смысле, что он пытается снимать показания, а не "вешается наглухо".

2. Съем показаний всегда 10 бит, при любой частоте тактирования АЦП. Иное дело точность этих показаний.

3. Точность АЦП сильно зависит от (в порядке убывания важности, мое ИМХО):
   а) схемотехники подключения выводов - особенно разводка заземления;
   б) стабильности питания блока АЦП и опорного уровня;
   в) наличия сигналов на физически соседних ножках АЦП, например настроенных как "выход";
   г) выходного сопротивления источника сигнала - за это есть даже указание в даташит "не более 10кОм", а лучше менее и значительно;
   д) запрета этой ножки как входа в регистрах DIDRx - подавление шума входной цепи ноги - тоже есть в даташите, но у компаратора;
   е) СКОРОСТИ работы АЦП;
   ж) применение способов шумодава, описанные в даташите;

Некоторые пункты, наверное можно поменять местами, "д,е,ж" мало отличаются друг от друга и вместе с "г" - определяются проблемой переключения мультиплексора с одного входа на следующий и скоростью рассасывания заряда на измерительной ноге АЦП от предыдущего замера. В целом - мультиплексор блока АЦП и есть главный источник проблем быстрого съема точных показаний.

4. Время измерения. Вот тут кроется основная засада расхождения оценки скорости блока и реальности. Дело в том, что в даташит указано расплывчато и в нескольких местах: Цикл замера 13..13.5 тактов, разогрев блока 12 тактов перед первым замером после включения, фиксация результата в зависимости от режима от 0.5 до 1.5 тактов блока АЦП .. плюс(!) плывущее время задержки обнаружения программой факта завершения замера, поскольку АЦП выставляет процу состояния согласно своему тактированию, а проц тактируется своим генератором. Т.е. может пройти ещё в среднем до 1/2 такта АЦП пока до программы допрет что замер завершен. Итого имеем (0..12) + (13..13.5) + (0.5..1.5) + (0..1) = около 15 тактов АЦП на замер.

5. Замер АЦП ведет вполне стабильно, ничего не "пропускается" как писал ранее. Вполне способен вести замеры на 8Мгц тактовой АЦП и теоретически можно иметь частоту дискретизации: 16/2/15 = 533(1/3) кГц!

Но, при прямом однократном замере в это время плюсуется блок запуска АЦП на замер + блок переноса результата замера в ОЗУ. Цикл, хотя и небольшой, но тем не менее на "С" реализации занимает НЕ МЕНЕЕ 20 таков ЦПУ (на асм можно ужаться до 9-11 тактов). Итого, в прямом режиме получить такую скорость нереально и она падает до .. 15*2+20 = 50 тактов ЦПУ на цикл замера И переноса данных или частота дискретизации составит 16000/50  = 320кГц. Ровно эту частоту я и получил в своих экспериментах на делителе 1:2 (ADPS0..2 = 1)!

Вывод: получить скорость дискретизации в 533кГц можно только в аппаратной обработке прерывания ADC с тщательным прописыванием этого обработчика, чтобу его работа укладывалась в 30 тактов ЦПУ вместе со "входом/выходом" из обработчика, а для надежной работы надо ещё иметь "запас" тактов в 10-12.

6. Точность измерения на повышенном тактировании АЦП. .. измеряет он всегда по 10бит, но вот "что"? :) Ответ банален - что нашел, то и измерил. Основная проблема тут - мультиплексор входов АЦП - он устанавливает измеряемый уровень небыстро, особенно при переключении с одного входа на другой И тут главную роль играет .. сопротивление источника сигнала.

Рекомендованные "менее 10кОм" нормально дают замерять на делителях 1:2, 1:4 при перекрытии этого требования .. более чем в 10 раз для последовательного съема с одной ноги. :)

Итого, в рамках применения "осцилограф" вполне можно получить устойчивый сигнал точностью 7-8 бит (класс прибора 0.5%!) с частотой дискретизации около 500кГц для 1-входового варианта, в т.ч. и дифференциальных режимов и 125кГц для "2-4-х лучевого" варианта, в т.ч. дифференциальных.

Как по мне, так очень неплохой результат испытаний. Всем спасибо, кто дочитал до этого места. :)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Провел наконец-то теже тесты для АЦП Мега128а с кварцем 20Мгц. Плата МУРК-128:

В общем, всё нрустно. Делитель 1:2 на сатоте 10Мгц валит АЦП напрочь. Из него ничего не вылазит вовсе, корме 255 или 1023. Так что можно перепаивать кварц обратно на 16Мгц. Повышение общей частоты сказывается больше негативно, чем полезно.

 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Перепаял кварц у Мега128а обратно на 16Мгц. В целом АЦП несколько хуже чем у Мега2560 и он явно проще: нет регистра ADCSRB и соответственно нет выбора источника автозапуска, нет регистров DIDR0,1 и соответственно, шумы несколько выше и точность на делителе 1:2 явно хуже на 1 разряд. На делителе 1:2 - в общем-то работает, но точность в районе 3-5% (6 бит в лучшем случае) и периодически проскакивают сбои в 0 или 255.

Для полноты экспериментов провел такое же исследование для Ардуино Нано на базе ATmega328p .. увы, на делителе 1:2 она не заработала ни на каком входном режиме. Только 1:4 (тактовая АЦП = 4Мгц). Точность оцифорвки также в районе 6бит. даже с включенным DIDRx.

В общем, МУРК-2560 пока показал наилучшие результаты с частотой в районе 340 килозамеров в секунду и это похоже предел.

Да, попытка использовать непрерывный режим и прерывание не увенчалась успехом. Программа обработчика прерывания укладывается с прологом и эпилогом только в 45 тактов, что хуже чем "разовый" замер в цикле: примерно 20 тактов. Если выделять жесткий буфер для обработчика, то наверное его можно незначительно ускорить, но вход в прерывание, пролог и эпилог всего на 3 регистра, все равно съедают не менее 22 такта.

Condensator
Offline
Зарегистрирован: 02.06.2017

Arhat109-2 пишет:
Провел наконец-то теже тесты для АЦП Мега128а с кварцем 20Мгц. Плата МУРК-128: В общем, всё грустно. Делитель 1:2 на чатоте 10Мгц валит АЦП напрочь. Из него ничего не вылазит вовсе, корме 255 или 1023. Так что можно перепаивать кварц обратно на 16Мгц. Повышение общей частоты сказывается больше негативно, чем полезно.
Валится только АЦП?  Ведь для СPU  такая частота при надлежащем питании не критична.

 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Да. АЦП валится на делителе 1:2, то есть работать на частоте 10Мгц он отказался напрочь. После перепайки кварца на 16Мгц этот же делитель работает, но тоже нестабильно - периодически вылетают "зубья" в 0 или 255, в режиме осцилограф, а его запуск периодически почему-то тоже дает "0" на первых 50-100 замерах. У МУРК-2560 с кварцем 16Мгц этот же делитель - на 8Мгц, работает стабильно и ровно. Самое что печально, это то что земля и питание на обоих платах у блока АЦП разведены с учетом рекомендаций даташита .. и большого смысла в разгоне заменой кварца - не наблюдается вовсе. Похоже правильнее наоборот понижать тактовую до 14Мгц.

Как понял, у всех "урезков" (младших мег) АЦП блок несколько упрощен в той или иной степени. Так что, если и превращать Мегу в осцилограф, то только 2560.

Переписав на asm блок замера можно сократить цикл замера в однократном режиме до 10 доп. тактов или суммарно с АЦП до его 16 тактов, что должно дать предельную скорость дискретизации по одному каналу около 16000/2/16= 500кГц., но это требует проверки.

У мега2560 точность оцифровки на делителе 1:2 тоже "страдает" и не превышает 6 бит (1.5%), и этого вполне достаточно для отрисовки на дисплеях.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

P.S. прочел почту .. Ха! типовая Arduino Mega 2560 r3 на базе CH340G на делителе 1:2 не запустилась тоже .. похоже что разводка платы "оставляет желать лучшего".

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Предельная частота дискретизации на плате МУРК-128 (ATmega128a) с делителем АЦП 1:2 (частота блока АЦП=8Мгц) составила около 400кГц. Сигнал с ноги таймера в режиме Phase Correct PWM mode (01) TOP=255, prescaler = 1:8 => частота ноги таймера = 2000/2/256=3,90625кГц. Точность АЦП около +- 4/256 = +-1.5%. Это с ассемблерной подпрограммой чтения, которая к циклу АЦП добавляет всего 11 тактов. Странно, но "маловато" и больше не будет.

Сигнал интегрировался конденсатором, размер буфера 400 точек, скрин с плоттера:

Код подпрограммы чтения для ATmega128a:

void adcReadBuffer()
{
  asm volatile(
    "     push r24              \n\t"
    "     push r28              \n\t"
    "     push r29              \n\t"
    "     push r30              \n\t"
    "     push r31              \n\t"
    "     lds  r30,adcBuffer    \n\t"
    "     lds  r31,adcBuffer+1  \n\t"
    "     lds  r28,adcCount     \n\t" // for(Y=adcCount..
    "     lds  r29,adcCount+1   \n\t"
    ".ADC_LOOP:                 \n\t"
    "     sbi  0x06,6           \n\t" //1 ADCSRA |= _BV(ADSC);
    ".ADC_WAIT:                 \n\t" // while(ADCSRA|_BV(ADSC));
    "     sbic 0x06,6           \n\t" //2 пропуск после замера!
    "     jmp  .ADC_WAIT        \n\t" //
    "     in   r24,0x5          \n\t" //1 *Z++ = ADCH;
    "     st   Z+,r24           \n\t" //3
    "     sbiw r28,1            \n\t" //2 Y-- ..
    "     brne .ADC_LOOP        \n\t" //2 .. != 0?
    ".ADC_END2:                 \n\t"
    "     pop  r31              \n\t"
    "     pop  r30              \n\t"
    "     pop  r29              \n\t"
    "     pop  r28              \n\t"
    "     pop  r24              \n\t"
    ::);
}

 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Продолжу разбор работы АЦП и возможные направления развития применения "осцилограф" для ATmega2560 (для ATmega128A - все примитивно: нет в нем нифига :( , соответственно только "программно"):

1. Вариант "программной реализации": можно следить за уровнем АЦП на входе без записи в буфер, по достижению порога с заданным направлением (синхронизация по уровню + спад/подъем), включать сохранение данных АЦП в буфер. Можно повторять эту операцию для 2,3 и т.д. буфера "со сдвигом" (вставка паузы перед стартом сохранения очередного буфера) и тем самым получить "стробирующий эффект" растянув ось "Х". Минимальная пауза = 1 такт (nop) на 16Мгц = 62.5нсек. Соответственно, в 2.5мксек умещается 20 пауз, и максимально, программно можно "улучшить" частоту дискретизации до 8Мгц при 20 последовательных съемах "фрагмента". Этот же объем буферов сохранения можно использовать и для усреднения сигнала.

Итого можно получить ряд "дискретизация - усреднение" на делителе АЦП 1:2 : "8Мгц - без усреднения" (буфера 20х1), "4Мгц - 2х" (10х2), "2Мгц - 4х" (5х4), "1.6Мгц - 5х (4х5), "800кГц - 10х" (2х10) и "400кГц - 20х" (1х20). соответственно в режиме "400-20х" можно уточнить показания на 4.5 раза или на 2-3бита. На других делителях получится несколько иначе, например на 1:4 частота дискретизации составляет уже 16000/(14.5*4+11) = 232кГц (4,3125мксек) и точность одиночного замера уже не 3%, а 1.5% .. ну и при шаге стробирования 62.5нсек потребуется иметь 69 буферов или загрублять шаг стробирования ... :)

2. Вариант "аппаратной реализации" (только 2560, 328p!): обработчик прерываний компаратора устанавливает буфер сохранения и время работы выхода В таймера 1, который запускает АЦП на замеры. В этом случае уровень синхронизации отрабатывается аппаратно компаратором (можно вокнуть переменник и крутить его ручку), задержка стробирования фиксируется таймером "физически" и также может настраиваться с шагом 62.5нс. Задержка по времени от срабатывания компаратора составит: 7тактов вход в прерывание + обработчик компаратора (ок.30) + 5 тактов выход + задержка таймера (мин 2 такта) = 35-50 тактов (2-3мксек) системная задержка + установка таймера для стробирующего сдвига (шаг 62.5нсек). Поскольку системная задержка влияет на все замеры одинаково, то про неё можно "забыть".. по сути получим "то же самое", но проще программно + отсутствие влияния прочих прерываний на работу осцилографа.

P.S. Многолучевая работа, работа в диф. режиме - практически не отличаются от описанных решений. При нескольких лучах согласовано (в 2, 3 и т.д. раз) тупо падает частота дискретизации по каждому лучу.

P.P.S. Автомасштабирование как и усреднение можно делать чисто программно в разумных пределах уже при выводе "итого" на экран.

Ну и ещё. Можно замутить режим внешней синхронизации (фигуры Лиссажу к примеру) программно.

Какие ещё режимы есть смысл "предусмотреть"? :)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

up. Желающих высказаться - нету?

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

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

Закрываю тему.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Открыл тему, поскольку решил что валить все скопом в тему "пультоскоп" не имеет смысла.

Частота АЦП-блока в 450 кило-замеров в секунду - достигнута, ура товарищи! :)

Итого, что удалось получить: Мега2560, делитель АЦП 1:2, режим "free running mode" контроль завершения замера - ручной в цикле по сигналу ADIF.

Процедура замера снимает byte::adcMaxSamples образцов, по word::adcSampleLegth показаний одновременно с byte::adcMaxChannels каналов.

Каждый канал переустанавливается записью ADMUX целиком "на лету", т.е. теоретически каждый канал допускает свой вариант опорного напряжения и типа оцифровки, но .. "даташит против" и режим съема имеет существенное ограничение: нельзя смешивать настройки для обычных и дифференциальных каналов. Ибо переключение на дифф. режим требует .. 125 микросекунд ожидания. Ровно похожая, но меньшая по времени "засада" при смене уровня опорного сигнала. И ещё: поскольку MUX5 находится в регистре ADCSRB, то он не изменяется при смене каналов, соответственно одновременно можно проводить измерения или по 0..7 или по 8..15 ногам АЦП, но не совместно, типа 1 и 10 вход.

Вариант процедуры на "С" на плате МУРК-2560 показал "де факто" скорость оцифровки 450 тысяч замеров в сек., вариант "асм-вставка" полноценно пока запустить не удалось, но похоже что скорость в 500кГц - вполне достижима в таком режиме. С-шному коду буквально не хватает оптимизации в 5-6 тактов на замер.. абидна.

Точность каждого замера в районе 4-8 LSB (оценка очень примерная). Точность оценить сложно, поскольку при быстром нарастании сигнала "шаг" получается ближе к 8 делениям, а верхние/нижние полочки показывают "наводки" глубиной 2-4LSB "только в путь" .. нипанятна как измерить точнее. Но, сигнал от сэмпла к сэмплу имеет практически одну форму, что делает "бесполезным" вариант усреднения по нескольким замерам.

Процедура замера умеет искать в исходном сигнале заданный уровень и направление его перепада, что позволяет сделать синхронизацию "по фронту", "по спаду" заданного уровня. Кроме этого, есть возможность "сдвигать" во времени каждый набор замеров для всех adcMaxChannels * adcSampleLength на величину, кратную 187,5-250нсек (3-4 такта МК). Систематическая задержка фиксирована и составляет 3.375мксек (время расчетное) от точки обнаружения уровня. Поскольку сам замер длится 15.5 тактов АЦП (13.5 + 2 .. даташит для free running mode), то возникает возможность применить стробирование при снятии нескольких сэмплов (для всех каналов одновременно) и повысить "виртуальную" частоту оцифровки примерно в 8 раз.

То есть до .. 4Мгц.

В общем, остался только один момент: победить опцию линковщика -flto, который безобразно корежит результат и приводит к проблемам сборки. Похоже недаром у ATmega128a есть опция "отключить -flto" ..

P.S. Приехали экраны, пора собирать все вместе: плата + память + экран..

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

В общем, частоту замеров в 592кГц получить можно. АЦП действительно отрабатывает за 13.5 тактов. Однако переключение каналов сменой ADMUX происходит не шустрее чем с частотой 1Мгц, которая и указана в даташите, что делает "многоканальный режим" в практическом плане бесполезным.

На этом изыскания с АЦП блоком можно закрыть.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Ну и последний результат экспериментов со стробированием: если НЕ закрывать прерывания (от таймера в первую очередь), то стробирование не позволяет получать фикс. сдвиг на заданное количество тактов и тем самым получать "промежуточные" точки на кривой измеряемого сигнала. А ещё оно требует строгой (в количество сдвигов раз) стабильности семплов снимаемого сигнала. Или по-просту:

При сдвиге на 1/3 периода замера, к концу семплов получаем расползание измеряемых точек больше чем период замера на частотах АЦП выше 2Мгц (делитель ADPS 1:3), что на практике снижает полезность стробирования практически в ноль.

Итого, на плате МУРК-128 получена скорость замеров в 592кГц при точности АЦП около 6бит. Малейшие проблемы с землей (макетка с втыкающимися проводками) и на картинке можно наблюдать кучки "зубьев" вместо сигнала. Гонять АЦП с таким делителем можно в режиме "free running mode" с таким макросом получения результата:

#define adcReadInt(p) \
{
  while( (ADCSRA & _BV(ADIF) == 0 );
  ADCSRA |= (1<<ADIF);
  (p) = ADCH;
}
// и в коде далее:
{
  register uint8_t _adc;
  adcReadInt(_adc);
  *buffer++ = _adc;
}

То есть ждем сигнала прерывания, сразу же сбрасываем его, тем самым разрешаем начало след. цикла и уже потом читаем чего намеряно в предыдущем цикле и уже потом сохраняем результат куда хотелось, если хотелось. В таком режиме работа АЦП идет строго по 13.5 тактов.

Замерять в таком режиме можно только 1 канал. Никаких "переключений" ADMUX.

Если надо производить замеры больше 1 канала, то делитель АЦП требуется выставлять на тот самый 1Мгц даташита (ADPS=4, 1:16), в противном случае влияние измеренного уровня на новый канал будет превышать 5-6 бит. А точность АЦП даже с делителем 1:4 уже близка к 8 битам..

Зато, можно кратковременно отключать АЦП и быстро включать заново сигналом ADSC в режиме "free running mode" .. но, опять же "кратно скорости АЦП" (включится на ближайшем начале такта АЦП) а не F_CPU..

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Подниму тему.

Нашел где изготовить установочную партию плат МУРК-2560 + SRAM 512kb по 4-х оконному варианту (посты 2,3). Он оказался наиболее удобным.

В изготовление пойдет 10 плат, все они уже расписаны "куда", но если есть желающие - пишите тут свои мыла. С ценой ещё не определился, ибо сам не знаю почем будет доп. партия если её заказывать.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Прислали ценник. Плата Мега2560, в этой разводке но под стабилизатор на базе RT8289 (ток до 5А) получается около 290руб/шт. Это только изготовление самой платы, без монтажа деталек и без них конечно же.

Аналогично, только платы на базе Мега128А и плата расширения SRAM получаются в районе 230руб/шт.

Народ, это сильно дорого? Есть где изготовить дешевле?

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Какие размеры у плат?

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

72х56мм. У платы Меги все 86 контактов разведены как на расширительном шилде - с землей и питанием, так что дырок там сверлить-непересверлить.. :)

b707
Offline
Зарегистрирован: 26.05.2017

Arhat109-2 пишет:

72х56мм. У платы Меги все 86 контактов разведены как на расширительном шилде - с землей и питанием, так что дырок там сверлить-непересверлить.. :)

а нафига? - никогда не понимал такого дизайна. Вы правда думаете. что кто-то будет подключать к плате 86 отдельных девайсов и на каждый тянуть три отдельных провода - сигнал, питание и землю?

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

jlcpcb.com - 2$ за 10 плат 10 на 10 см + доставка. Заказываем с отцом не первый раз, примерно рублей 800-100 выходит в зависимости от толщины текстолита (меньше-легче-доставка меньше). На панель 10×10 ещё можно мелочь впихнуть какую-нибудь) и дома разрезать.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Это для кружка и обучения. На такие сборки удобно одеваются контакты от серводвигателей и прочих приблуд. Все одновременно, конечно же не нужны, но это же а-ля "лего-кирпич", пардон управляющий блок для "Ардуино как Лего". Да ещё и с расширенной SRAM до 512 килобайт. К каждой меге идет вторая плата на базе HMM628512BFLP-5 (8x512кбит, 50нсек), которая крепится с обратной стороны Меги. В тот же разъем расширения памяти на базе портов А и С можно впендюрить и дисплеи с памятью и прямым доступом (где есть шина данных и адреса) прямо из кода, купил дисплей 2", но пока ещё не пробовал.

Собственно и размерчик 72х56мм - это леговский формат в 9х7 "лего-кубиков".. Платы по изготовлению обрамляются в лего крепления с блоком аккумуляторов 3х18650 и окончательным размером блока типа EV3 (лего 9х11 или 9x13)  и ву-а-ля, пользуйтесь детишки.. один в один (экран, кнопки, аккумуляторы, крепления) только гнезд для подключения периферии 86, а не "два по 4". :)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

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

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

а-афигеть .. все 3 платы по 10 штук за .. 800 рублей. Пасибки за "на водку" .. :)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Yarik. Yar, оказывается размер 10х10см - это предельный размер по такому ценнику. Можно делать заказы меньшего размера, цена останется той же в $2, но они ещё и платы почикают на отдельные. В общем, пока "наши" не научатся работать также просто, быстро и дешево .. про "импортозамещение" можно забыть.

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Да, если меньше - тоже 2 бакса, просто мы обычно собирали мелких и не очень платок на панель, дома ножницами по металлу норм режется)

b707
Offline
Зарегистрирован: 26.05.2017

Arhat109-2 пишет:

Yarik. Yar, оказывается размер 10х10см - это предельный размер по такому ценнику. Можно делать заказы меньшего размера, цена останется той же в $2, но они ещё и платы почикают на отдельные. В общем, пока "наши" не научатся работать также просто, быстро и дешево .. про "импортозамещение" можно забыть.

Архат. это цена со сверлением отверстий?

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Со всеми делами. Сверловка, металлизация, маска, всё-всё.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Это цена за 10шт макс. размера 10х10см. Как гербер приготовишь - то и получишь. У меня на одной из плат около 300 отверстий. Прошло нормально, платы уже в процессе.

arduinec
Offline
Зарегистрирован: 01.09.2015

Arhat109-2, поскольку уже есть опыт, то не мог бы спроектировать небольшой шилд с дополнительной памятью для стандартной Arduino Mega2560. Очень заманчиво память на Меге увеличить, а самодельные контроллеры пока не требуются.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

На лоцмане есть такой готовый шилд под 512 килобайт. Мне он неудобен тем, что плата "корявая" и смотрит не туда и занимает целых 3 доп. ноги дуньки. Жалко. Где-то есть разводка на 64 килобайта под 2 мелкосхемы по 32х8, но она у меня тогда так и не заработала, а полноценног даташита на конкретно те микросхемы я так и не нашел, может разводка под типовые схемы памяти была некорректна. Могу выложить, если интересно. Она как раз под Мегу.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Кстати ещё засада: микросхемы памяти внезапно то ли исчезли с Али, то ли сильно подорожали .. дешевле 70-80руб/шт (SRAM 8х512к 50-70нсек) найти не могу.

arduinec
Offline
Зарегистрирован: 01.09.2015

Arhat109-2 пишет:

Кстати ещё засада: микросхемы памяти внезапно то ли исчезли с Али, то ли сильно подорожали .. дешевле 70-80руб/шт (SRAM 8х512к 50-70нсек) найти не могу.

Такие подходят?
https://ru.aliexpress.com/item/LT550L41-A-picture-on-the-Internet-and-I-...
https://ru.aliexpress.com/item/10-k6x4008c1f-bf55-512kx8-CMOS/3281862437...
https://ru.aliexpress.com/item/10-K6X4016C3F-K6X4016-K6X4016C3F-TF55/328...
 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Подходят только вторые K6x4008C1F но они тоже 64руб/шт .. в прошлом году делал плату на HM628512ALFP-5SL (пришли эти), брал 5шт по 40руб/шт. Теперь их нет. Вроде бы по распиновке должны подойти, буду смотреть тщательней. Спасибо.

Вам выложить разводку платы для двух 32кбайт под стандартную Мегу?

P.S. Пробежался по даташиту, похоже K6X4008C1F-BF55 подходят точно, про 70нсек, пока достоверно сказать не могу, там цикл записи похоже слишком длинен для работы без задержек, чтение вроде проходит тоже..

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

В общем, ловите. Плата расширения памяти SRAM к Мега-2560 на 64 килобайта (разводка под конкретно эти микросхемы в DIP корпусах! У меня были другие, но я так и не нашел на них даташит..):

нашел вариант:

  

Похоже что именно его и делал. Надо смотреть как будут расположены ножки платы относительно разъема Меги. Там была идея "вверх ногами", я долго мучался с разводкой зеркально. Смысл в том, что слой F_Cu, на котором размещены элементы и микросхемы при подключении оказывается "лицом вниз", к самой Меге. А снаружи остается слой B_Cu, который я не наносил на плату совсем. Его дорожки паялись проводками поверх слоя F_Cu

Реально изготовленная плата, неудачный отсвет, что текстолит выглядит черным. Нормальный он вполне. Вот на этот слой наносятся детали и он потом идет "деталями вниз", к плате самой Меги. конкретно эта плата вообще травилась на одностороннем текстолите. :)

И ещё. Разьем по схеме 40-контактный, не нашел тогда в кикаде то, что было надо. Поэтому тут он выходит за границу платы. Паял с обратной стороны (со слоя B_Cu) разьем типа такого: https://ru.aliexpress.com/item/5pcs-2-54-mm-2x20-P-40-Pin-Female-Pin-Header-Square-Pins-12-2mm-Length/32743163269.html, отрезая лишнее. Длинными ногами втыкается в мегу, и есть "дубликаты" ног для подключения чего-то ещё на свободные пины.

Фотку платы, к сожалению уже не найду, да и сама плата уже не помню где.

Программно с этой платой всё примитивно. В описании меги (boards.txt) достаточно просто увеличить верхний предел имеющейся памяти до 64килобайт. Собственно это практически всё. Блок кода в setup() для включения шины SRAM можно взять из даташита или тут была тема в общем разделе от Valera1972 кажется так.. там же и тестовые примеры были.

P.S. по факту, там кажется мешается разьем ISP у меги, со своей платы я его выпаивал за ненадобностью .. есть дубли ножек на основных разъемах.

arduinec
Offline
Зарегистрирован: 01.09.2015

Arhat109-2 пишет:

в прошлом году делал плату на HM628512ALFP-5SL (пришли эти), брал 5шт по 40руб/шт. Теперь их нет.

Нашлись похожие. Может подойдут?
https://ru.aliexpress.com/item/10-HM628512CLTT-5-HM628512LTT-HM628512LTT5-HM628512-628512/32858780995.html
https://ru.aliexpress.com/item/5pcs-lot-HM628512-628512-SOP32/32390746120.html
https://ru.aliexpress.com/item/HM628512-HM628512ALFP-7/32787468972.html

Спасибо за разводку платы!

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Спасибо за ссылки. Это они. :)

По плате на 64кб: там могут подойти разные микросхемы, смотрите распиновки дип-корпусов. И ещё, я сильно подозреваю что она могла не заработать ещё из-за отсутствия подтяжек на управляющих сигналах RD,WR и у мосфета. У Валеры они были подтянуты и все работало. И регистр у него и на моих платах 512кб стоят 74HC573D они значительно шустрее указанных на этой плате. Мосфеты на своих платах в 512кб я тоже поменял на ВЧ npn транзюки из-за подозрения низкой скорострельности и завала фронтов. Но, нужно смотреть осцилом что там критично. Хорошим осцилом с частотами до 100Мгц, чтобы видеть фронты полноценно.

Пожелания тем, кто захочет переразвести плату:

1. Добавить резисторы подтяжки;

2. Разнести чуть подальше корпуса микросхем памяти друг от друга. Там подлезть паяльником весьма проблематично между ними.

3. Можно заменить на 1 мелкосхему 64к х 8бит. Такие есть, но встречаются гораздо реже и стоят дороже.

4. возможно есть вариант сделать всю плату полностью односторонней с применением вместо проводков резисторов-перемычек и заодно перейти на SMD

5. наверное стоит дополнить плату керамическими конденсаторами по питанию по входу и у мелкосхемы памяти.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Yarik. Yar, не понял, платы уже едут, платил с карты, взял вчера распечатку платежей и там платеж .. не значится. Это как? Спишут после доставки?

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Хм, не знаю, у нас обычно сразу проходил.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Признаюсь, был не прав. Бабки списали сразу же. Просто среди рублевых платежей заметить списанные 12 USD оказалось не просто, искалась сумма в районе 700 рублей. :)

В общем, платы уже где-то близко, а с микросхемами к ним похоже круто пролетел мимо. По указанным ссылкам ни один продаван так и не откликнулся на вопрос "почему на фото чипы без маркировок и рабочие ли они, а не пустышки?" .. молчат дружно. Нашел других поставщиков на самой Алибабе (типа "опытная партия в 10шт"), но от них ответов также не поступило "есть ли, рабочие и т.д.". А в связи с последними событиями - купить теперь по 230-250руб Мегу 2560 похоже и вовсе нереально. Да, внутри РФ тоже нигде не нашел дешевле 500руб. Те, кто указывает цены ниже как выясняется самих чипов на складе не имеют.

В общем, только у русских слово жопа означает не только часть тела, но ещё и состояние. А полная жопа - это даже целый комплекс мероприятий..

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

Arhat109-2, до сих пор еще SRAM не победил?

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Победил, почему так решили? Просто пролетел с заказом, что несколько абыдна..

Это уже "установочная партия" под производство для обучающих классов.

Valera19701
Valera19701 аватар
Offline
Зарегистрирован: 18.10.2015

Arhat109-2 пишет:

Да, внутри РФ тоже нигде не нашел дешевле 500руб. Те, кто указывает цены ниже как выясняется самих чипов на складе не имеют.

вот по 460

http://www.platan.ru/shop/part/ATMEGA2560-16AU.html

вот 20шт по 300

https://ru.aliexpress.com/item/ATMEGA2560-16AU-QFP100-ATMEGA2560/32791853714.html

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Пасибки, написав про "500", имел ввиду близкую цену. Да, по 450-460 тоже видел, но мне от этого не легче. В бюджет было заложено по 4-4.5$ по курсу, как брал предыдущие. По 300 с али - тоже вижу, но продаван или не отвечает на уточняющие вопросы или вот такие "по 20шт" .. в бюджете только 10.

Пока едут платы, сижу вот "думу думаю" (а доллар как с цепи сорвался)..