Пример управления БП ATX - znoxx/ARCAdaptor GitHub Wiki

Из ARCAdaptor можно собрать простую схему управления БП ATX.

Такие БП часто применяются в радиолюбительской практике. Действительно, они надёжные, мощные и стабильные. Чтобы включить ATX БП - достаточно соединить зеленый провод разъёма с "землей", то есть выдать на него сигнал "низкого" уровня. Это, собственно и делают, если нужно проверить работоспособность блока питания. Однако, мы пойдём немного дальше, и сделаем немного более интеллектуальный "драйвер", который будет питаться от сигнала +5VSB (он есть всегда, когда к ATX подведен переменный ток из розетки), "утягивать" сигнал PSON в низкий уровень, а также отслеживать признак того, что БП в порядке и сигнал POK (Power OK или Power Good) имеется.

Итак, назначения сигналов:

  • Зеленый провод - PSON
  • Фиолетовый провод - +5VSB
  • Серый провод - PGOOD (Power OK)

ATX драйвер

Наша схема после подачи питания на 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.

⚠️ **GitHub.com Fallback** ⚠️