Кварц для arduino

Разгон Arduino. Под жидким азотом. 20 ⇒ 65.3Mhz @ -196 °C

До начала статьи сразу следует ответить на 2 вопроса, к гадалке не ходи — они будут заданы:

1) Какой в этом практический смысл? Разобраться в том, как ведет себя электроника при криогенных температурах, да и просто интересно сколько можно выжать из 20Мгц AVR-ки :-) Удалось выяснить момент, крайне важный и для разгона настольных процессоров с криогенным охлаждением.

2) Почему Arduino, ведь есть же куча микроконтроллеров быстрее, а i7 вообще всех рвет? Совершенно верно. Есть куча намного более современных микроконтроллеров, которые на 2-3 порядка быстрее (и они есть у меня в наличии). Однако Arduino получила большую известность среди любителей, потому было решено мучить именно её. А для практических применений конечно дешевле и проще взять более быстрые микроконтроллеры (Cortex-M3, M4).

Разгон микроконтроллера под жидким азотом обещает быть несколько сложнее разгона «настольных» процессоров — ведь тут нет ни тестов стабильности, ни программируемого генератора тактовой частоты, ни управления напряжением питания. Да и компоненты на Arduino, как показала практика, не выдерживают криогенных температур — и с ними придется разбираться в индивидуальном порядке. Все эти проблемы к счастью удалось решить.

Жидкий азот

Давно хотел до него дорваться. Оказалось, в Москве его продают несколько компаний. Ближе всего был НИИ КМ, там азот по 50 рублей за литр. Некоторые компании не морщась за 5 литров просят 950 рублей — с ними нам конечно не по пути.

Жидкий азот получают буквально из воздуха — сжижая его и разделяя на ректификационной колонне, или наоборот — сначала выделяя азот из воздуха специальными фильтрами, и затем сжижая. Как оказалось, продаются даже небольшие установки по производству жидкого азота (10 литров в день). Себестоимость производства по электроэнергии — 5-10 рублей за литр. Теперь я точно знаю, что хочу себе на день рождения!

Переносить азот можно в обычных стальных термосах (стеклянные могут треснуть от резкого падения температуры). После дополнительного утепления (+1 сантиметр теплоизоляции и полиэтилен для защиты от конденсата) азот выкипал за 30 часов, что в принципе достаточно для работы. Покупать специальный сосуд Дьюара — достаточно дорогое удовольствие, хотя азот из маленьких (

5 литров) «правильных» сосудов Дьюара выкипает уже за 25 дней. Также нужно помнить, что ни в коем случае нельзя герметично закрывать жидкий азот — разорвет в клочья.

На physics.stackexchange.com/ подсказали, что термоизоляцию нужно делать наоборот — надевать сверху, а не снизу. Чтобы испаряющийся азот охлаждал внешнюю стенку термоса.

Нагрузочное тестирование

На экране HD44780 подключенном стандартным образом по 4-х битной шине во второй строке выводится номер итерации цикла, и 8 шестнадцатеричных цифр контрольных сумм. Первые 2 — тест SRAM, затем Flash, арифметика и program flow. Если все ок — то контрольная сумма должна получаться 12345678. Ошибка в контрольных суммах накапливается. Также код ошибки выводится морганием светодиода на плате: монотонное моргание — все ок, 1 вспышка — ошибка SRAM, 2 — Flash и т.д. При тестах на

-100°C — обычно находил ошибку program flow тест, при -196°C — тест с чтением/записью SRAM памяти.

Предполагалось, что при повышении напряжения мне придется отключить дисплей, и полагаться только на светодиод. Однако вышло наоборот — светодиод при температуре жидкого азота перестал работать (из-за расширения band-gap-а требуемое напряжение для зажигания стало выше напряжения питания, об этом ниже).

Генератор тактовой частоты

Arduino по умолчанию работает от кварца. Кварцы на первой гармонике обычно работают не выше 30Мгц, потому работа с внешним генератором неизбежна. Чтобы не паять саму плату Ардуины — я отогнул 2 ноги, к котором подключается кварц, и припаял контакт к внешней тактовой частоте. Ну и нужно было изменить fusе-ы для работы от внешнего генератора, для чего нужен отдельный программатор (в моем случае — TL866CS MiniPro). Об этом я конечно подумал уже после отгибания ног, и в программатор микроконтроллер пришлось ставить с костылями. На снимке слева — виден также китайский модуль DCDC на LM2596, которым я изменял напряжение питания.

Генератора сигналов до 100Мгц у меня конечно не было — недешевое это дело. Перестраиваемый генератор, способный генерировать в нужном мне диапазоне (16-100Мгц) со скважностью 50% удалось собрать только с 4-й попытки. Оказалось, многие генераторы на логических элементах — или имеют слишком низкую максимальную частоту, или нестабильны на высоких частотах (некоторые импульсы случайно становятся короче/шире). В конце концов следующая схема надежно генерировала во всем требуемом диапазоне. Резистор R1 на выходе — частичное последовательное терминировавшие, чтобы overshot тактового сигнала на стороне микроконтроллера был не такой страшный. Нам предстоит работа на повышенном напряжении, так и сжечь микросхему можно (при «резком» сигнале амплитудой 8V — мгновенные «выбросы» на стороне микроконтроллера были бы до 16 вольт).

Особенности работы электроники при криогенных температурах

При охлаждении до -196 градусов — сильно падает сопротивление металлов. Например для меди — катушка имела сопротивление 56.3 Ома при комнатной температуре и только 6.6 Ома при охлаждении (падение в 8.5 раз).

Поведение конденсаторов намного сложнее: электролитические конденсаторы при замерзании электролита теряют емкость в

500’000 раз. Керамические конденсаторы — в зависимости от диэлектрика: самые дешевые Y5V — теряют почти всю емкость при охлаждении, X7R — теряют 66% емкости и NP0 (C0G) — изменение емкости не более 1% (но такие конденсаторы емкостью больше 1000 пФ — редкость). Соответственно, если развязочные конденсаторы по питанию были с диэлектриком Y5V — то схема может потерять стабильность при охлаждении. Проверить тип диэлектрика можно и при нагревании до 100-150 градусов — влияние на емкость примерно такое-же. Для исключения этой проблемы — прямо на ноги питания микроконтроллера были припаяны конденсаторы с диэлектриками X7R и NP0.

Для полупроводников — увеличивается ширина запрещенной зоны, и изменяется мобильность электронов/дырок (тут зависимость сложная). На практике это приводит к тому, что например кремниевые диоды — имеют падения напряжения не 0.6-0.7 В, а 1.1. Это особенно касается аналоговых схем, в которых много биполярных транзисторов.

Из-за увеличения ширины запрещенной зоны — изменяется цвет свечения светодиодов, он становится более коротковолновым. Особенно это заметно на оранжевых/желтых светодиодах — они становятся зелеными. При этом сильно повышается требуемое напряжение питания, и данном случае — для его включения уже не хватало напряжения питания.

Почему микросхемы могут начать работать быстрее при охлаждении? Скорость работы CMOS-логики ограничена скоростью заряда/разряда паразитных конденсаторов (емкости затвора транзисторов и металлических соединений). А т.к. при уменьшении температуры снижается сопротивление металлов — может повыситься скорость работы, особенно если в схеме критичный по скорости участок — это были какие-то длинные цепи.

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

Непосредственно разгон с драматичным началом

50Мгц. Но конечно результат был не надежным, т.к. температура микроконтроллера была непостоянной.

Внезапно, глядя на то, как плата останавливается при опускании в азот и продолжает работу при отогревании — пришла идея: а вдруг это срабатывает защита от слишком низкого напряжения питания? Отключил Brown-out detection — и микроконтроллер стал стабильно работать при опускании в жидкий азот! С экраном — оказалось, что подсветка была подключена к 3.3В линейному регулятору на плате (пины питания заканчивались) — и при снижении температуры у него видимо тоже толи защита срабатывала, толи напряжение сильно падало. Подключил напрямую к 5В — и тоже все заработало.

Стабильная работы была около 50Мгц — и я начал повышать напряжение. Оказалось, что выше 8 Вольт — система переставала работать, а 7.5-8 Вольт обеспечивали абсолютно стабильную работу на частоте 65.3Мгц. Для сравнения, при комнатной температуре и 5В — максимально стабильная частота — 32.5Мгц, а при 8В — 37Мгц.

На частоте 65Мгц тест стабильно отработал больше часа, суммарно на разгон ушло 3 литра азота.



На воздухе — плата мгновенно покрывается инеем:

На видео тест на частоте 65Мгц начинается на 7:12, вид работы Arduino под слоем жидкого азота — на 9.00.

Резюме

  • Arduino под жидким азотом разгоняется и стабильно работает более часа на частоте 65.3Мгц, а на воздухе — только до 32.5-37Мгц. AVR короткое время спокойно работает при напряжении 8 Вольт.
  • Удалось разобраться как изменяются параметры электронных компонент при глубоком охлаждении: падение сопротивления металлов в

8.5 раз, падение емкости конденсаторов (электролитов, керамики Y5V — в тысячи раз, X7R — на 2/3. Емкость NP0 не изменяется), увеличение ширины запрещенной зоны полупроводников (рост падения напряжения диодов, изменение цвета светодиодов, очень большие изменения в работе аналоговых схем)

  • При разгоне «больших» процессоров — нужно внимательно следить за температурой конденсаторов (электролитов и дешевых керамических с диэлектриком Y5V). Она не должна падать ниже нуля — даже если для этого придется устанавливать дополнительный подогрев. Иначе они потеряют почти всю емкость, и процессор будет терять стабильность.
  • Ни одна Arduino не пострадала в процессе написания статьи. После отогревания и высыхания — продолжила работать, как и раньше :-)
  • PS. Из других экспериментов с жидким азотом — фосфоресценция сахара зеленым светом. А если будете разбивать фрукты — убирайте осколки ДО того, как они превратились в разбросанную по всей комнате фруктовую кашу

    PS: Если кто знает, где можно приобрести образцы сверхпроводников — напишите. То что я нашел — чудовищно дорого.

    Источник

    Внешний кварц на 20 МГц — HC-49S — для Ардуино: как разогнать.

    Как известно, максимальная заявленная частота работы микроконтроллера Atmega — 20 МГц, однако, готовые платы Ардуино с такими кварцами не попадались — и я решил попробовать заменить на одной плате имеющийся внешний кварцевый резонатор 16МГц на другой, рассчитанный на 20

    Начну пафосно, с азов!
    Говоря о цифровой технике, первое, что приходит на ум — это биты: 0 и 1, физически им соответствуют уровни напряжений, например напряжение ниже 1 вольт — это логический ноль, а больше — логическая единица.
    Элементы, составляющие микроконтроллер (процессор) выполняют свои операции при изменении состояния тактирующего сигнала (по фронту или по спаду). То есть, чтобы счётчик, на вход которого подали значение «5» сформировал на выходе значение «6», нужно на его специальном контакте «CLK» изменить напряжение со значения, большего, чем 1В на значение меньшее (или наоборот). Его вход можно соединить с выходом, и, если изначально на него мы подавали значение «5», значение «7» на выходе получится только после двух изменений сигнала контакта «CLK». Эти изменения называются «синхроимпульсами», чем чаще они приходят — тем быстрее работает всё устройство.

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

    20МГц — это не предел, разгоняют и до 32. Тема, конечно, интересная, но рисковать и покупать что-то для аппаратного апгрейда я не решался, пока мне не предложили кварц бесплатно «за обзор».

    За одним, разберемся, как программировать микроконтроллер ISP-программатором (или SPI?). Зачем? А просто так! В ряде случаев, при замене внешнего кварца, можно обойтись без ISP-программатора! Это если устройство полностью готово и оно не будет работать с величинами, так или иначе связанными со временем.

    Итак, описание товара.

    AvrISP

    Обычно для прошивки Ардуино используется UART-интерфейс, для передачи данных по нему в оба конца достаточно четыре провода, но требуется согласования частот на обоих устройствах. Стандартно, на платах Ардуино в микроконтроллер прошит загрузчик, который при загрузке (после Ресета) проверяет, не хочет ли его иметь Среда Разработки с компьютера по через последовательный адаптер? И, если так, проглатывает короче, позволяет перепрограммировать память программы контроллера.
    Мелкие микросхемы (типа attiny) с ограниченными ресурсами не используют загрузчик — и серьёзные дядьки шьют их по SPI-интерфейсу: у него уже для пиёма и передачи используется 5 проводков, но огромное преимущество — ведущее устройство тактирует ведомое, таким образом, не нужно согласовывать синхроимпульсы… Стоп! А что что такое здесь синхроимпульсы… Те же самые импульсы!

    Так вот, привязка частоты микроконтроллера ко времени происходит полностью программно. Когда мы заливаем скетч, выбираем название контроллера и его частоту, например: Atmega328 (3.3V 8MHz) — и Среда Разработки, компилирует код так, чтобы при вызове функции delay() проходило количество тактов, которое на выбранной частоте соответствует заданному количеству секунд; затем, прошивает через UART, тактируя его так, чтобы на другой стороне кабеля загрузчик, работающий на частоте 8МГц, успевал прнимать данные, передающиеся со стандартным бодрейтом. Бодрейт же связан со временем, поэтому если Среда не будет знать частоту, то не сможет сформировать корректный бодрейт для загрузчика.

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

    Беда!
    Прошить по UART после замены кварца не получится.
    При работе с другими устройствами по UART будет погрешность, не заметная на низких скоростях.
    Функции delay(), millis(), micros() будут работать неправильно ;(
    Получится только работать с пассивной периферией и, да, скорость работы возрастёт! Термретр и флешка будут шустрее, но датчик расстояния будет врать.

    Как быть?
    Если нет ISP-программатора, контроллер не работает со временем и пошить всё-таик хочется, прежде, чем менять кварц, нужно хорошо оттестировать — и только потом прошивать.
    Если есть ISP-программатор, — прошить по нему и. В случае последующей необходимости шить по UART, нужно пересобрать и перезалить загрузчик. Это вполне реальная процедура — homes-smart.ru/index.php/oborudovanie/arduino/avr-zagruzchik

    ISP-программатор

    Можно купить или сделать из другой Ардуино. «Другая Ардуино будет программатором: с ней мы работаем по UART», а она с той, у которой мы меняем кварц — по SPI. Кстати «SPI» и «ISP» расшифровываются по-разному, но в данной конкретной теме означают одно и то же.
    Ардуино-программатор прошиваем скетчем из примера:

    Затем соединяем выводы с той, которую мы будем программировать по SPI следующим образом
    То есть, вывод 10 — это ресет, 11-13 одноимённые и питание.
    Качаем программу Avrdude — это консольная утилита и она входит в дистрибутив Среды Ардуино, лежит в папке hardware\tools\avr\bin но там нет файлика avrdude.conf, в котором содержится информация для работы с платами.

    Фьюзы

    Далее, если не в курсе, что это, читаем статью о фьюзах Ардуино, например эту.
    Открываем командную строку в папке с avrdude.exe и выполняем:
    где
    atmega168 — программируемый контроллер;
    COM5 — нормер порта, обычно другой;
    19200 — бодрейт взаимодействия с программатором, также меняется в коде программатора, который мы заливали выше;
    lfuse, hfuse, efuse — названия флагов конфигурации контроллера, отвечающих за его поведение;
    :r: — признак того, что мы читаем (еще можно записывать и выполнять);
    *.hex — имена файликов;
    :h — формат, в котором будут записаны фьюзы в файлики!
    После, в папке появятся файлы, открываем их и «Калькулятор фьюзов AVR». Можно было поискать GUI-программку, которая через COM-порт, но лично у меня ни одна не заработала.
    Калькулятор мне понравился этот или этот. Выбираем микроконтроллер, копируем значения фьюз из файликов, они там в 16-ричном виде, поэтому в команде было :h, хотя для удобства ручной работы, было бы удобно писать :b — получать двоичные данные и побитово их анализировать.

    Смотрим — в калькуляторе, по мере ввода значений фьюз слева, изменяются значения полей. У меня получилось так:

    В открывающимся списке видим, что кроме нашей частоты — частоты внешнего кварца, можно выбрать многое другое:

    Например, этот вариант освобождает от потребности во внешнем источнике синхроимпульсов, используя внутренний на 8МГц. При изменении полей калькулятора, значения фьюзов слева изменяются, — у меня LOW стал E2.
    Если выполнить команду
    то запишется lfuse, в результате чего контроллер начнет работать на частоте 8МГц — и, при программировании его через UART, нужно будет выбирать такую частоту.

    Проверка, сравнение

    на глаз видно, что раз в секунду мигает светодиод только в среднем примере. Для более точного определения первого включения светодиода, соответствующего одной секунде, можно рассмотреть тайминги видеорядов:

    С новым кварцем мигает чаще!

    Почему под спойлером? — Потому что не обязательно.

    Настройка компилятора

    А то вдруг запорятся… Ковай! Вот и всё: можно перепаивать внешений кварц!

    Загрузчик мы прошили, теперь нужно настроить Среду Ардуино для корректной компиляции времени зависимых функций. Для этого, нужно скопировать Блок файла boards.txt для Arduino IDE в файлик, но! Атата! Новая Среда работает не так, как старая, и с ней не получется! Нужно качать «былую», 1.0.5 вполне подходит, файл находится в папке hardware\arduino, копируем туда строки, запускаем среду, выбираем тотже пример Blink, открываем меню — и видем там — Ура! — наш контроллер на 20 мегагерц.

    Прошивается обычным программатором успешно, работает синхронно со временем, и корректно по UART-интерфейсу!

    Товар предоставлен для написания обзора магазином. Обзор опубликован в соответствии с п.18 Правил сайта.

    Источник

    Кварц для ардуино

    Увеличение частоты кварцевого резонатора, платы управления FDM 3D принтера, Arduino AtMega2560 с 16 до 24MHz

    29.11.2016 Сайт https://anteh.ru

    Помня золотое правило «работает НЕ трожь», каждый сам принимает решение о необходимости описанной доработки. Автор статьи и сайт не несут никакой ответственности за полученный Вами результат.

    Описаны практически все аппаратные проблемы с решениями и нюансы, с которыми можно столкнуться при смене кварца Arduino AtMega2560.

    На текущий момент не было реальной проверки самой печати, результат может быть разный. Информация добавляется по ходу процесса, лишнего будет многовато, пока всё не утрясётся.

    В процессе испытаний получилось, что применение кварца в 24MHz для 3D принтера с marlin прошивкой нецелесообразно. То что меню перестало заедать это хорошо, но никаких других преимуществ пока не обнаружено. Разве возможность увеличить частоту STEP импульсов, но придётся marlin исходник дорабатывать, а это к его разработчикам. Помимо этого, с 24MHz кварцем наблюдается подёргивание кареток при движении эффектора вниз в начале печати и при печати в целом, проявляется в движении рывками осей, но пропусков нет. В целом вроде удовлетворительно, но когда вернул 16MHz стало лучше. Нижний абзац, с описанием проблемы при питании драйверов напряжением более 26VDC при 16MHz не актуален. Интересующиеся могут попробовать 20MHz. Можно предположить, что чтобы не было проблем с 24MHz кварцем, то нужно произвести какие-либо настройки marlin прошивки.

    При питании A4988 27VDC и частоте тактирования Mega2560 в 24MHz ход трёх кареток по вертикали дельта принтера происходит прерывисто, скорость движения то замедляется то ускоряется такое наблюдалось при Vref=900mV, при Vref=700mV такого уже не наблюдается. При Vref=300mV были проблемы, не работало. При Vref=400mV оси тихо и плавно пошли но при отработке команды «autohome» в верхней точке одна из осей начала «хрипеть» так же, как ранее при 300mV все оси. При Vref=600mV снова небольшие ускорения и замедления, при движении осей по вертикали. Волнами идёт. При Vref=500mV опять волнами, до этого было всё в порядке. И тут обратил внимание на величину сетевого напряжения она =241VAC, в розетке 241(12ночи) и т.к. стабилизатора напряжения нет, то на драйвера приходит 29.5VDC и похоже это перебор. Нужен стабилизатор переменного сетевого напряжения и бесперебойник. Принтер запитан от стабилизатора 225VAC получено напряжение питания 27.8VDC на драйверах. Выставлен Vref=900mV прерывистость наблюдалась в меньшей степени. Неделей ранее, при испытаниях принтера с повышенным напряжением проблем не было, возможно сетевое напряжение было меньше. В разрыв +27VDC питания шаговых двигателей ставим пару диодов. Итог такой: в розетке 222VAC питание драйверов 25.8V Vref=900mV драйвера A4988 и вопрос решён всё работает как надо без «дерготни», проблема была в «передозировке» напряжения у A4988 при тактировании AtMega2560 от 24Mhz кварца. Вывод: предельное напряжение питания для A4988 не должно превышать 26VDC, иначе оси начнут двигаться прерывисто. Как оказалось, это было связано с использованием 24MHz кварца AtMega2560, на 16MHz проблемы нет.

    Было предположение, что напряжение питания шаговых двигателей как-то повлияет на шумность. При плавном изменении, через латр, напряжения с 12 до 29VDC, во время печати, каких либо заметных на слух изменений замечено не было.

    Есть проблема подвисания управления пластиковым FDM 3D принтером во время печати, не хватает производительности контроллера. Возможно, повлияет на качество печати и позволит увеличить параметр DELTA_SEGMENTS_PER_SECOND 200. Решено поднять частоту кварца и посмотреть, какие преимущества или проблемы это даст. При напряжении питания контроллера atmega 5VDC, для увеличения частоты тактирования, без использования генератора частот, можно просто заменить кварц на более высокочастотный. 27MHz будет работать без проблем, у кого-то и 32 может заработать. Для первого эксперимента решено использовать 20MHz.
    На плате Arduino mega2560 для тактирования USB преобразователя на AtMega16u2 используется кварц «низкая лодочка» 16MHz, для тактирования контроллера AtMega2560 используется 16MHz SMD кварц CSTCE16M0V53-R0. Кварц не удобный для замены. Отпаиваем миниатюрный SMD кварц со встроенными конденсаторами и рядом, на термоклей, ставим 20MHz кварц, напаиваем конденсаторы 12pf 0603 и 2 провода от кварца до конденсаторов(центральный вывод smd кварца -GND), как на фотографии ниже:

    На фото: низкая лодочка с напаянными проводами кварц 20MHz, в синей термоусадке 27MHz.

    После замены/перепайки кварца, в Arduino IDE нужно указать новую частоту кварца. Идём в С:\arduino-1.6.13\hardware\arduino\avr\boards.txt и меняем параметр mega.build.f_cpu=16000000L на mega.build.f_cpu=20000000L. Этот параметр задаёт значение F_CPU используемое в прошивке marlin. Сохраняем файл.

    Оригинальный загрузчик stk500boot_v2_mega2560.hex копируем с переименованием в stk500boot_v2_mega2560_20MHz.hex и редактируем в ручную UBRR0L в .hex файле. Boot загрузчик работает через USART0. U2X0=1 настроено удвоение частоты(было заблуждением, хоть согласно .hex файлу стоит удвоение, возможно при работе бут загрузчика удвоение отключается). UBRR0L = 0x10(частота 115200) при частоте кварца 16MHz и удвоении частоты, это было заблуждением. Т.е. нужно искать регистр, в который загружается 0x10 и затем регистр отправляется в 0xC4(UBRR0L). С помощью AVR Studio был открыт stk500boot_v2_mega2560.hex, полностью дизассемблировать не удалось, было около 30 нераспознанных команд «Data or unknown opcode». Найден предположительный участок кода загрузки в r24 константы 0x10 и отправки её в UBRR0L. В hex ищем участок кода, где E180 и E188 расположены рядом, точнее 80E1 и 88E1. Здесь интересует 80E1(E180) -это ldi r24, 0x10 формат (E180)1110kkkkddddkkkk. Т.е. 80E1 нужно изменить на 85E1 и это будет соответствовать частоте загрузчика115200 на 20MHz при удвоении частоты. Не забываем про чек сумму, она поменяется с 0xA4 на 0x9F. Чек сумма у каждой строки своя и подсчитывается начиная от байта после двоеточия до предпоследнего байта строки включительно. Загрузчик работает только на 115200(это было заблуждение), поэтому hex нужно править под частоту кварца AtMega2560. Заливаем загрузчик в AtMega2560 по ISP, например, через STK500. И … ничего не вышло.
    Вернул всё в исходное. Осциллограф показал частоту USART0 AtMega2560 =17us или 58823 герца ближайшая стандартная 57600. То, что включено удвоение частоты также было непроверенным предположением. Реально удвоение частоты USART0 отключено, по крайней мере при работе бут загрузчика. По факту имеем, что с прошивкой stk500boot_v2_mega2560.hex бут загрузчик AtMega2560 обменивается с USB USART преобразователем на частоте 58823(измерено по периоду бита). Точнее на TxD выводе 9 PD3 AtMega16U2 и TxD выводе USART0 AtMega2560 присутствует частота 58823 герца при использовании одинаковых 16MHz кварцев. Важно, что ориентироваться нужно на эту частоту. Согласно документации, этой частоте соответствует UBRR0L=16=0x10 если не включено удвоение частоты. Для 20MHz UBRR0L=0x14 или нужно 80E1(E180 ldi r24, 0x10) заменить на 84E1 (E184 ldi r24, 0x14). Правим чек сумму на A0. Прошиваем… и ура заработало. Ошибок IDE, при прошивке не выдало. Частота TxD AtMega2560, у которой 16MHz кварц был заменён на 20MHz, по показаниям осциллографа(на глаз измерялся период бита) составила примерно 16.9us или 59172герца, по расчётам 59524. Отклонение частот TxD AtMega16U2 и TxD AtMega2560 находится в рамках допустимых 10%.
    Пробуем поработать с pronterface. Проблем не возникло, всё стандартно, частота обмена с pronterface та же 250000 герц.
    Пробуем кварц 27MHz «CPM 27.000 C-20″это полноразмерная лодочка, на фото выше в синей термоусадке. UBRRL = 27000000/(16*58823)-1 = 28 = 0x1C, 80E1(E180 ldi r24, 0x10) заменяем на 8CE1 (E18C ldi r24, 0x1C), чек сумма 98. Расчётная частота 58190герц, отклонение от 58823 = 663герца. В boards.txt поправляем mega.build.f_cpu=27000000L.
    Не заработало. Решить нужно 2 проблемы:
    1. Не заработал USART обмен, не смотря, что отклонения в частотах не превышало 10%.
    2. Возникла проблема с отсутствием таблицы speed_lookuptable_fast для частоты 27MHz, для каждой частоты кварца эта таблица должна быть своей. Штатно предусмотрено 2 таблицы, для 16 и 20 MHz.

    Первая решается подбором кварца и выбором частоты USART, вторая с помощью скрипта create_speed_lookuptable.py размещённого на GitHub. Считаем, что python установлен, запускаем скрипт для частоты 27MHz. Например из командной строки, через cmd: \create_speed_lookuptable -f 27 -d 8

    В скрипте у —cpu-freq заменён тип int на float, чтобы использовать дробные значения частот кварца «-f’, ‘—cpu-freq’, type=float». Но большой практической необходимости в этом нет.

    Для кварца 27MHz расхождение в частотах обмена составило 58823-58190=663герца. По стандарту частота может отклоняться на 10%. Есть некое интернет мнение на счёт отклонения в 3%. Для 20MHz разница была в 58823-59524 = 701. Не клеится.

    Пробуем кварц 25MHz. UBRRL = 25000000/(16*58823)-1 = 25.56. Для UBRRL = 26 частота = 57870герц. Прошивка через загрузчик заливаться начала, но через секунд 20 вылетает ошибка:

    Так было несколько раз. Но прошивка залита, по крайней мере pronterface работает.
    Есть проблемы с USB USART преобразователем, реализованном на AtMega16U2, точнее код не отлажен для работы с разными кварцами, но никто ничего и не обещал. Посредством STK500 программатора, через ISP залита Arduino-usbserial-atmega16u2-Mega2560-Rev3.hex. И при заливке прошивки снова:

    Не помогло, ошибка появляется. Но прошивка 3D принтера скорее всего залита, pronterface работает.

    Возможно лучшее решение использовать другой USB USART преобразователь, например на CP2104. Можно попробовать использовать одинаковые кварцы на AtMega16U2 и AtMega2560. Пробуем подправить прошивку Arduino-usbserial-atmega16u2-Mega2560-Rev3.hex для использования другого кварца, а именно 25MHz вместо 16MHz. По тому же самому принципу, подправлял hex. В Arduino-usbserial-atmega16u2-Mega2560-Rev3.hex ищем:
    F419 BRNE PC+0x04 Branch if not equal
    E120 LDI R18,0x10 Load immediate
    E030 LDI R19,0x00 Load immediate
    Или ищем 19F420E130E0 и 20E1 исправляем на 2AE1 чек сумма 2C. Загружаем получившийся .hex в AtMega16U2 по ISP STK500 и… не нашёл второго кварца на 25MHz. Переделываем всё на 27MHz. Но оказалось, что для тактирования USB 48MHz подойдёт только 16MHz кварц.

    Можно попробовать найти «волшебную» универсальную частоту USART, которая будет одинаковой или максимально близкой для AtMega16U2 и AtMega2560, ниже представлена таблица, помогающая произвести подобный поиск:

    UBRRL 16MHz 20MHz 24MHz 22MHz 25MHz 27MHz
    0 1000000 1250000 1500000 1375000 1562500 1687500
    1 500000 625000 750000 687500 781250 843750
    2 333333,3333 416666,6667 500000 458333,3333 520833,3333 562500
    3 250000 312500 375000 343750 390625 421875
    4 200000 250000 300000 275000 312500 337500
    5 166666,6667 208333,3333 250000 229166,6667 260416,6667 281250
    6 142857,1429 178571,4286 214285,7143 196428,5714 223214,2857 241071,4286
    7 125000 156250 187500 171875 195312,5 210937,5
    8 111111,1111 138888,8889 166666,6667 152777,7778 173611,1111 187500
    9 100000 125000 150000 137500 156250 168750
    10 90909,09091 113636,3636 136363,6364 125000 142045,4545 153409,0909
    11 83333,33333 104166,6667 125000 114583,3333 130208,3333 140625
    12 76923,07692 96153,84615 115384,6154 105769,2308 120192,3077 129807,6923
    13 71428,57143 89285,71429 107142,8571 98214,28571 111607,1429 120535,7143
    14 66666,66667 83333,33333 100000 91666,66667 104166,6667 112500
    15 62500 78125 93750 85937,5 97656,25 105468,75
    16 58823,52941 73529,41176 88235,29412 80882,35294 91911,76471 99264,70588
    17 55555,55556 69444,44444 83333,33333 76388,88889 86805,55556 93750
    18 52631,57895 65789,47368 78947,36842 72368,42105 82236,84211 88815,78947
    19 50000 62500 75000 68750 78125 84375
    20 47619,04762 59523,80952 71428,57143 65476,19048 74404,7619 80357,14286
    21 45454,54545 56818,18182 68181,81818 62500 71022,72727 76704,54545
    22 43478,26087 54347,82609 65217,3913 59782,6087 67934,78261 73369,56522
    23 41666,66667 52083,33333 62500 57291,66667 65104,16667 70312,5
    24 40000 50000 60000 55000 62500 67500
    25 38461,53846 48076,92308 57692,30769 52884,61538 60096,15385 64903,84615
    26 37037,03704 46296,2963 55555,55556 50925,92593 57870,37037 62500
    27 35714,28571 44642,85714 53571,42857 49107,14286 55803,57143 60267,85714
    28 34482,75862 43103,44828 51724,13793 47413,7931 53879,31034 58189,65517
    29 33333,33333 41666,66667 50000 45833,33333 52083,33333 56250
    30 32258,06452 40322,58065 48387,09677 44354,83871 50403,22581 54435,48387
    31 31250 39062,5 46875 42968,75 48828,125 52734,375
    32 30303,0303 37878,78788 45454,54545 41666,66667 47348,48485 51136,36364
    33 29411,76471 36764,70588 44117,64706 40441,17647 45955,88235 49632,35294
    34 28571,42857 35714,28571 42857,14286 39285,71429 44642,85714 48214,28571
    35 27777,77778 34722,22222 41666,66667 38194,44444 43402,77778 46875
    36 27027,02703 33783,78378 40540,54054 37162,16216 42229,72973 45608,10811
    37 26315,78947 32894,73684 39473,68421 36184,21053 41118,42105 44407,89474
    38 25641,02564 32051,28205 38461,53846 35256,41026 40064,10256 43269,23077
    39 25000 31250 37500 34375 39062,5 42187,5
    40 24390,2439 30487,80488 36585,36585 33536,58537 38109,7561 41158,53659
    41 23809,52381 29761,90476 35714,28571 32738,09524 37202,38095 40178,57143
    42 23255,81395 29069,76744 34883,72093 31976,74419 36337,2093 39244,18605

    Бросается в глаза цифра 62500 и она действительно «волшебная». Теперь можно полностью исключить из пазла проблему несогласованности частот.

    Краткое резюме. AtMega16U2 должна работать только с кварцем 16MHz с частотой USART 62500 UBRRL=15. AtMega2560 может работать с разными кварцами обеспечивающими частоту USART ровно 62500, таких кварцев много.

    Для прошивки Arduino-usbserial-atmega16u2-Mega2560-Rev3_16MHz_62500.hex задаём частоту USART 62500. Ищем 19F420E130E0 и 20E1 исправляем на 2FE0 чек сумма 28.
    Для stk500boot_v2_mega2560_25MHz_62500.hex задаём ту же частоту 62500. Ищем C00080E18093C40088E18093 и 80E1 меняем на 88E1 чек сумма 9С. Прошиваем обе микросхемы, запускаем заливку прошивки с компьютера через USB и снова мимо:

    Согласно boards.txt передача данных с компьютера на AtMega16U2 происходит на 115200, с AtMega16U2 на AtMega2560 на 57600(по факту 58823). Предыдущие прошивки AtMega16U2 и AtMega2560 установили частоту USART обмена между собой на 62500, логично предположить, что скорость передачи данных с компьютера на AtMega16U2 нужно изменить на 125000. Меняем запускаем:

    Прошивка загрузилась, pronterface работает.
    Следующие 3 раза прошивка не загружалась.
    После того, как был убран крокодил минуса осциллографа с земли ISP разъёма AtMega16U2 всё стало быстро загружаться, но наблюдались ошибки:

    После пере подключения USB снова не загружается

    После пере подключения и нажатия reset на плате загрузка пошла:

    Пробуем снизить «волшебную» универсальную частоту 62500 до 31250 также универсальная для разных кварцев:
    Для прошивки Arduino-usbserial-atmega16u2-Mega2560-Rev3_16MHz_31250.hex задаём частоту USART 31250. Ищем 19F420E130E0 и 20E1 исправляем на 2FE1 чек сумма 27.
    Для stk500boot_v2_mega2560_25MHz_31250.hex задаём ту же частоту 31250. Ищем C00080E18093C40088E18093 и 80E1 меняем на 81E3 чек сумма A1. Прошиваем, устанавливаем mega.menu.cpu.atmega2560.upload.speed=62500. Проверяем:

    Ситуация та же, но всё как и ранее загрузилось. Нажимаем reset и снова производим загрузку:

    После пере подключения всего и попытке загрузки в уже прошитую AtMega2560 снова:

    Нажимаем reset, загрузка и всё ОК:

    Пробуем 27MHz

    Для прошивки Arduino-usbserial-atmega16u2-Mega2560-Rev3_16MHz_31250.hex задаём частоту USART 31250. Ищем 19F420E130E0 и 20E1 исправляем на 2FE1 чек сумма 27.
    Для stk500boot_v2_mega2560_27MHz_31250.hex задаём ту же частоту 31250. Ищем C00080E18093C40088E18093 и 80E1 меняем на 85E3 чек сумма 9D. Прошиваем, устанавливаем mega.menu.cpu.atmega2560.upload.speed=62500. Проверяем:

    Ни в какую работать не хочет.

    Можно использовать и 25MHz кварц, но, на всякий случай ищем тот, с которым не будет ошибок. По хорошему нужно с прошивкой разбираться. Лучшим вариантом будет использование вместо AtMega16U2 аппаратного преобразователя USB в USART, микросхема CP2104. Поддерживается всеми операционными системами, надёжен, проверен, доступен, не требует прошивки. Но в QFN корпусе.

    Пробуем кварц 24MHz

    Кварца 24MHz не оказалось, был кварцевый генератор.
    Для прошивки Arduino-usbserial-atmega16u2-Mega2560-Rev3_16MHz_31250.hex задаём частоту USART 31250. Ищем 19F420E130E0 и 20E1 исправляем на 2FE1 чек сумма 27.
    Для stk500boot_v2_mega2560_24MHz_31250.hex задаём ту же частоту 31250. Ищем C00080E18093C40088E18093 и 80E1 меняем на 8FE2 чек сумма 94. Прошиваем, устанавливаем mega.build.f_cpu=24000000L и mega.menu.cpu.atmega2560.upload.speed=62500. Создаём таблицы speed_lookuptable_ для 24MHz
    Проверяем:

    Всё работает. Но непонятная ошибка осталась. Значение ошибки зависит от частоты кварца. На 24MHz загрузка происходит всегда и без задержек в начале загрузки. Но это не означает, что AtMega2650 не будет работать на 27MHz.

    Остановился на 24MHz c 31250герц скоростью обмена между 16U2 и 2560. Можно частоту увеличить до 62500. Разницы между 31250 и 62500 не заметно, разве на 31250 прошивка длится в 2 раза дольше.

    Пробовал AtMega16U2 менять на аппаратный преобразователь USB в USART на базе CP2104, чтобы исключить необходимость дополнительной доработки прошивок при работе с разными кварцами. На время эксперимента AtMega16U2 снималась с платы. Фокус удался частично. Передача данных от компьютера(pronterface) в Arduino не идёт, но приём идёт. Если нажать на reset кнопку Arduino, то в pronterface выдаются все сообщения как при подключении и устанавливается соединение. Если плата Arduino AtMega2560 не подключена к принтеру, то она на команды не реагирует. Т.е. всё должно работать, но для установления связи по USB с компьютером(pronterface) нужно нажимать reset на плате Arduino AtMega2560. Решено на этом закругляться. Выбрал кварц 24MHz со штатным загрузчиком. Но если кому интересно, то через аппаратный преобразователь можно 27MHz и более кварц повесить, с возможностью работы через pronterface с 3D принтером. Ниже фото стенда проверки работы с аппаратным преобразователем:

    Fuse по умолчанию для AtMega2560

    Fuse по умолчанию для AtMega16U2

    Arduino AtMega2560 кварц 24MHz + Marlin. Краткая инструкция

    Повторюсь, 24MHz кварц использовать нецелесообразно, появляются прерывистые движения кареток, связано, скорее, с не равномерным натяжением ремней. На низких скоростях печати, на определённом токе и напряжении питания драйверов менее 26VDC прерывистое движение не наблюдается. Проблема прерывистого движения может быть и в драйверах. Пока особых преимуществ использования 24MHz кварца не обнаружилось. Использование более высокой частоты тактирования должно убрать тормоза управления принтером во время печати и позводит добавить второй хотэнд для дельта принтера. Пока единственное преимущество 24MHz -перестало меню жутко тормозить во время печати. Разбираться с прерывистым движением планирую через использование промышленных драйверов, возможно попробую поставить ШВП.

    Как описывалось в начале статьи производим замену smd кварца на «лодочку» 24MHz с дополнительной установкой чип конденсаторов 12-15pf. Если удастся найти, то можно установить кварц такого же типа. Не принципиально какого типа резонатор, самому пришлось кварцевый генератор на 24MHz ставить, под рукой не оказалось кварца на эту частоту, да так и оставил.

    Редактируем файл Arduino IDE С:\arduino-1.6.13\hardware\arduino\avr\boards.txt меняем 2 параметра «mega.build.f_cpu=24000000L» -Частота кварца AtMega2560 и «mega.menu.cpu.atmega2560.upload.speed=62500» -Частота USART обмена между USB и AtMega16U2.

    Корректируем файл «speed_lookuptable.h» marlin проекта или копируем с заменой предлагаемый, содержит частоты 24, 25, 27MHz, к уже имеющимся 16 и 20MHz.

    Прошиваем AtMega16U2 и AtMega2560 прошивками бут загрузчиков Arduino-usbserial-atmega16u2-Mega2560-Rev3_16MHz_31250.hex и stk500boot_v2_mega2560_24MHz_31250.hex соответственно.
    Запускаем проект в Arduino IDE, заливаем прошивку. На ошибки, после заливки не обращаем внимания.
    Всё будет работать штатно.

    Если говорить в целом, то «гнать» контроллеры не хорошо. Для личного пользования, исследования, развлечения, пожалуйста, но в областях связанных с промышленной автоматизацией, медицинских применениях и других областях, влияющих на безопасность жизнедеятельности человека, ни в коем случае.

    Источник

    Adblock
    detector