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

в 14:26, , рубрики: arduino, diy или сделай сам, ln2, жидкий азот, разгон, Электроника для начинающих, метки: , , ,

Разгон 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 рублей за литр. Теперь я точно знаю, что хочу себе на день рождения Разгон Arduino. Под жидким азотом. 20 ⇒ 65.3Mhz @  196 °C

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

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

На physics.stackexchange.com/ подсказали, что термоизоляцию нужно делать наоборот — надевать сверху, а не снизу. Чтобы испаряющийся азот охлаждал внешнюю стенку термоса.
Разгон Arduino. Под жидким азотом. 20 ⇒ 65.3Mhz @  196 °C

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

Пришлось написать тест, который тестирует чтение/запись в SRAM, чтение из flash, арифметические операции и program flow тест (с ветвлениями). Идея тестов — была найдена последовательность команд, которая выводит систему из начального состояния, и затем через определенное количество шагов — приводит в исходное. Скачать законченный стресс-тест можно тут.

Смотреть тесты

void run_flow_test()
{
  for(int repeat=0;repeat<250;repeat++)//We are aiming at ~10 benches per second
  {
    //Program flow check
    //Magic loop which after 93 itterations yields same value
    for(unsigned char i=0;i<93;i++)
    {
      flow_check=(flow_check<<1) + (flow_check>>7) + 25;
      if(flow_check&8)
        flow_check^=4;
      else
        flow_check^=16;
      flow_check=flow_check ^ 192 + 1;
    }
  }
}

void run_mul_test()
{
  for(int repeat=0;repeat<350;repeat++)//We are aiming at ~10 benches per second
  {
    //Multiplication check
    for(unsigned char i=0;i<64;i++)
    {
      mul_check=mul_check*(mul_check-1);
      mul_check=mul_check*(mul_check+1)+2;
    }
  }
}

void run_flash_test()
{
  for(int repeat=0;repeat<1000;repeat++)//We are aiming at ~10 benches per second
  {
    //flash_check
    for(unsigned char i=0;i<16;i++)
    {
      flash_check=(flash_check ^ svalue1) + svalue2;
      flash_check=(flash_check<<((svalue3+flash_check)&7)) + (flash_check>>((svalue3+flash_check)&7)) + svalue4;
    }
  }
}

void run_sram_test()
{
  for(int repeat=0;repeat<10;repeat++)//We are aiming at ~10 benches per second
  {
    //SRAM check
    for(int i=0;i<2405;i++)
    {
      value1=(value1+value2+value3+value4+sram_check)&1;
      value2=(value2+value1+value3+value4+sram_check)&1+1;
      value3=(value3+value1+value2+value4+sram_check)&1+2;
      value4=(value4+value1+value2+value3+sram_check)&1+3;
      sram_check=(sram_check<<1)+(sram_check>>7)+value1+value2+value3+value4;
    }
  }
}

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

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

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

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

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

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

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

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

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

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

При охлаждении до -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-логики ограничена скоростью заряда/разряда паразитных конденсаторов (емкости затвора транзисторов и металлических соединений). А т.к. при уменьшении температуры снижается сопротивление металлов — может повыситься скорость работы, особенно если в схеме критичный по скорости участок — это были какие-то длинные цепи.

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

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

После всех этих приготовлений — медленно заливаю Arduino жидким азотом, слышу как там похрустывают соединения, и вдруг — гаснет подсветка экрана, и затем плата «зависает». Я подумал было, что это конец. Затем выяснилось, что если немного приподнять плату над азотом, чтобы она так сильно не охлаждалась — подсветка загорается снова, и плата работает. С трудом удалось поразгонять, до ~50Мгц. Но конечно результат был не надежным, т.к. температура микроконтроллера была непостоянной.

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

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

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

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

На воздухе — плата мгновенно покрывается инеем:
Разгон Arduino. Под жидким азотом. 20 ⇒ 65.3Mhz @  196 °C

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

А остатки жидкого азота встретятся лицом к лицу с горячей водой:

Резюме

  • Arduino под жидким азотом разгоняется до 65.3Мгц, а на воздухе — только до 32.5-37Мгц. AVR короткое время спокойно работает при напряжении 8 Вольт.
  • Удалось разобраться как изменяются параметры электронных компонент при глубоком охлаждении: падение сопротивления металлов в ~8.5 раз, падение емкости конденсаторов (электролитов, керамики Y5V и немного X7R. Емкость NP0 не изменяется), увеличение ширины запрещенной зоны полупроводников (рост падения напряжения диодов, изменение цвета светодиодов, очень большие изменения в работе аналоговых схем)
  • При разгоне «больших» процессоров — нужно внимательно следить за температурой конденсаторов (электролитов и дешевых керамических с диэлектриком Y5V). Она не должна падать ниже нуля — даже если для этого придется устанавливать дополнительный подогрев. Иначе они потеряют почти всю емкость, и процессор будет терять стабильность.
  • Ни одна Arduino не пострадала в процессе написания статьи. После отогревания и высыхания — продолжила работать, как и раньше :-)

Автор: BarsMonster

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js