![](https://habrastorage.org/getpro/habr/post_images/b97/99e/40d/b9799e40d2e5c103969c8e8d312b658b.jpg)
1) Какой в этом практический смысл? Разобраться в том, как ведет себя электроника при криогенных температурах, да и просто интересно сколько можно выжать из 20Мгц AVR-ки :-) Удалось выяснить момент, крайне важный и для разгона настольных процессоров с криогенным охлаждением.
2) Почему Arduino, ведь есть же куча микроконтроллеров быстрее, а i7 вообще всех рвет? Совершенно верно. Есть куча намного более современных микроконтроллеров, которые на 2-3 порядка быстрее (и они есть у меня в наличии). Однако Arduino получила большую известность среди любителей, потому было решено мучить именно её. А для практических применений конечно дешевле и проще взять более быстрые микроконтроллеры (Cortex-M3, M4).
Разгон микроконтроллера под жидким азотом обещает быть несколько сложнее разгона «настольных» процессоров — ведь тут нет ни тестов стабильности, ни программируемого генератора тактовой частоты, ни управления напряжением питания. Да и компоненты на Arduino, как показала практика, не выдерживают криогенных температур — и с ними придется разбираться в индивидуальном порядке. Все эти проблемы к счастью удалось решить.
Жидкий азот
Давно хотел до него дорваться. Оказалось, в Москве его продают несколько компаний. Ближе всего был НИИ КМ, там азот по 50 рублей за литр. Некоторые компании не морщась за 5 литров просят 950 рублей — с ними нам конечно не по пути.Жидкий азот получают буквально из воздуха — сжижая его и разделяя на ректификационной колонне, или наоборот — сначала выделяя азот из воздуха специальными фильтрами, и затем сжижая. Как оказалось, продаются даже небольшие установки по производству жидкого азота (10 литров в день). Себестоимость производства по электроэнергии — 5-10 рублей за литр. Теперь я точно знаю, что хочу себе на день рождения!
![](https://habrastorage.org/getpro/habr/post_images/ece/c32/90c/ecec3290cfe5e6d19a5514280b05be3d.jpg)
![](https://habrastorage.org/getpro/habr/post_images/a13/875/58d/a1387558dcbe856f81e1cefa4567ecc5.jpg)
Переносить азот можно в обычных стальных термосах (стеклянные могут треснуть от резкого падения температуры). После дополнительного утепления (+1 сантиметр теплоизоляции и полиэтилен для защиты от конденсата) азот выкипал за 30 часов, что в принципе достаточно для работы. Покупать специальный сосуд Дьюара — достаточно дорогое удовольствие, хотя азот из маленьких (~5 литров) «правильных» сосудов Дьюара выкипает уже за 25 дней. Также нужно помнить, что ни в коем случае нельзя герметично закрывать жидкий азот — разорвет в клочья.
На physics.stackexchange.com/ подсказали, что термоизоляцию нужно делать наоборот — надевать сверху, а не снизу. Чтобы испаряющийся азот охлаждал внешнюю стенку термоса.
![](https://habrastorage.org/getpro/habr/post_images/d9b/be7/175/d9bbe71758b197c6c97fdde54f51546f.jpg)
Нагрузочное тестирование
Пришлось написать тест, который тестирует чтение/запись в 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-а требуемое напряжение для зажигания стало выше напряжения питания, об этом ниже).
![](https://habrastorage.org/getpro/habr/post_images/741/f3b/ee8/741f3bee82e71f81aae7202dc31eafaf.jpg)
Генератор тактовой частоты
Arduino по умолчанию работает от кварца. Кварцы на первой гармонике обычно работают не выше 30Мгц, потому работа с внешним генератором неизбежна. Чтобы не паять саму плату Ардуины — я отогнул 2 ноги, к котором подключается кварц, и припаял контакт к внешней тактовой частоте. Ну и нужно было изменить fusе-ы для работы от внешнего генератора, для чего нужен отдельный программатор (в моем случае — TL866CS MiniPro). Об этом я конечно подумал уже после отгибания ног, и в программатор микроконтроллер пришлось ставить с костылями. На снимке слева — виден также китайский модуль DCDC на LM2596, которым я изменял напряжение питания.![](https://habrastorage.org/getpro/habr/post_images/7e9/987/0bc/7e99870bc022064fc06e6e736ef1783a.jpg)
Генератора сигналов до 100Мгц у меня конечно не было — недешевое это дело. Перестраиваемый генератор, способный генерировать в нужном мне диапазоне (16-100Мгц) со скважностью 50% удалось собрать только с 4-й попытки. Оказалось, многие генераторы на логических элементах — или имеют слишком низкую максимальную частоту, или нестабильны на высоких частотах (некоторые импульсы случайно становятся короче/шире). В конце концов следующая схема надежно генерировала во всем требуемом диапазоне. Резистор R1 на выходе — частичное последовательное терминировавшие, чтобы overshot тактового сигнала на стороне микроконтроллера был не такой страшный. Нам предстоит работа на повышенном напряжении, так и сжечь микросхему можно (при «резком» сигнале амплитудой 8V — мгновенные «выбросы» на стороне микроконтроллера были бы до 16 вольт).
![](https://habrastorage.org/getpro/habr/post_images/272/449/6c6/2724496c6a6ba4857c000245af7d2603.png)
![](https://habrastorage.org/getpro/habr/post_images/a89/71b/7b9/a8971b7b9ffdc37461ac74ff07309e90.jpg)
Особенности работы электроники при криогенных температурах
При охлаждении до -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 литра азота.
![](https://habrastorage.org/getpro/habr/post_images/ace/4f2/f8e/ace4f2f8e59d2f652387ff2cb3ebd436.jpg)
![](https://habrastorage.org/getpro/habr/post_images/004/c12/719/004c12719fe795be18b9d007ab21c577.jpg)
![](https://habrastorage.org/getpro/habr/post_images/5d6/b0b/7b4/5d6b0b7b442c5b50b5b56329050207e8.jpg)
На воздухе — плата мгновенно покрывается инеем:
![](https://habrastorage.org/getpro/habr/post_images/f8f/753/3e3/f8f7533e3ac7a39b22f635d1d15260a7.jpg)
На видео тест на частоте 65Мгц начинается на 7:12, вид работы Arduino под слоем жидкого азота — на 9.00.
А остатки жидкого азота встретятся лицом к лицу с горячей водой:
Резюме
- Arduino под жидким азотом разгоняется и стабильно работает более часа на частоте 65.3Мгц, а на воздухе — только до 32.5-37Мгц. AVR короткое время спокойно работает при напряжении 8 Вольт.
- Удалось разобраться как изменяются параметры электронных компонент при глубоком охлаждении: падение сопротивления металлов в ~8.5 раз, падение емкости конденсаторов (электролитов, керамики Y5V — в тысячи раз, X7R — на 2/3. Емкость NP0 не изменяется), увеличение ширины запрещенной зоны полупроводников (рост падения напряжения диодов, изменение цвета светодиодов, очень большие изменения в работе аналоговых схем)
- При разгоне «больших» процессоров — нужно внимательно следить за температурой конденсаторов (электролитов и дешевых керамических с диэлектриком Y5V). Она не должна падать ниже нуля — даже если для этого придется устанавливать дополнительный подогрев. Иначе они потеряют почти всю емкость, и процессор будет терять стабильность.
- Ни одна Arduino не пострадала в процессе написания статьи. После отогревания и высыхания — продолжила работать, как и раньше :-)
PS. Из других экспериментов с жидким азотом — фосфоресценция сахара зеленым светом. А если будете разбивать фрукты — убирайте осколки ДО того, как они превратились в разбросанную по всей комнате фруктовую кашу
![](https://habrastorage.org/getpro/habr/comment_images/589/4ca/0c9/5894ca0c9e7ef627bfd7178b08017a4b.gif)
PS: Если кто знает, где можно приобрести образцы сверхпроводников — напишите. То что я нашел — чудовищно дорого.
PS: Обсуждение на Reddit