Программно-аппаратный универсальный вольтмодблок. Концепция и макет
реклама
Содержание:
Вступительное слово
Концепция
Что нам потребуется : HARDWARE
Что нам потребуется : SOFTWARE
Что нам потребуется : оборудование
Измерения : схема и подопытные кролики
Измерения : напряжение
Измерения : ток
Измерения : температура
Вольтмод
Передача, прием и обработка данных
Подводим итог первой части
Все когда-нибудь что-то делают в первый раз. Если говорить о техническом творчестве и настройке компьютера, то возникающее желание попробовать что-то настроить или улучшить часто упирается в необходимость дополнительных длительных поисков информации и изучения множества нюансов. Это запросто может отбить всякую охоту изучить вопрос более детально. И мы, сообщество людей, увлеченных компьютерами, можем навсегда потерять такого человека для нашего круга, имея в виду, что вокруг имеется множество альтернативных возможностей, на что потратить свое время.
Чтобы умы, находящиеся на распутье и ищущие, чем бы заняться, направить в правильное русло и написана эта статья. Она не претендует на пошаговое руководство, но достаточно подробно описывает концепцию и создание действующего макета универсального вольтмодблока для компонентов компьютера, которое может послужить основой для собственной тропинки на этом увлекательном и познавательном пути. По крайней мере, если не в мир оверклокинга, то в мир технического творчества.
Ввиду достаточного обширного материала, он будет разбит на две части. В первой части мы рассмотрим обоснование проблемы созданя вольтмодблока и подходов к реализации, принципы построения схемы и создадим упрощенный действующий макет. Во второй части расширим и усложним все то, что наработано в первой части статьи, более подробно об этом будет рассказано в главе «Измерения : схема и подопытные кролики».
С точки зрения оверклокинга, вольтмод — это изменение напряжения на компонентах, входящих в состав компьютера, или элементах этих компонентов, по сравнению с напряжениями, установленными разработчиком. Вольтмод делается несколькими способами, самый простой, понятный и доступный для выполнения — это программный, с помощью опций BIOS или различных специальных утилит. Производитель компонентов может сделать эту возможность доступной для пользователя, но это случается далеко не всегда.
Довольно часто в бюджетных материнских платах производитель в доступные опции BIOS закладывает ограничения по изменению напряжения на внутренних компонентах — процессоре, памяти, мостах и т.д. В последнее время наметилась положительная тенденция в этом вопросе, тем не менее, на руках пользователей огромное число материнских плат и видеокарт, серьезно ограничивающих возможность получения максимальной производительности. В первую очередь, это относится к напряжению на процессорах и памяти.
Между тем, на каждой материнской плате регулировка этого напряжения предусмотрена, так как ассортимент процессоров широк и они требует различного напряжения питания. Поэтому, при включении, плата умеет самостоятельно определять тип процессора и выставлять требуемое напряжение для конкретного типа процессора, если этот процессор ей «знаком». Если информация о параметрах процессора в BIOS отсутствует, то, как правило, плата не стартует.
Многие материнские платы не предоставляют возможности пользователю отойти от номинального напряжения, некоторые предлагают «логические уровни» вроде 10% разгона или прочие подобные предложения, даже не раскрывая информацию о том, что, как и где будет увеличено.
Существуют несколько способов обхода такой неприемлемой для оверклокера ситуации, для разных типов процессоров и платформ, то есть методы могут различаться для платформ Intel и AMD, различных видеопроцессоров и т.д. Разумеется, что-то новое придумать в сфере вольтмода крайне сложно, но вот организационную сторону и эргономику улучшить можно. Впрочем, у каждого свое понимание понятия удобств в работе и путей их достижения, поэтому некоторая сложность описываемого подхода может и не перевесить временных и прочих затрат на его реализацию. Тем не менее, по крайней мере, как возможный вариант, описанный ниже подход имеет право на жизнь.
Названием «универсальный вольтмодблок», подчеркивается, что предлагаемый способ представляет некий «универсальный» подход к регулировке, имея в виду независимые каналы, инвариантные к типу платформы и оборудованию, впрочем несколько условий должно выполняться.
Поэтому сначала кратко рассмотрим, как практически формируются питающие цепи силовых элементов компонентов компьютера.
Напряжения питания современных ЦПУ, ГПУ и памяти обычно лежат в пределах 0.5..2.5В, если не рассматривать вымирающую память DDR1 или экзотические варианты. Это требует преобразования DC-DC, то есть требуемые напряжения должны получаться из стандартного ряда питающих напряжений ПК 3.3В, 5.0В и 12В, которое обеспечивает внешний (по отношению к материнской плате или видеокарте) блок питания. Для условного процессора с TDP 100Вт и напряжением питания 1В преобразователь DC-DC должен обеспечивать ток не менее 100А. То есть, потребляемый ток даже энергосберегающего процессора будет измеряться несколькими десятками ампер.
Преобразовать имеющееся напряжение блока питания в требуемое напряжение можно путем линейного понижения и стабилизации, либо импульсным преобразованием.
Оба варианта часто реализуются с использованием микросхем, ассортимент их достаточно велик, и схематически это выглядит так:
Линейное и импульсное регулирование
Транзистор Q3 работает в линейном преобразователе и стабилизаторе напряжения, Q1 и Q2 - в импульсном. Нас, так как мы не конструируем такой блок, внутренние процессы "черного ящика" - микросхемы будут не очень волновать, но для понимания принципов работы рассмотрим вышеприведенную схему более подробно с точки зрения того, как регулируется выходное напряжение.
Линейная схема питания выглядит следующим образом, рассмотрим ее на примере APW7067N от фирмы Anpec:
APW7067N управляет напряжением на видеопамяти в референсном дизайне видеокарты GF8600GT
На номиналы и конкретные типы элементов и напряжения мы здесь обращать внимания не будем, а рассмотрим работу импульсного преобразователя в очень упрощенном виде.
Что касается лмнейного преобразователя, то нас будут интересовать только два вывода 5 и 6 и все, что к ним относится влевом нижнем углу.
Тут нужно вспомнить этимологию слова «транзистор» - TRANsient reSISTOR, введенного в обиход в 1948 году (некоторые источники ссылаются на то, что это комбинация слов transfer и resistor). Что означает, в некоторой обработке, управляемое переходное сопротивление. То есть, транзистор, при приложении напряжения к затвору имеет свойство менять электрическую проводимость по «рабочему пути» исток-сток. Изменение этой проводимости и позволяет, при последовательном подключении нагрузки, добавлять или снижать ток в этой цепи.
Для стабилизации выходного напряжения, нужно знать, как это напряжение изменилось по отношению к некоторомй значению, принятому за номинальное напряжение на нагрузке. Для этого внутри микросхемы имеется стабилизированное опорное, или референсное, напряжение, а информация о текущем выходном напряжении получается с резистивного делителя и подается на схему сравнения с референсным напряжением. При номинальном выходном напряжении текущее напряжение, снимаемое с делителя, равно референсному.
Изменение тока нагрузки приводит к изменению выходного напряжения, изменяется напряжение, снимаемое с делителя, поступающее на вход FBL, и на затвор транзистора подается напряжение, "приоткрывая" или "призакрывая" его, путем соответствующего изменения проводимости. Таким образом и осуществляется стабилизация напряжения при линейном регулировании. Подстроить выходное напряжение можно изменением соотношения сопротивлений резисторов делителя R4-RGND2.
Но этот способ, при всей его простоте имеет, как минимум, два основных недостатка.
Во-первых, ток нагрузки постоянно протекает через рабочий переход транзистора. Если питать линейный стабилизатор от наименьшего напряжения, обеспечиваемого блоком питания, то есть, 3.3В, то, при токе 100А и требуемом напряжении в 1В, на этом транзисторе надо будет рассеивать мощность (3.3 — 1.0)* 100 = 230Вт. Рассеять такую мощность, отвести тепло от материнской платы и вывести его за пределы корпуса задача хоть и решаемая, но непростая и значительно ухудшит массогабаритные параметры и потребительские качества устройства. Кроме того, что в компьютере и без этого достаточно элементов, которые нагревают все вокруг, это означает и очень низкую энергоэффективность такого регулирования.
Во-вторых, современные блоки питания ПК продолжительный ток в 100А ни по какой стандартной линии не смогут обеспечить.
Таким образом, линейная стабилизация при таких условиях неприемлема. Конечно, там, где не требуется больших токов и не стоит вопрос о тепло- и энергоэффективности, линейные стабилизаторы успешно применяются.
Существенно повысить КПД и снизить тепловыделение на управляющих элементах позволит применение импульсных регуляторов напряжения. Типовая схема такого источника питания может быть рассмотрена на остальной части вышеприведенной схемы APW7067N.
Микросхема обеспечивает генерацию противофазных управляющих импульсов с регулируемой длительностью на выводах UGATE (Upper Gate) и LGATE (Low Gate), попеременно открывающих транзисторы Q1 и Q2, источником питания служит напряжение блока питания ПК 12В, обозначенное VIN1. Нагрузка подключается к точке VOUT1, номинальное напряжение условно выбрано 1.2В.
Смысл противофазных управляющих импульсов для поочередного открытия транзисторов Q1 и Q2 состоит в том, чтобы заставить дроссель L накапливать энергию и затем отдавать ее в нагрузку. Когда верхний транзистор открыт, ток от источника VIN1 течет по цепи +VIN1 → Q1 → L→ COUT1 и нагрузка → -VIN1. После того, как верхний транзистор закроется и ток от источника VIN1 в катушку не поступает, то, по законам физики, электрическая энергия, запасенная в индуктивности L (в момент открытого верхнего транзистора), идет по пути, который поддерживает прежнее направление тока. Для того, чтобы цепь замкнулась и ток пошел на сглаживающий конденсатор и в нагрузку, на короткое время открывается нижний транзистор, обеспечивая замкнутую цепь и протекание тока по пути L → COUT1 и нагрузка → Q2 → L.
Частота переключения транзисторов (определяется номиналом резистора, подключенного к выводу FS_DIS) обычно находится, для разных схем, в пределах 200-700КГц, что позволяет получить малые габариты дросселя и устройства в целом, высокий КПД и низкое тепловыделение на ключах Q1 и Q2. Рассеиваемая мощность на транзисторах определяется маленьким напряжением насыщения и кратковременным импульсным током, и, в сравнении с линейным регулятором,при одинаковом выходном токе и напряжении, может быть на несколько порядков ниже.
Выходное напряжение определяется, при расчетных нагрузке, частоте и индуктивности дросселя, отношением временем нахождения транзисторных ключей Q1 и Q2 в открытом состоянии к длительности периода следования управляющих импульсов. Таким образом, задача стабилизации напряжения состоит в том, чтобы постоянно замерять выходное напряжение VOUT1, брать от него какую-то часть (в номинальном режиме равную внутреннему референсному напряжению), и сравнивать с референсным. Сигнал рассогласования подается на схему формирования длительности противофазных импульсов на выводах UGATE и LGATE. Соотношение длительности и паузы этих импульсов и будет определять выходное напряжение VOUT1.
Можно временно отвлечься от вышеприведенных схем и рассмотреть абстрактный принцип широтно-импульсной модуляции, который обычно применяется в таких схемах.
Допустим, при «правильном» напряжении на нагрузке импульсы имеют скважность 50% (длительности сигнала и паузы одинаковы). Такая длительность импульсов будет номинальной и соответствовать верхней осциллограмме на рисунке.
При необходимости компенсировать падающее выходное напряжение (например, при увеличении тока нагрузки), длительность импульсов, держащих транзистор в открытом состоянии, нужно увеличивать, по отношении к периоду сигнала, импульсы будут примерно такими, как на нижней осциллограмме.
Соответственно, при уменьшении нагрузки, длительность импульсов по отношению к периоду их следования соответственно уменьшается и, например, соотношение времени нахождения ключа в открытом и закрытом состоянии будет похоже на осциллограмму, изображенную посередине.
Можно отметить, что период (следовательно, и частота) следования импульсов во всех трех случаях одинакова.
На самом деле, приведенные выше графики утрированы и не в полной мере относятся к рассматриваемой схеме и приведены лишь для иллюстрации принципа работы.
Управление выходным сигналом таким способом называется широтно-импульсной модуляцией (ШИМ, по-английски pulse width modulation — PWM), и широко используется для эффективной регулировки и стабилизации напряжения в блоках питания и различных системах управления, в частности, всем хорошо знакомы вентиляторы с регулировкой оборотов посредством ШИМ.
Выходное напряжение VOUT1 в микросхему APW7067N подается на контакт FB (FeedBack — обратная связь) через делитель напряжения R1-RGND1, снижающий VOUT1 до величины внутреннего референсного напряжения в номинальном режиме работы. Внутреннее референсное напряжение равно 0.8В. Разница (0.8В — напряжение FB) усиливается усилителем ошибки и подается на внутренние схемы формирования длительности и фазы выходных импульсов.
Типовой подход при вольтмоде на увеличение напряжения — снизить номинал RGND1, чтобы понизить напряжение обратной связи и заставить выработать больший сигнал рассогласования и, соответственно, повысить выходное напряжение. Обычно это достигается или «закраской» графитовым карандашом поверхности резистора RGND1, который, как правило, имеет SMD корпус-брусочек, или путем подпайки, параллельно RGND1, подстроечного многооборотного резистора и плавным понижением общего сопротивления до нужного значения, при одновременном контроле напряжения на нагрузке.
На форумах иногда можно услышать совет о необходимой при этом манипуляции и с номиналом резистора R1, но все эти резисторы, совместно со встроенной или внешней RC цепью коррекции, включенной в контур обратной связи, определяет частоты среза и наклон передаточной характеристики внутреннего усилителя-компаратора, для обеспечения максимального подавления паразитных переходных колебательных процессов в процессе регулирования и стабилизации, и создают необходимые фазовые сдвиги. Их изменение требует перерасчета всей схемы, включая конденсаторы. Так что, чем меньше вносится изменений, тем лучше.
APW7067N применяется для регулировки напряжения в графических адаптерах, ее корпус содержит 14 выводов. Широко используются и другие типы микросхем, часто всего с восемью выводами. «Лишние ноги» у APW7067N из-за того, что в ее составе находится и линейный стабилизатор, о котором сказано выше. Также может отсутствовать внешний выход компенсации COMP, который, вместе с цепью коррекции, бывает спрятан внутрь микросхемы, может также отсутствовать и вывод BOOT (внешняя цепь формирования запускающего импульса).
Можно обратить внимание на наличие двух выводов «земли», GND и PGND, что, в случае относительно слаботочных регуляторов, бывает не всегда. Дело в том, что высокие токи создают значительное падение напряжения на сопротивлениях проводников печатных плат. Если замерять тестером напряжение процессора, подсоединив общий провод прибора к «земле» разъема Molex от блока питания, то разница напряжений, если сравнивать с «землей», взятой на выводах процессора, может составлять сотни милливольт, причем еще и меняться она будет по не зависящим от процессора причинам. Поэтому, при замере и регулировке напряжения, важно правильно выбирать точки замера и всегда стараться делать это максимально близко к нагрузке. В данном случае, PGND означает PCB GND и этот вывод должен подсоединяться к нагрузке проводником с максимальным сечением и минимальной длиной. Кроме места, нужно правильно выбрать и время измерения.
Как видно из приведенной типовой схемы включения, питание сделано по «однофазной» схеме, что пригодно только для видеокарт низшей ценовой категории и, следовательно, небольшой потребляемой мощности. Для мощных видеокарт и ЦПУ применяются «многофазные» схемы питания, когда несколько подобных схем работают параллельно. Для равномерной нагрузки на цепи питания и ослаблению требований к фильтрующим цепям делатся фазовое смещение управляющих импульсов для каждой пары ключей относительно друг друга.
В принципе, к каждому выводу UGATE и LGATE микросхемы управления можно подключить несколько транзисторов, но это потребует их тщательного подбора, так как условия работы верхнего и нижнего транзистора существенно разнятся, да и форма управляющего сигнала будет ухудшаться, поэтому такой подход обычно не практикуется.
Более распространена схема разделения, когда отдельно (физически или логически) используются один отдельный блок управления и ШИМ и отдельные блоки управления ключами (драйверы), по числу фаз, так как, для равномерной нагрузки блока питания, управляющие сигналы на каждую пару ключей буду сдвинуты по времени. К примеру, хорошо известная фирма Analog Devices выпускает наборы микросхем, как раздельно по спецификациям VRM Intel и AMD, так и удовлетворяющих требования к цепям питания обоих брендов. Для примера, ниже приведена принципиальная электрическая схема регулирования напряжения процессора AMD, где управляющей микросхемой выступает ADP3186, а драйверами ключей — ADP3110:
(кликните по картинке для увеличения)
ADP3186 устанавливалась, в частности, на ASUS M2N VM-DH, но вместо драйверов ADP3110 были применены ADP3418, которые производитель позиционирует как универсальные, для Intel и для AMD
Из схемы видно, что используется трехфазная схема питания, хотя ADP3186 генерирует до 4 сигналов PWM. Неиспользуемые выходы PWM соединяются с общим проводом и микросхема самостоятельно устанавливает новые оптимальные фазовые сдвиги для оставшихся выходов.
Еще раз хочется обратить внимание на важность правильного выбора места замера регулируемого напряжения, имея в виду правильное место подключения как «земли», так и «сигнального» провода. При токах в десятки ампер, неверно выбранная земля даст многие сотни милливольт хаотично меняющейся разницы, по сравнению с тем, когда сигнал снимается непосредственно с нагрузки. Поэтому, в ADP3186 имеется специальный вход FB RETURN, для обеспечения передачи на внутренние схемы сравнения максимально точного потенциала «земли» в районе нагрузки.
Логика схемы управления питания ЦПУ, хоть и более усложненная, осталась примерно такой же. Так как материнская плата обычно поддерживает несколько типов процессоров, то, при включении компьютера, процессор надо распознать, проверить, поддерживается ли этот процессор данной версией BIOS, затем сигналом VID выдать код для микросхем управления цепями питания ЦПУ. Для этого, в схему управления встраивается ЦАП, от пяти разрядов и выше, для точной установки и подстройки напряжения, причем зачастую это можно делать и в реальном масштабе времени, а не только при инициализации компьютера при включении (это может называться что-то вроде Loadline Calibration, используются другие похожие термины). А уж делать эту опцию доступной для пользователя, или нет, решает конкретный производитель материнской платы или дорогой видеокарты. Вход ЦАП получает сигналы от ЦПУ, через регистр-защелку или другие схемы управления. Диапазон регулировки напряжения определяется разрядностью ЦАП, пять битов дает 32 ступени регулировки. Расширить пределы подстройки, без увеличения аппаратной разрядности ЦАП, можно с помощью дополнительных ключей, подключающих калиброванные резисторы параллельно резистору RGND делителя, формирующего сигнал FB, по аналогии с принципом вольтмода в схеме питания с APW7067N, или дополнительным мультиплексированием.
Вмешательство в режим работы элементов электронной схемы чревато неприятностями. По крайней мере, их наверняка можно получить, если при вольтмоде с увеличением напряжения вовремя не остановиться. Как правило, постепенное увеличение напряжения, проводимое с целью повысить частоту работы элементов и при постоянном контроле за стабильностью, в краткосрочной перспективе не приводит к перманентным нарушениям работоспособности, так как сначала проявляются сбои в распознавании и синхронизации многочисленных управляющих сигналов и данных.
С другой стороны, увеличение напряжения приводит и к значительному (нелинейному) росту мощности и, соответственно, повышенному тепловыделению. К сожалению, не на всех теплонапряженных элементах материнских плат, видеокарт, блоков питания и других устройств имеются встроенные датчики контроля температуры. Иногда производитель это делает сознательно, так как многие кремниевые полупроводниковые микросхемы имеют рабочие температуры далеко за 100°С, но такие цифры могут шокировать неподготовленных пользователей. Тем не менее, контроль за тепловым режимом элементов, подвергающихся вольтмоду, и элементов цепей их питания (не только активных!) обязателен.
Стоит отметить, при многочисленных достоинствах импульсных DC-DC преобразователях, их недостаток, связанный с появлением паразитных «всплесков» напряжения питания как раз из-за импульсного характера потребляемого тока. Кроме пульсаций напряжения это еще и электромагнитное излучение. Требуется тщательная разводка проводников на PCB с тем, чтобы чувствительные к наводкам схемы ни по питанию, ни по «эфиру» не смогли получить такой уровень помех, который был бы способен нарушить их работу или ухудшить параметры. Одним из таких устройств является, к примеру, аудиокодеки, имеющиеся на большинстве материнских плат. Существуют несколько серийных плат, где неудачная разводка привела к серьезному повышению уровня шумов по сравнению с другими платами, использующими тот же кодек.
Но это всего лишь поиск «там, где светло». Гораздо хуже будет, если подобные помехи время от времени будут сказываться на распознавание сигналов и данных, передаваемых по многочисленным шинам PCB, что может приводить к непредсказуемому поведению компьютера и необъяснимым сбоям в его работе.
Таким образом, видится два подхода, в контексте рассматриваемой темы, к возможностям вольтмода элементов компьютера, использующих импульсные источники питания с типовым включением управляющих питанием микросхем.
Первый - подключение регулируемого электронным способом сопротивления вместо нижнего резистора в плече делителя, формирующего сигнал обратной связи о величине напряжения для схемы сравнения. Если понижающий вольтмод не требуется, то это можно сделать путем параллельного подключения к этому резистору, без его удаления.
Второй — если управляющая микросхема имеет логику работы с приемом информации VID от процессора (или внешней схемы управления), то представляется логичным вмешаться в этот процесс, установив мультиплексор. На одну группу входных линий мультиплексора будут подаваться сигналы с ЦПУ (или схемы управления материнской платы) с информацией о VID процессора, на другую группу входов - произвольно устанавливаемый (с ПК) VID-код. Желаемый в данный момент ввод VID (формируемый ЦПУ или ПК) также будет выбираться с ПК.
Выход мультиплексора подсоединяется к управляющая микросхеме, регулирующей напряжение питания.
Возможна также комбинация этих двух способов.
Разумеется, второй вариант возможен, если управляющая микросхема имеет корпус с планарным расположением выводов и с достаточно крупным корпусом, что верно для относительно старых плат, в противном случае практическая реализация этого метода становится почти невозможна.
Кроме того, схема управления питанием процессора с использованием VID требует быстродействующей логики, что также может ограничить наши возможности.
Немного может затруднить нашу задачу и способ передачи VID-сигнала в схему управления, если он будет идти не параллельной шиной, а последовательной, но, в принципе, это не будет сдерживающим фактором.
На основе приведенного выше краткого изложения о некоторых способах регулирования напряжения в целях вольтмода компьютерных компонентов, попробуем сформулировать свое видение параметров «универсального вольтмодблока». Такое устройство должно обеспечивать:
-
Дистанционное измерение напряжения в точках вольтмода и других интересующих местах, с правильной индикацией сотых долей вольта, общее одновременное число точек измерения — не менее 10
Дистанционное измерение температуры не менее, чем в десяти точках, с точностью ±1°С в диапазоне не хуже 0...100°С.
Возможность дистанционного изменения напряжения не менее, чем в 4-х точках, в первом приближении для CPU, RAM,GPU, VRAM.
Желательно иметь текущую информацию по потребляемому току элементов, подвергающихся вольтмоду
Желательно иметь текущую информацию об общем энергопотреблении компьютера
Вывод в реальном времени требуемого набора из измеренных параметров в виде цифровых значений и графиков на экране ПК.
Становится понятно, что внутри корпуса интересующего нас компьютера должен находиться электронный блок, который измеряет нужные параметры и подключенный к какому-либо интерфейсу этого компьютера. Кроме того, блок должен уметь получать команды, вводимые пользователем компьютера и соответственно реагировать.
Этот электронный блок - ничто иное, как микрокомпьютер, и может быть реализован практически на любом современном микроконтроллере широкого применения.
Измерения с точностью до сотых долей вольта объясняется тем, что в большинство подобных микроконтроллеров встроен 10-битный АЦП, что определяет шаг преобразования примерно в 5мВ при измеряемом диапазоне 0..5В. Повышение точности связано с усложнением схемы или с установкой внешних 12-битных АЦП, но такой подход мы детально рассматривать не будем, хотя и его вполне можно реализовать.
Подбором аппаратной и программной составляющих мы и займемся в следующих главах.
Аппаратную часть можно условно разделить на четыре части — датчики, управляющий блок микроконтроллера, плату согласования и ПК.
ПК
Про ПК говорить смысла нет, какой он есть, такой есть. Нужен свободный порт USB. Также будем считать, что ПК, связанный с микроконтроллером по USB, сам служит полигоном для разрабатываемого вольтмодблока, хотя это и не обязательно.
Управляющий блок микроконтроллера
Управляющий блок микроконтроллера будем основывать на микропроцессорной плате Arduino Duemilanovе. Выбор именно этого устройства также не принципиален, вполне можно собрать устройство на любом другом доступном микроконтроллере, и не только от ATmega, или же вообще сделать только систему ввода-вывода для ПК на дискретных элементах. Но, по трудозатратам, безусловно выигрывает вариант, если проблему начинать решать уже с собранной платой с микроконтроллером, готовой к применению.
В дальнейшем, раз в распоряжении автора оказался Arduino Duemilanovе, все описываемые разработки будут привязаны именно к Arduino, причем это может быть не только Arduino Duemilanovе, но и более старые модели (или более поздние, к примеру, Arduino Mega).
Принципиальная электрическая схема http://arduino.cc/en/uploads/Main/arduino-duemilanove-schematic.pdf. Дистрибутора в России можно найти по ссылке: http://www.linuxcenter.ru/shop/embedded/arduino/.
Arduino Duemilanovе
Наличие разъема внешнего питания и схем контроля и автоматического переключения питания, разъема для связи по USB, сигнальных светодиодов (Power, TX, RX и один для задач пользователя), кнопки сброса и нескольких однорядных колодок для подсоединения ко всем IO выводам микроконтроллера, делает эту плату удобным полигоном для разработки и отладки собственных устройств. Плюс к тому, можно отказаться от ПО Arduino и, через интерфейс ICSP (STK-500), программировать микроконтроллер от внешнего программатора.
Основой Arduino Duemilanovе 2009 является микроконтроллер Atmega328P, работающий на частоте 16МГц. На плате также установлена микросхема от FTDI FT232RL, обеспечивающая связь по USB путем создания виртуального COM-порта. Кроме того, эта микросхема обеспечивает стабилизированное выходное напряжение 3.3В с током до 50мА (на самой плате Arduino потребителей от этого источника нет). Кроме того, содержится сдвоенный ОУ LM358, включенный как компаратор, для выбора питающего напряжения. Если внешнее питание превышает 6В, то LM358 запирает T1 NDT2955, и пятивольтовый стабилизатор типа 269-5 (IC4) работает от внешнего напряжения (не более 20В), а не от напряжения, подаваемого по кабелю USB.
На пользовательскую программу отводится около 30 килобайт внутренней флэш-памяти, микроконтроллер имеет 2КБ статической памяти и 1КБ EEPROM, которая может хранить, например, данные для установленных по умолчанию параметрах вольтмодов. Забегая вперед, отметим, что вся наща программа легко уместится и в процессоры Atmega с объемом флэш-памяти в 8КБ.
Arduino Duemilanovе предоставляет и необходимый набор программных средств для облегчения разработки и отладки программ для микроконтроллеров серии Atmega. Причем разработка ведется на языке высокого уровня, знания ассемблера и тонкостей программирования внутренностей микроконтроллера не требуется.
В программное обеспечение входит среда разработчика — IDE, отладчик, загрузчик кода, и bootloader, позволяющий быстро загружать новые программы и сразу их выполнять, имеется множество коротких примеров на все случаи жизни и онлайн спавка по программированию, причем в двух вариантах — простая и расширенная.
Arduino конфигурирует микроконтроллер на 6 аналоговых входов (но они могут быть переконфигурированы и в цифровые входы-выходы), которые могут быть использованы для 10-битного аналого-цифрового преобразования, и на 14 линий цифрового IO. Причем шесть линий конфигурируются как выходы PWM c разрешением 8 бит.
Тут надо сделать ремарку, что шесть аналоговых линий не означают наличия внутри шести АЦП. Он всего один, шесть линий обеспечивается внутренним мультиплексированием, то есть они работают поочередно, но для пользователя «как бы одновременно».
Назначение выводов:
Слева на короткой стороне расположен разъем USB для связи с компьютером и ниже гнездо для подключения внешнего питания. Оно может находиться в пределах 6..20В, но производитель рекомендует не выходить за пределы 12В, во избежание перегрева транзистора линейной стабилизации напряжения. Однако, этот перегрев возможен, если только вы сильно нагружаете выходные цепи микроконтроллера, допускающие отдачу по каждому выходу 40мА, в случае отсутствия такой нагрузки (вероятно, речь может идти о суммарном отдаваемом токе около полуампера) никакой опасности перегрева нет. Я подключал к этому гнезду блок питания 18В от принтера Hewlett-Packard и при экспериментах не было не то что перегрева, а даже нагрева силовых транзисторов. Переключение с питания от USB на внешний источник происходит автоматически, если внешнее напряжение превышает 6В.
Справа на короткой стороне находится разъем ICSP для внешнего программатора, в случае, если вы пользуетесь ПО не от Arduino.
Сверху и снизу - колодки с гнездами, каждый вывод подписан и сразу понятно его назначение.
Внизу слева:
RESET — вывод сброса микроконтроллера, дублирует кнопку на плате (около разъема ICSP)
3V3 - источник питания 3.3В с током до 50мА, его формирует микросхема FT232, на плате потребителей от этого источника нет
5V — это напряжение питания платы, то есть то, что получилось после выбора между USB внешнего источника.
Gnd – два гнезда «земли» - общего провода. Надо помнить о гальванической связи с ПК, если питание идет по USB или подключены входы-выходы микроконтроллера к элементам компьютера.
Vin — дублирование положительного вывода разъема внешнего питания, сюда может быть подключен аккумулятор.
Внизу справа:
0...5 - аналоговые входы 0...5. Каждый из шести входов в аналоговом режиме представляет вход 10-разрядного АЦП. Время преобразования — около 100мкс, то есть максимальная частота оцифровки 10КГц.
Вверху:
0..13 (нумерация справа налево) — 14 цифровых входов-выходов (в отличие от аналоговых, они принимают и понимают только два логических состояния и уровня напряжения). Некоторые выводы имеют дополнительные предопределенные возможности, например цифровой контакт 0, запрограммированный на ввод, используется как линия приема (RX) при программных коммуникациях, а контакт 1, запрограммированный на вывод — как линия передачи (TX). Разумеется, пользоваться коммуникационными особенностями (RX-TX) не обязательно. Контакты 3,5,6,9,10,11 при программировании их как выходы, преконфигурированы как выходы ШИМ, длительность импульсов программируется от 0 до постоянного сигнала с 8-битной точностью, частота примерно 490Гц. Существуют и другие преконфигурированные выводы, например, 4-х проводный SPTI — интерфейс для подключения SD карт памяти, но мы его пока не рассматриваем. Кроме того, при необходимости, аналоговые входы могут быть переназначены как цифровые, при этом они адресуются как цифровые линии 14..19.
Далее на верхнем разъеме «земля» и вход AREF для подачи референсного напряжения для аналогоцифрового преобразования. По умолчанию в качестве референсного напряжения для АЦП используется внутреннее +5В.
Нумерация входов-выводов — внутренняя для Arduino и не совпадает с распиновкой микроконтроллеров Atmega.
На плате находятся 4 светодиода. Зеленого свечения — выше кнопки сброса, загорается в случае наличия питания +5В. Выше левого обреза микроконтроллера, в ряду SMD элементов, находятся два «связных» RX-TX светодиода оранжевого свечения, загорающихся при аппаратной связи Arduino по интерфейсу USB. Чуть выше, обозначенный на плате буквой «L», расположен еще один оранжевый светодиод, подключенный к цифровому выводу 13 и предназначенный для пользовательских контрольных операций, зажигаясь при выводе на 13 контакт высокого уровня.
Плата согласования
Для работы с подобными микропроцессорными платами в режиме отладки в качестве платы согласования (ПС) удобно использовать специальные «доски», имеющие множество гнезд и шин для быстрой сборки электрических схем без пайки, с набором перемычек и гибких соединителей. Вот пример того, как выглядит такое устройство для быстрого создания прототипов электронных узлов, не предъявляющих специальных требований к разводке:
Prototype board SD24N
Существуют множество вариантов такой продукции, именно про этот более подробно можно посмотреть на сайте: http://www.apogeekits.com/bread_board_2.htm
Вероятно, в скором времени, подобное устройство будет приобретено, но, в виду достаточно простой задачи, стоящей перед нами, макетирование и сопряжение с платой микроконтроллера будем делать сразу на односторонней печатной плате, которая также хорошо подходит для макетирования. К тому же, после отладки схемы на большой плате-прототипе, все равно потребуется изготовить компактную печатную плату.
Мы же будем использовать стандартный полуфабрикат, такие платы поставляются различного размера, имеют по всей площади ряды отверстий с шагом 2.54мм. Медное покрытие разрезано на контактные площадки под каждое отверстие. Вот как выглядит обратная сторона такой платы, уже отпиленная ножовкой по размеру для установки в стек на Arduino:
Плата согласования готова к монтажу элементов. Между контактами удобно припаивать SMD элементы
К сожалению, создатели Arduino частично отошли от сетки 2.54мм и один из разъемов (левый верхний, если ориентироваться по картинке, приведенной выше, смещен на половину от шага 2.54мм относительно других. Но нам, на первом этапе, вполне хватит трех оставшихся разъемов, а желающие могут приобрести (за ≈ $10) пустую макетную плату под Arduino с «правильным» расположением отверстий, правда она несколько ограничивает свободу размещения элементов.
На эту плату будем припаивать контактные группы, которые обеспечат соединение с Arduino и другие необходимые детали. Схему соединений легко создавать с помощью длинных выводов радиодеталей, в необходимых случаях прибегнуть к перемычкам из монтажного провода. Со стороны монтажа, возможно, будет смотреться не очень привлекательно, но это уже мелочи. А со стороны элементов плата согласования смотрится вполне прилично:
Плата согласования с установленными деталями и разъемами
На ПС установлена ответная часть разъема типа Molex, так как для работы АЦП желательно обеспечить входное напряжение выше 5В, с тем, чтобы внутренний стабилизатор выработал точное напряжение питания 5В, которое используется как референсное для АЦП. В случае питания по USB подаваемое напряжение, особенно если линия +5В USB нагружена, может быть занижено, что приведет к погрешностям оцифровки аналогового сигнала. Кроме того, эти напряжения будут измеряться, да и +12В вполне может пригодиться для экспериментов с электронными устройствами. Видно, что места еще очень много и вполне поместятся три-шесть корпусов DIP16 и до восьми каналов ключей с открытым коллектором (стоком). Хотя, скорее всего, сделаем попытку цифрового управления с использованием ЦАП и сумматора.
Все готово
Датчики
Исходя из нашей концепции, датчики предусмотрены для измерения температуры и, опционально, — для измерения потребляемого постоянного тока и мощности в цепи 220В переменного тока.
Датчики температуры
Дополнительных пять-десять датчиков температур, помимо входящих во встроенные средства мониторинга компонентов компьютера, можно с пользой дела установить практически в каждом корпусе. Большое количество датчиков не помешает и в случае, если вы тщательно подходите к компоновке корпуса или разрабатываете его сами и требуется постоянный мониторинг тепловых режимов во всех закоулках корпуса. Но обычные измерители, как правило, выполняются на базе термопар, реже терморезисторов или других полупроводниковых элементов. Увеличение их числа сопряжено и с необходимостью увеличения числа входов или введения схем мультиплексирования и управления, что достаточно быстро заставит задуматься о другом подходе к проблеме. А если, к примеру, датчик должен находиться на удалении нескольких десятков метров?
В случае, если аналоговую непрерывность сигнала о температуре можно заменить на некоторую дискретность отсчетов, допустим, десять раз в секунду или один раз в секунду, то задачу большого количества датчиков, минимального количества проводов и большой удаленности можно решить с помощью интегрированных решений на базе однопроводных 1-Wire устройств. Что это за устройства?
DS1820
Вот как выглядит 1-Wire цифровой термометр DS1820 от компании Maxim (Maxim Integrated Products в 2001 году купила разработчика DS1820, Dallas Semiconductor).
Корпус ТО-92 (есть варианты и в планарных корпусах), всего три вывода. Но особенность шины 1-Wire в том, что обмениваться данными и управлять DS1820 можно с помощью двухпроводной линии. В такой сети, работающей по принципу «master-slave», мастером выступает компьютер или микроконтроллер, имеющий возможность посылать и принимать данные от любого устройства в этой сети. Часто общий провод «не засчитывают», и двухпроводная шина превращается в 1-Wire, трехпроводная — в I2C и в несколько его вариаций и т.д. По этой шине 1-Wire каждый DS1820 по запросу мастера может передать содержимое своего RAM (9 байт), ROM (64 бита) , CRC, принимать индивидуальные и общие команды от мастера.
Более того, к одной двухпроводной линии можно подключить теоретически неограниченное количество датчиков. Каждый DS1820 имеет ROM с уникальным 64-битным идентификатором. Распознавание термометров в двухпроводной сети происходит со скоростью 75 устройств в секунду. Мастер, в процессе распознавания, должен запомнить «имена» всех найденных устройств, чтобы иметь возможность индивидуального общения с нужным. Разумеется, ничего не мешает использовать только одно устройство в сети 1-Wire (не считая мастера).
В дополнение ко всему, DS1820 может и питание получать от той же двухпроводной линии. Из вышеизложенного становится понятно, что перед нами не банальная термопара или полупроводниковый термодатчик, а достаточно интеллектуальное устройство, фактически мини-микроконтроллер.
DS1820 включает в себя несколько функциональных блоков, управляющую логику для сигнальной шины, памяти и измерений, RAM, ROM и EEPROM.
Под названием «scratchpad» скрывается 9-байтовая RAM, первые два байта используются для хранения последней измеренной температуры, следующие два занимают пороговые регистры для хранения нижнего и верхнего значения температур, достижение которых опрашивается специальной командой мастера. Следующие два байта зарезервированы. Затем идут два байта со значениями внутренних счетчиков измерения температуру, которые и определяют значение температуры. Фактически, первые два байта являют собой обработанное значение данных счетчиков и предназначены для индикации результата с погрешностью ±0.5%, с помощью обработки данных счетчиков можно точность отсчета повысить. Впрочем смысла в этом не много, так как тогда нужно будет регулярно снимать тарировочный таблицы для определения соответствия измеренной температуры реальному значению. Заключительный, девятый байт содержит контрольное число CRC, определенное по значению предыдущих восьми байт.
Для представления температуры используется два байта, первый - LSB (Least Significant Byte, наименьший значащий байт; для определения порядка битов в байте также используется этот термин, но речь будет тогда идти о наименьшем значащем бите), содержит измеренное значение температуры, единица измерения — полградуса. MSB (Моst Significant Byte, наибольший значащий байт) содержит знак температуры. При положительном значении температуры все биты будут равны нулю, при отрицательном — единице, но и первый байт в соответствии с правилами двоичной арифметики будет представлен в дополнительном двоичном коде.
В первый байт 64-битный ROM зашит тип устройства. Для DS1820 это число равно 16 (0х10 в шестнадцатеричном представлении), для DS18B20 идентификатор равен 28 (0х1С). Далее следует уникальный 48-битный идентификатор, а последний байт ROM содержит контрольное число CRC, полученное из семи предыдущих байт. Устройство, которое читает информацию ROM из DS1820, по приведенному в документации алгоритму высчитывает контрольную сумму и сравнивает с зашитым в ROM числом CRC, чтобы убедиться в работоспособности устройства, правильности построения схемы управления и качестве линий передачи.
На первый взгляд, все это кажется достаточно сложным, но практическая реализация говорит об обратном. Единственное, что может вызвать трудности, так это подсчет CRC. Так как это можно сделать несколькими способами, но в документации примеры приведены на ассемблере, поэтому в Приложении №2 приведена простая реализация алгоритма вычисления 8-битного кода CRC для 1-Wire устройств, на языке C#, которая без труда может быть конвертирована на любой другой язык высокого уровня.
Подключение DS1820 и получение от него информации описано в главе, посвященной измерению температуры.
Датчики тока
Одним из простейших датчиков тока может являться последовательный шунт в виде прецизионного низкоомного резистора (сопротивлением порядка 0.001Ω для памяти и 0.0001Ω для процессоров). Два аналоговых входа Arduino, подключенные к выводам шунта, дадут возможность измерения падения напряжения на нем и подсчитать ток по формуле I = U / R. Ничего сложного в теории, но на практике, для интересующих нас цепей, реализовать непосредственно для них измерение тока может быть достаточно проблематично. Дело в том, что ток потребления от импульсного источника питания нужно измерять после дросселя и сглаживающих конденсаторов. Но эти силовые цепи находятся во внутренних слоях PCB и встроить в такую цепь шунт практически невозможно. Относительно легко его подключить после дросселя, но это мало что дает, так как ток импульсный, частота импульсов несколько сот килогерц. Максимальная частота преобразования АЦП Arduino составляет 10КГц (а цикл измерений менее 7КГц), поэтому этот вариант не подходит. К тому же, из-за малой расчетной индуктивности дросселя, подобное вмешательство может изменить режим работы импульсного преобразователя.
Задача решается проще для ЦПУ, так как обычно питание идет по отдельному жгуту, и для общего потребления видеокарт от внешнего источника, если такое питание предусмотрено конструкцией адаптера.
Датчик потребляемой мощности переменного тока 220В
Сигналы о токе и напряжении, по понятным причинам, должны быть гальванически развязаны от цепей 220В. Обычно это достигается путем подключения двух трансформаторов — тока и напряжения, первый подключается последовательно с нагрузкой, второй — параллельно питающему напряжению, как обычный сетевой трансформатор. Коэффициенты трансформации выбираются такими, чтобы сигналы были хорошо распознаваемы в диапазоне измерений, но электронные схемы не подвергались бы чрезмерным напряжениям.
Вряд ли на свете существует много любителей мотать трансформаторы и катушки, поэтому имеет смысл воспользоваться готовыми трансформаторами. У автора статьи под рукой оказался давно неиспользуемый блок трансформаторов от Zalman MFC2, по причине многоглючности его индикации мощности, поэтому появился повод применить этот блок в наших экспериментах:
Блок измерительных трансформаторов от Zalman MFC2
Все элементы видны на картинке, предохранитель, токовый трансформатор круглой формы, заключенный в пластмассовый корпус и заляпанный герметиком, трансформатор напряжения на Ш-образном сердечнике, несколько элементов.
Первичная обмотка трансформатора тока — это просто один провод, «пронзивший» тор вторичной обмотки, из-за пластмассового кожуха не видно, используется ли сердечник и как выглядит эта вторичная обмотка. Параллельно вторичной обмотке токового трансформатора подключена пара встречно включенных диодов. Такая же пара подключена и ко вторичной обмотке трансформатора напряжения, но через резистор 20КΩ. Выходной четырехпроводный сигнал измерительной части берется с каждой пары диодов.
Что касается программного обеспечения, то тут постараемся опереться на собственные силы. И не с целью продемонстрировать искусство программирования, об этом нет и речи, а с целью продемонстрировать подход к подключению аппаратных устройств к микроконтроллеру, а самого микроконтроллера — к ПК.
Конечно, в основном это относится к подключению аппаратных устройств к микроконтроллеру, так как работа по протоколу обмена с ПК весьма тривиальна. Коротенькие тексты программ в несколько строк будут приведены по ходу описания процессов измерения, чтобы было понятно, насколько просто это делается и вполне под силу не очень подготовленному пользователю.
Ввиду того, что программирование в ПО Arduino избавляет нас от необходимости знать нюансы программирования и аппаратного построения, по тексту приведены короткие фрагменты реальной программы в несколько строк, чтобы вы убедились, насколько просто программировать такой контроллер.
Если интересует исходный текст программ, или совет, в контексте рассматриваемых тем, то можете обращаться в ЛС на форуме overclokers.ru. Вероятно, я в разделе "Программирование" создам раздел, посвященный этому вопросу.
Программы пока сделаны с целью демонстрации возможностей, не являются законченным продуктом и поэтому пока не выложены на сайте. Это будет чуть позже. Разумеется, при отсутствии платы Arduino эти программы совершенно бесполезны и не заработают.
Интерфейс программы для связи с ПК выглядит пока так, для первого этапа:
Слева, в окне “Terminal”, желтым по черному показываются некоторые сигналы обмена ПК с Arduino из каждого фрейма, так как данные передаются фиксированным числом байт в кадр связи. Эти данные снабжены префиксным пояснением и иногда обработаны. В частности, ROM цифрового термометра DS1820 представляется на экране, начиная со старшего байта, хотя по каналу связи первым получается младший. Некоторая информация не представлена, так как она и так попалает на экран уже в нужном формате и доступны для наблюдения.
В верхней части присутствует кнопочка, останавливающая канал связи и закрывающая порт связи. Когда порт закрыт, кнопка имеет красный цвет. Повторное нажатие открывает порт и возобнавляет связь.
Справа от окна терминала находятся области, показывающие текущие напряжения на процессоре видеокарты и видеопамяти, и температуры тех объектов, с которыми имеют тепловой контакт цифровые термометры. Каждый параметр фиксирует минимальные (синим цветом) и максимальные значения (красным), которые сбрасываются к текущему значению щелчком мыши по min-max значениям.
Слева от показания напряжений находится по маленькой кнопочке, которая и служит для включения аппаратного вольтмода. При включенном вольтмоде кнопочка имеет красный цвет, посторное нажатие отключает вольтмод и кнопочка меняет цвет на зеленый.
В нижней части по вертикали расположены значения напряжений 12В и 5В, измеренные на разъеме Molex блока питания ПК. Два напряжения 3.3В — это то значение, которое вырабатывает микросхема связи на плате Arduino. Источник маломощный, до 50мА, и вывод сделан для иллюстрации измерения потребляемого тока. К выходу микросхемы подсоедиен резистор 10.1Ω, второй конец которого свободен, на обеих концах напряжение замеряется, и параметр I показывает итоговый ток (или, без нагрузки, случайную ошибку квантования).
Справа от вертикального ряда параметров предусмотрено место для графопостроителя, но пока он не реализован.
Практически все, что используется при создании вольтмодблока, описано в статье «Моя домашняя лаборатория». С некоторой натяжкой можно сказать, что можно было бы обойтись только одним тестером, но есть несколько моментов, где придется воспользоваться опытом или интуицией, поэтому, конечно, наличие осциллографа и прецизионного блока питания очень желательно.
Конечно, нужен инструмент и расходные материалы. Нам потребуется паяльная станция, припой с флюсом (ну или чем и как вам больше нравится паять), лупа, острые бокорезы, набор отверток и прочий инструмент, по необходимости. Я еще пользуюсь держателем печатных плат, который может надежно удерживать небольшие детали и PCB в произвольном положении. Желательно обеспечить минимальные эргономические требования по освещенности рабочего места, наличию свежего воздуха и обязательно соблюдать правила техники безопасности.
К расходным материалам можно отнести набор монтажных проводов, мне, по старой привычке, для перемычек и внутренних слаботочных подсоединений, импонирует МГТФ 0.05, так как он тонкий, медный и фторопластовая изоляция не скукоживается при залуживании и пайке. Потребуются также стандартные гнезда и ламели с шагом 2.54мм, наборы резисторов и конденсаторов, потенциометры, несколько транзисторов и микросхем, о которых будет рассказано по мере нашего продвижения вперед.
Условная схема подключений
На первом этапе мы, для иллюстрации принципов работы, реализуем измерение напряжения по нескольким каналам и, по двум каналам, подключим по одному подстраиваемому потенциометру для подсоединения параллельно резистору RGND в нижнем плече делителя обратной связи по напряжению, и эти два канала могут быть использованы для управления напряжением двух независимых импульсных регуляторов напряжения.
На схеме резисторы в цепи коллекторов показаны постоянными и равными 100К условно. На самом деле правильно его считать, состоявшим из двух подстроечных. Одного, ограничивающего минимальное сопротивление, и второго, служащего непосредственно для подстройки. Причем их сопротивление может весьма широко варьироваться, например - от сотен ом для ATI 1600ХТ, десятков килоом для GF8600 и сотен килоом для ATI3xxx и 4xxx.
Подопытным устройством на этом этапе выступит видеокарта Asus GF8600GT с пассивным охлаждением, так как ее она еще и не очень старая, но ее совсем не жалко и, к тому же, их в наличии две штуки. Так что в случае безвременной кончины одной, вторая может занять ее место, но о плохом загадывать не будем.
Температуру будем измерять по одному каналу и как раз на одном из чипов видеопамяти GF8600GT. Вот заготовка- распорка для установки с легким натягом цифровых термометров на видеокарту. Один будет прижат к микросхеме памяти, второй - к пассивному радиатору:
Примерка цифровых термометров. Надеемся, что теплопроводность сухой древесины не будет являться тепловым шунтом
Кстати, будет интересно проверить эффективность установленных радиаторов — на одной из карт GF8600GT на памяти установлен комплект медных радиаторов Thermaltake.
На втором этапе подключим к одному из аналоговых каналов мультиплексор, что даст нам возможность измерять всего лишь через один аналоговый вход Arduino восемь аналоговых сигналов. Правда, измеряться они будут поочередно, в непрерывном цикле Arduino, но в любом случае, измерение и оцифровка не будет происходить реже, чем 500 раз в секунду, что представляется более, чем достаточным. Число точек измерения может быть легко увеличено установкой более многоканального мультиплексора и использования еще нескольких аналоговых входов.
Будут по той же трехпроводной линии подключены дополнительные датчики температуры.
Также, на втором этапе, подключим датчик тока и датчик потребляемой мощности, мультиплексор для установки VID (скорее всего, придется использовать два мультиплексора или два Z-буфера, так как пока двухканальный мультиплексор на 5..8 бит не попался).
И, естественно, все это проверим в работе, к тому времени, вероятно, повысится и функциональность программы на ПК.
Ну и, конечно, увеличим число каналов вольтмода, попробуем реальном времени поуправлять сигналами VID процессора. Пока на второй этап, в дополнение, к подопытной видеокарте, запланирована материнская плата Asus M2NVM-DH.
Что касается измерения напряжения, то это самая простая задача. Arduino сконфигурирован таким образом, что нам доступны шесть каналов АЦП с 10-битным преобразованием. 10-битное квантование означает наличие 2¹º = 1024 ступеней распознавания входного напряжения, что, при внутреннем референсном напряжении 5В, дает разрешающую способность преобразования 5 / 1024 ≈ 5 милливольт. Это означает, что измеренное значение напряжения может «гулять» в пределах ± 10мВ. Кроме того, внутреннее референсное напряжение, зависит от питающего напряжения и, в случае питания по USB-кабелю, для восстановления десятичного представления напряжения, показания АЦП надо умножать не на 5 / 1024 вольт, а, в моем конкретном случае, на 4.85 / 1024 вольт. Тут учитывается и величина напряжения, подаваемая на устройства USB со стороны материнской платы, длина кабеля и конкретное энергопотребление Arduino с дополнительными блоками.
В общем случае, от этих недостатков можно избавиться. Так как интересующий нас диапазон измеряемых напряжений лежит в пределах 0.5В...2.5В, то можно поступить следующим образом. АЦП микроконтроллера может использовать и внешнее референсное напряжение. Подав на вход AREF Arduino стабилизированное напряжение 2.5В, мы получаем шаг преобразования 2.5 / 1024 ≈ 2.5 милливольт, что практически всегда даст при индикации верную
цифру сотых долей вольта. При необходимости измерения в большем диапазоне напряжений нужно будет использовать нормирующий прецизионный делитель из двух резисторов.
Можно, при желании, пойти и дальше, и повысить точность измерений, устранив при квантовании бесполезный диапазон 0...0.5В и подавая измеряемый сигнал через не инвертирующий вход ОУ, а на инвертирующем иметь опорное напряжение, соответствующее требуемой отсечке.
Выше уже говорилось, что измерять напряжение будем по пяти аналоговым каналам. Точки измерения будут выбраны следующие: напряжение на графическом процессоре, видеопамяти и три напряжения блока питания : 12В и 5В.
Так как напряжение 12В превышает референсное 5В, то для его измерения необходимо поставить резистивный делитель, например с соотношением номиналов верхнего и нижнего плеча примерно 3:1 и больше, а сигнал снимать с нижнего плеча.
Таким образом, на вход АЦП будет подаваться напряжение 4В и ниже. Конкретное соотношение лучше определять с учетом того, какие номиналы есть в наличии, желательно иметь возможность точно замерить сопротивление. Общее сопротивление двух резисторов может быть до нескольких КΩ, увеличивать его нет смысла из-за влияния выходного сопротивления источника (а это и будет примерно сумма сопротивлений делителя, если учитывать, что сам делитель подключен к источнику с низким выходным сопротивлением), на время преобразования АЦП (в документации на Atmega328P оговаривается, что выходное сопротивление оцифровываемого входа источника не должно превышать 10КΩ), а предельное снижение определяется током через делитель, при котором рассеивается мощность, не приводящая к заметному нагреву резисторов и нет перегрузки питания.
Также придется поступить и с напряжением 5В. Измеренные номиналы резисторов делителей
нужно будет использовать в программе для ПК, для правильного восстановления исходных значений.
Программа Arduino для измерения напряжения для одного аналогового входа выглядит следующим образом:
переменная = analogRead (номер аналогового входа)
И в переменной целого типа мы получаем два байта оцифрованного значения напряжения с шагом квантования менее 5мВ. Просто и эффективно.
Непрерывный автоматический цикл в ПО Arduino выполняется с частотой менее 10КГц, что, вероятно, выбрано не случайно, поскольку в этом случае, к началу каждого нового цикла программы, АЦП уже успевает полностью оцифровать входной аналоговый сигнал. Напомним, что АЦП в микроконтроллере всего один и предоставление большого числа каналов АЦП — внутренний трюк микроконтроллера Atmega с мультиплексированием входов.
Поскольку у нас не осталось больше аналоговых входов, а мы в дальнейшем имеем желание измерять напряжение и в других точках, придется прибегнуть к внешнему мультиплексированию, что еще больше увеличит время преобразования, но об этом — во второй части статьи.
О некоторых проблемах измерения тока уже было рассказано при рассмотрении датчиков, здесь мы добавим еще одну ложечку дегтя в нашу медовую бочку. Дело в том, что при типичном подходе измерения тока косвенным методом как измерения напряжения на выводах калиброванного шунта возникает проблема одномоментности измерений. Это особенно актуально для переменного тока в цепях измерения мощности, так как там важно фиксировать мгновенные значения и определять фазовые сдвиги, и при измерении, когда данные записываются в буфер с последующей обработкой, для выявления бросков тока, интерполяции и сглаживания и т.д. Но наш микроконтроллер, делает хорошую мину при плохой игре — имея всего один АЦП, он притворяется, что у него их шесть (а в планарных корпусах — так и все восемь). То есть, исходный АЦП имеет определенный предел быстродействия по оцифровке, а, предоставляя шесть каналов, в соответствующее число раз пользователю это быстродействие будет уменьшено (даже больше, если учитывать задержки переключения и работу прочей логики). Arduino идет еще дальше и, делая благое дело для неподготовленных пользователей, убирая все нюансы программирования, дает возможность каждому каналу оцифровывать пару тысяч раз в секунду. В реальной программе это число еще более упадет, применение внешнего мультиплексирования еще более ухудшит ситуацию.
Это приведет к тому, что требуемый одновременный замер напряжения на концах шунта будет совсем не одновременный. Более того, пульсации напряжения могут быть распознаны как значительное потребление тока. Так что полноценно зафиксировать все нюансы, которые творятся по потребляемому току, возможности не представляется. Но стационарный режим, когда ток в десятки раз превышает худший вариант двойной амплитуды пульсации, деленной на сопротивление шунта, будет вполне пригоден.
Это хорошо иллюстрируется по нашей схеме, когда питание на Arduino подается с компьютерного блока питания, характеризующегося пульсациями в десятки милливольт. Даже с учетом сглаживания, напряжение питания имеет серьезнве пульсации. Это приводит к появлению хаотичного «тока» на десятиомном шунте, один конец которого свободен, второй подсоединен к внутреннему напряжению 3.3В. АЦП, естественно, с временным лагом, замеряет напряжения на концах шунта. Значения «тока» могут превышать двойную погрешность преобразования в два — три раза.
Если обрисованная ситуация показалась чересчур мрачной, то это не совсем так, и для многих практических приложений единственный АЦП в микроконтроллере не является помехой. Да и пару внешних быстродействующих АЦП подключить совсем не трудно.
При подключении резистивной нагрузки с расчетным током в несколько десятков миллиампер (источник ограничен отдаваемой силой тока в 50мА), измерения проходят как положено.
Тем не менее, более полезные измерения тока пока не проводятся.
Давайте попробуем определить, используя техническую документацию на наш датчик DS1820 и ПО к плате Arduino, как заставить его работать с пользой для нас. Отдельная программа для ПК при этом не нужна, получить значения измеренной температуры, если все заработает, можно и в окне ПО Arduino, включив вывод на встроенный в нее терминал.
Для начала подключим только один термометр DS1820 (в наличии еще есть и несколько DS18B20, которые отличаются более точным, 12-битным представлением измеренной температуры). Вот типовая схема подключения DS1820 к микроконтроллеру с использованием внешнего питания для датчика:
В нашем случае, резистор 4.7КΩ не нужен, так как любой цифровой выход микроконтроллера Atmega имеет возможность подключить такой резистор, находящийся внутри микроконтроллера, по команде в программе. Таким образом, на плате согласования размещаем только трехпиновый разъем и подключаем один вывод к общему проводу, другой - к цифровой линии Arduino (я выбрал 7), и третий вывод — к напряжению +5В. Единственное изменение - во избежание коротких замыканий и проблем с неправильной установкой, питание +5В подводится к этому разъему через ограничивающий резистор номиналом в 220Ω. Сам DS1820 припаивается к трехпроводному плоскому кабелю, второй конец кабеля оканчивается ответной частью разъема:
Подключив плату согласования с подсоединенным датчиком к Arduino, подключаем USB кабель к ПК и плате микроконтроллера. Запускаем ПО Arduino. Мы готовы к экспериментам.
Из документации к DS1820 следует, что линия связи (I/O) перед началом любых манипуляций по чтению-записи должна поддерживаться микроконтроллером на высоком логическом уровне. Следующим шагом должен стать общий сброс, на который все имеющиеся 1-Wire устройства на линии должны ответить «импульсом присутствия». У нас стоит один датчик, а в случае, если подключено множество устройств (это могут быть не только цифровые термометры), это ничего не меняет — микроконтроллер должен понять, есть ли на линии хоть одно устройство. Если что-то отвечает «импульсом присутствия», то следующим шагом микроконтроллер будет выполнять специальную процедуру сканирования ROM всех устройств, подключенных к линии и для каждого определит точный идентификатор и уникальный ID, по которому в дальнейшем и будет проводить обращение к уникальному устройству. Так как у нас устройство на линии пока одно, то процедура сканирования ROM не нужна, для случаев одного устройства на линии существует специальная команда SkipROM («игнорировать ROM»).
Общий сброс в документации графически описан так:
Микроконтроллер должен выставить на линии IO сигнал низкого уровня на время t_RSTL, затем переключиться по этой линии на прием и «слушать» в течение времени t_RSTH.
Если устройство 1-Wire на линии присутствует, оно, по длинному сигналу «RESET PULSE FROM HOST» распознает сброс, прекратит все выполняемые операции по IO на линии и, через время t_PDHIGH после окончания импульса сброса, выставляет на линии низкий уровень на время t_PDLOW. «Слушающий» линию микроконтроллер понимает, что, по крайней мере, одно устройство на линии есть.
Все это программируется в ПО Arduino несколькими строчками. Вся программа выглядит таким образом:
Теперь самое время проверить, все ли мы сделали правильно, и как отвечает DS1820 на запрос микроконтроллера. Документация приводит нам теоретическую картинку того, что мы должны получить:
Сброс и ответный импульс в теории
Подсоединяем осциллограф к цифровому входу-выходу 7 (или к среднему выводу DS1820) и наблюдаем следующую картину:
Практика подтверждает теорию
Мы добились ответного импульса от DS1820. Чтобы убедиться в этом, отсоединяем датчик от платы согласования — сигнал пропадает. Присоединяем — появляется. Развертка 50мкс/дел, следовательно первый «горбик» имеет длительность около 35 мкс, что входит в норму 15..60мкс. Ответный импульс DS1820 длится немногим более 100мкс, что также лежит в оговоренных пределах 60..240мкс. На рисунке время импульса сброса меньше 480 мкс за счет того, что изображение просто сдвинуто немного по горизонтали.
Любая маленькая удача окрыляет, поэтому пытаемся развить успех.
Внимательно читаем документацию, смотрим временные циклы и пишем микрофункции записи бита, посылаемого термометром DS1820 нашему микроконтроллеру. Временные параметры отличаются, в зависимости от того, записывается ноль или единица, поэтому функции разные, хотя нетрудно написать и общую. Запись нулевого бита:
Запись единички:
Так как данные передаются байтами (вернее, нам так просто удобно видеть и в дальнейшем обрабатывать информацию), то нужна процедура, записывающая подряд 8 битов.
Тут следует дать одну ремарку. Временные слоты передачи битов и байтов сделаны пропорционально одинаковыми, хотя можно было бы их и ужать. Но, во первых, мы пока не ограничены вычислительной мощностью, а, во-вторых, выравнивание временных отрезков дает возможность без накладок и «каши» наблюдать посылаемые команды на экране осциллографа. Попробуем.
Хоть такая команда и не входит в систему команд, распознаваемых DS1820, посмотрим, как отображается передача байта со значением, равным единице, по шине 1-Wire:
Микроконтроллер передает команду «01»
В самом левом углу — это уже исследованный «горбик», затем импульс присутствия низкого логического уровня. После этого микроконтроллер устанавливает высокий уровень на шине и передает команду «01», побитно, начиная с LSB=1, а все остальные биты равны нулю. Все это отчетливо можно видеть на осциллограмме.
Вот как выглядит команда измерить температуру «ConvertT»:
Микроконтроллер передает команду «ConvertT» = 0х44
Двоичный код, начиная с LSB, будет 0010 0010 и соответствует тому, порядку, который виден на осциллограмме, хотя обычно в литературе и программах пишут, начиная с MSB, то есть правильно будет указывать 0100 0100, или, в шестнадцатеричном представлении, 0х44.
Для того, чтобы команда «ConvertT» сработала, и мы температуру смогли бы считывать с DS1820, необходимо либо указать полный код ROM устройства в специальной команде, либо, в случае с одним устройством 1-Wire на шине, дать команду «Skip ROM». Поэтому, перед чтением, надо дать правильную комбинацию команд:
Микроконтроллер передает две команды подряд - «Skip ROM» = 0xCC и «ConvertT» = 0х44
Теперь можно приступить к чтению
Снова внимательно читаем документацию, смотрим временные циклы и пишем микрофункцию чтения бита, посылаемого микроконтроллером термометру DS1820:
Функция, читающая подряд 8 битов:
Теперь мы готовы к измерению температуры и получению результата.
На терминале программы связи видим значение текущей температуры. Никаких подстроек и настроек не требуется. Минимальный квант представления данных — полградуса, поэтому значение считанного байта надо просто разделить на 2 и получим температуру с шагом в полградуса. Для отрицательных температур значение показывается в дополнительном двоичном коде.
Следующим шагом попытаемся на одну линию 1-Wire установить несколько датчиков температуры, но это уже будут DS18B20, позволяющие, без дополнительных ухищрений, выдавать температуру в более точном, 12-битном формате, вместо 9-битного у DS1820.
Маркировка DS18B20
Но это будет уже во второй части.
Мы долго шли к основной цели нашего повествования и, наконец, дошли. Уже обозначено, что на пером этапе организуем дистанционный вольтмод на повышение напряжения в двух точках, это будут напряжения на видеопроцессоре и видеопамяти Asus GF8600GT. Напряжение будет увеличиваться одной ступенькой для памяти и одной ступенькой для процессора, величина этого напряжения определяется заранее. Это напряжение надстраивается заранее подстроечным резистором для каждого канала, если вольтмодблок размещается в корпусе ПК, но,если вольтмодблок располагается на рабочем столе, что вполне возможно, то можно регулировать в любой момент. Тем более, что цифровой вольтметр у нас уже работает.
Включение и выключение вольтмода производится с ПК.
Для реализации такого подхода соберем простенькую схему на двух биполярных n-p-n транзисторах, по одному для каждого канала, и по одному резистору, ограничивающему ток базы.
Тип транзистора особой роли не играет, поскольку транзистор работает ключом в статическом режиме, это немного может повлиять на номинал резистора, ограничивающего ток базы, но номинал от нескольких килоом до сотни килоом подойдет для большинства вариантов.
Подстроечный резистор, подключенный к открытому коллектору служит для регулировки напряжения, в случае, когда цифровой выход, к которому подключен транзистор, находится в состоянии логической единицы. В этом случае сопротивление перехода эмиттер-коллектор близко к нулю и подстроечный резистор оказывается подсоединенным параллельно нижнему плечу резистивного делителя, формирующего сигнал обратной связи по напряжению. Уменьшение сопротивления ведет к увеличению сигнала рассогласования в такой полярности, что схема управлением напряжения пытается скомпенсировать это рассогласование установкой более высокого напряжения в интересующем нас месте.
Подача на базу транзистора логического нуля приводит к его запиранию и в этом случае подстроечный резистор никакого влияния на схему не оказывает.
Схема легко расширяется, по числу доступных цифровых линий Arduino, или более интеллектуально, при подаче кодового сигнала на внешний ЦАП, или его некое подобие, в виде дешифратора с ключами, но мы эти пока заниматься не будем. Имея в виду видеокарту, представляется вполне достаточным, в дополнение к номинальному режиму, иметь на канал 2-3 фиксированных значения вольтмода.
Программа Arduino, выполняющая включение-выключение транзисторных ключей по командам с ПК, очень проста:
Если передается 1, то включается вольтмод GPU, двойка - выключает. Соответственно, команды 3 и 4 - для памяти.
Во второй части планируется расширить число каналов и подключить к схеме вольтмода ЦПУ и оперативную память, в том числе менять напряжение прямым изменением кода VID.
Поскольку наш микроконтроллер с ПО Arduino допускает минимальные задержки в 1мкс, уже не гарантируя точности этого временного отрезка, могут возникнуть трудности с реализацией мультиплексирования VID, так как регулятор напряжения питания процессора отслеживает изменения сигнала на этих линиях и работает по своему алгоритму с временными отсечками, недоступными для выбранного микроконтроллера. Поэтому мы будем идти к цели несколькими шагами.
Мы научились измерять интересующие нас параметры. Тепрь встает задача измеренные данные преобразовать к виду, удобному для восприятия. Так как информация имеет разный формат данных, представляется целесообразным всю обработку производить на ПК, имеющим более высокое быстродействие и развитые системы разработки и отладки. Задачей микроконтроллера будет собрать всю полученную информацию и в «сыром» виде отправить на ПК. Кроме того, микроконтроллер должен уметь распознавать команды, подаваемые с ПК и сообщать об из приеме и ходе обработки.
Наибольшую сложность, скорее всего, вызовут два момента, это программное вычисление CRC и представление отрицательных температур. Вот варианты решения на C#:
Подсчет 1-Wire CRC
bufferIN[] - входной буфер порта, startIndeX - индекс байта, соответствующего ROM.
Вычисление отрицательной температуры
Здесь смещение приемного буфера стоит на байте принятой температуры.
Вот он, итог:
Натурные испытания
Собственно говоря, ничего сверхъестественного здесь не приведено, и подобный вольтмод не есть что-то необычное. В принципе, цель автора была провести испытания в корпусе компьютера с пассивным охлаждением на предмет динамики пространственных температур, со снятием температурного поля с 20-30 датчиков и с 3Д визуализацией в реальном времени. Поэтому такое детальное внимание было уделено именно цифровому термометру DS1820.
Задача тоже достаточно тривиальная, и в случае только кучки DS18x20 не требующая даже микроконтроллера. Но тут мой взгляд упал на две давно лежащие в пыли видеокарты GF8600GT...
Результаты натурных испытаний и развитие вольтмодблока - в следующей части. Макет полностью работоспособен, все задуманные для первой части функции реализованы.
Так как автор давненько не занимался электронным и механическим конструированием, да и к процессору Atmega подобрался впервые, то возможны любые ошибки и неточности. Развеять заблуждения автора, равно как и высказаться по поводу обсуждаемых тем, поделиться своими предложениями по теме, можно тут .
30 апреля 2009 года
(с) zauropod, специально для www.overclockers.ru
реклама
Лента материалов
Соблюдение Правил конференции строго обязательно!
Флуд, флейм и оффтоп преследуются по всей строгости закона!
Комментарии, содержащие оскорбления, нецензурные выражения (в т.ч. замаскированный мат), экстремистские высказывания, рекламу и спам, удаляются независимо от содержимого, а к их авторам могут применяться меры вплоть до запрета написания комментариев и, в случае написания комментария через социальные сети, жалобы в администрацию данной сети.
Сейчас обсуждают