ШИМ управление активным охлаждением на Raspberry Pi, Orange Pi, Banana Pi

Во многих случаях мини-компьютеры, такие как: Raspberry Pi, Orange Pi, Banana Pi и т.п., поставляется с небольшим вентилятором на 5 В, чтобы можно было охлаждать процессор (вернее — СнК/SoC) компьютера. Тем не менее, эти вентиляторы обычно довольно шумные, и многие подключают его к выводу на 3.3 В, чтобы уменьшить шум. Вентиляторы обычно рассчитаны на 200 мА, что довольно много для регулятора на 3.3 В на Raspberry Pi.

Этот проект научит вас, как регулировать скорость вращения вентилятора в зависимости от температуры процессора. В отличие от большинства руководств, охватывающих эту тему, мы не только включим или выключим вентилятор, но и будем контролировать его скорость с помощью ШИМ, как это делается на обычном ПК.

Что такое ШИМ?

Широтно-импульсная модуляция (ШИМ, англ. pulse-width modulation (PWM)) — процесс управления мощности методом пульсирующёго включения и выключения прибора. Различают аналоговую ШИМ и цифровую ШИМ, двоичную (двухуровневую) ШИМ и троичную (трёхуровневую) ШИМ. Основной причиной применения ШИМ является стремление к повышению КПД при построении вторичных источников питания электронной аппаратуры и в других узлах, например, ШИМ используется для регулировки яркости подсветки LCD-мониторов и дисплеев в телефонах, КПК и т.п..

Управление вентилятором с помощью биполярного NPN-транзистора

Первое что приходит на ум — поставить биполярный NPN-транзистор. Вентилятору требуется 200мА, поэтому ищем транзистор с коллекторным током более 200мА, лучше раза в 2-3. В импортных даташитах этот параметр называется Ic, в наших Iк. Подойдут транзисторы: 2N5550, 2N5551, 2N2222A и т.д.. У транзистора, в первую очередь, надо определить назначение выводов. Где у него коллектор, где база, а где эмиттер. Сделать это лучше всего по даташиту или справочнику.

Схема подключения вентилятора

Берем транзистор и подключаем его по такой схеме:

 

Схема подключения вентилятора - Принципиальная схема (Orange Pi One + 2N2222 + 1N4001)

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

Резистор R1 играет важную роль — он ограничивает ток через переход база-эмиттер. Если бы его не было, ток не был бы ничем ограничен и просто испортил бы управляющую микросхему (ведь именно она связывает линию питания с транзистором).

Кроме того, нужно помнить, что нагрузка индуктивная и нужен защитный диод D1. Дело в том, что энергия, запасённая магнитным полем, не даёт мгновенно уменьшить ток до нуля при отключении ключа. А значит, на контактах нагрузки возникнет напряжение обратной полярности, которое легко может нарушить работу контроллера или даже повредить его.

Схема подключения вентилятора (Orange Pi One + 2N2222 + 1N4001)

Управление вентилятором с помощью МОП транзистора

Вместо биполярного можно использовать полевой транзистор — MOSFET, то есть полевые транзисторы с изолированным затвором (они же МОП, они же МДП). Они удобны тем, что управляются исключительно напряжением: если напряжение на затворе больше порогового, то транзистор открывается. При этом управляющий ток через транзистор пока он открыт или закрыт не течёт. Это значительное преимущество перед биполярными транзисторами, у которых ток течёт всё время, пока открыт транзистор.

В дальнейшем мы будем использовать только n-канальные MOSFET. Это связано с тем, что n-канальные транзисторы дешевле, имеют лучшие характеристики и для управления N-канальным полевиком необходимо приложить положительное напряжение на затвор относительно истока.

Схема подключения вентилятора

ШИМ управление - Принципиальная схема (Orange Pi One + ZVN4306A + 1N4001)

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

Резистор R1 на 100 Ом ограничивает ток заряда-разряда, а резистор R2 на 10 кОм — это стягивающий резистор, что в неопределенном состоянии «стягивает» потенциал к земле.

Кроме того, нужно помнить, что нагрузка индуктивная и нужен защитный диод D1.

ШИМ управление - Схема подключения вентилятора (Orange Pi One + ZVN4306A + 1N4001)

N-канальные MOSFET с логическим уровнем управления

Один из минусов МОП транзисторов — это высокое пороговое напряжение затвора, больше 3.3 В. Тем не менее, существуют N-канальные транзисторы с логическим уровнем управления, например: IRL2505, FDN337N, ZVN4306A, 2N7000, PMV16XNR, NTZD3155C, IRLZ24NPBF, IRL520NPBF и т.п.

Как получить температуру процессора

Существует несколько способов получить текущую температуру процессора.

Если вы используйте Armbian, вы можете использовать команду:

эта команда будет давать вам время работы, частоту и текущую температуру процессора каждые 6 секунд.

Есть еще одна команда, которая просто возвращает температуру процессора:

или

или

Внутри SoC Allwinner есть два датчика, вы можете взять оба значения, чтобы получить среднюю температуру. На Raspberry Pi температура измеряется в миллиградусах, для перевода в градусы Цельсия нужно разделить полученное число на 1000:

В Raspberry Pi можно узнать температуру процессора при помощи ввода консольной команды:

Включение вентилятора при заданной температуре

Ниже приведённые примеры используют WiringPi и, если библиотека у вас не установлена, установите её, инструкции тут: WiringPiWiringOP или BPI-WiringPi.

Самый простой пример управления вентилятором — это его включение, при достижении критичной температуры, и выключение, если температура ниже. Если шум вентилятора не мешает, тогда можно использовать такой вариант.

Программа работает следующим образом — при достижении заданной температуры (более 55°С) вентилятор включается, и отключается только когда температура снизится более чем на 10°С от максимального порога (менее 45°С).

Температуру получаем с помощью функции static int getTemperature(). На Raspberry Pi температура измеряется в миллиградусах, для перевода в градусы Цельсия нужно разделить полученное число на 1000 и необходимо будет внести несколько изменений,

вместо:

использовать:

Компиляция, сборка и запуск программы

Сознаём файл FanPiOnOff.cpp и вставляем вышеприведённый код:

Компилируем и собираем программу:

Запускаем:

если хотим запустить программу в фоновом режиме:

ШИМ управление: Пример 1

Логика программы такова — при достижении заданных температур вентилятор включается с определённым коэффициентом заполнения, а отключается только тогда, когда температура ниже минимального порога:

  • 45 °C -> 35 %
  • 50 °C -> 50 %
  • 60 °C -> 75 %
  • 75 °C -> 100 %

Компиляция, сборка и запуск программы

Сознаём файл FanPiPWM.cpp и вставляем вышеприведённый код:

Компилируем и собираем программу:

Запускаем:

если хотим запустить программу в фоновом режиме:

ШИМ управление: Пример 2

Также можно менять коэффициент заполнения линейно. В таком случае программе нужно задать минимальную температуру срабатывания и минимальный коэффициент заполнения, к примеру 45°C и 35% соответственно, а на максимальную температуру (к примеру 70°C) — коэффициент в 100%. Рассчитывается коэффициент заполнения с помощью функции static int map(int x, int inMin, int inMax, int outMin, int outMax);.

Компиляция, сборка и запуск программы

Сознаём файл FanPiPwmLinear.cpp и вставляем вышеприведённый код:

Компилируем и собираем программу:

Запускаем:

если хотим запустить программу в фоновом режиме:

Как поместить скрипт в автозагрузку

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

Для этого, в конец файла /etc/rc.local:

Нужно поместить команду запуска скрипта перед строкой exit 0:

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

Чтобы проверить факт запуска, после перезагрузки, нужно переключиться в терминал и проверить наличие процесса:

Как проверить?

Для проверки работоспособности скрипта нужно «разогреть» процессор до нужной температуры и посмотреть, как на это будет реагировать система охлаждения. «Нагревать» процессор можно с помощью утилит sysbench или stress. Вы можете установить эти утилиты с aptitude:

или

Запуск утилиты с задействованием 4 ядер:

или

Температура процессора сразу начнет повышаться.

Принудительно завершить, как выполнение теста утилитой sysbench, так и stress можно сочетанием клавиш Ctrl+C.

Удаление скрипта из автозагрузки

Для удаления скрипта из автозагрузки нужно просто удалить строку с запуском скрипта из файла /etc/rc.local.

Материалы

Управление мощной нагрузкой постоянного тока. Часть 1
Управление мощной нагрузкой постоянного тока. Часть 3.
Raspberry Pi 3: GPIO (#3) — умное управление собственным активным охлаждением
Управление мощной нагрузкой
Широтно-импульсная модуляция

Похожие записи

Комментарии 1

  • Здравствуйте.
    У меня BPI M2Ultra с чипом A40i. Установил Armbian последний с оф.сайта.
    К сожалению температура процессора не доступна, ни одно приложение не находит сенсоров. Возможно потому, что A40i начали недавно устанавливать в эту плату.
    Есть желание подключить DS18B20 и используя ваши примеры, организовать мониторинг и smart-охлаждение.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *