Пример управления БП ATX - znoxx/ARCAdaptor GitHub Wiki
Из ARCAdaptor можно собрать простую схему управления БП ATX.
Такие БП часто применяются в радиолюбительской практике. Действительно, они надёжные, мощные и стабильные. Чтобы включить ATX БП - достаточно соединить зеленый провод разъёма с "землей", то есть выдать на него сигнал "низкого" уровня. Это, собственно и делают, если нужно проверить работоспособность блока питания. Однако, мы пойдём немного дальше, и сделаем немного более интеллектуальный "драйвер", который будет питаться от сигнала +5VSB (он есть всегда, когда к ATX подведен переменный ток из розетки), "утягивать" сигнал PSON в низкий уровень, а также отслеживать признак того, что БП в порядке и сигнал POK (Power OK или Power Good) имеется.
Итак, назначения сигналов:
- Зеленый провод - PSON
- Фиолетовый провод - +5VSB
- Серый провод - PGOOD (Power OK)
Наша схема после подачи питания на ARCAdaptor будет:
- Приветственно моргать лампочкой
- Включать ATX
- Отслеживать наличие сигнала Power Good, а если он вдруг "пропадёт" - экстренно выключать БП.
На схеме помимо резистора для светодиода есть ещё пара - это ограничители тока. Нужно ставить 1..1.5K. Питать схему нужно через разъемы X3-9 и X3-10 - ибо устройство у нас "автономное", не требующее USB подключения к компьютеру (по крайней мере, в базовом варианте). Ну и не забыть подключить "землю" от ATX (черные провода).
Собственно, код. Подразумевается что используется Arduino IDE.
#include "ARCAdaptor.h"
#define LED X1_1 //PIN13 Arduino (SCK)
#define PGOOD X3_1 //PIN3 Arduino (PD3)
#define PSON X1_5 //PIN14 Arduino (PC0)
#define STARTUP 100
bool bNormalOperation;
void setup()
{
bNormalOperation = true; //Устанавливаем признак того, что БП функционирует штатно.
pinMode(LED, OUTPUT); //Устанавливаем режим контактов
pinMode(PSON,OUTPUT);
pinMode(PGOOD,INPUT);
digitalWrite(LED, HIGH); //Включаем светодиод индикации
stopATX(); //Для определенности - выключаем ATX при подаче питания или сбросе.
for(int i=0;i<3;i++) //Приветственно "поморгаем" светодиодом
{
digitalWrite(LED,LOW);
delay(STARTUP);
digitalWrite(LED,HIGH);
delay(STARTUP);
}
startATX(); //Стартуем ATX
doStartupSequence(); //Тут можно выполнить полезную работу
// - например скоммутировать реле, подключенное к другим контактам ARCAdaptor
}
void startATX()
{
digitalWrite(PSON,LOW); // "Зелёный" провод на низкий уровень для включения
while(!isPowerGood()) // Ждём, пока не появился сигнал PowerGood
{
digitalWrite(LED,LOW);
}
}
void stopATX() //остановка ATX
{
digitalWrite(PSON,HIGH);
}
bool isPowerGood() //Функция возвращает TRUE или FALSE,
// в зависимости от того, какой сигнал на контакте PowerOK.
{
if (digitalRead(PGOOD) == HIGH )
{
return true;
}
else
{
return false;
}
}
void doStartupSequence()
{
// В этой функции можно сделать что-то полезное
// с другими контактами ARCAdaptor, она вызывается после включения ATX.
}
void loop()
{
if(!isPowerGood())
{
stopATX(); //Останавливаем ATX
bNormalOperation = false; //Снимаем признак "нормальная работа"
}
if (bNormalOperation) {
digitalWrite(LED,HIGH); //Светим светодиодом, если всё ок
}
else
{
digitalWrite(LED,LOW); //Выключаем светодиод, если что-то пошло не так
}
}
Вот вроде бы и всё - теперь при включении в сеть ATX включит сигнал +5VSB, он запитает ARCAdaptor, схема запустится. В случае сброса схемы - выполнение пойдет сначала, то есть ATX БП будет выключен, потом включен. В случае, если сигнал PowerOK не будет иметь высокий уровень (например ATX БП не может выдать все нужные напряжения) - схема либо не включится (останется ждать сигнала), либо сразу выключится (если Power OK был, но вдруг пропал).
Возможно, имеет смысл подтянуть сигнал X3-1 к земле, чтобы добавить стабильности в работе - в случае обрыва или некорректного значения там будет стабильный "0". Делать это нужно через резистор, значение подбирать экспериментально, начинать примерно с 1K.