PDU - power distribution unit - умные розетки для шкафа

внезапно увидел на ебее упс вот в таком корпусе

и сразу подумалось, что это неплохой корпус для пду

можно так же воткнуть 2х цветные светодиоды или даже ргб со встроеным контроллером

есть уже дырка для сетевого порта

вторую дырку можно использовать для соединения по юарт со вторым блоком

тоже интересуюсь подобной темой

для свой лабы я купил APC AP7921 и успокоился :grinning_face:, но для варианта DIY я давно придумал рецепт из готовых компонентов, который нигде на просторах интернета не встречал:

  1. приобретаем KinCony контроллер, например KC868-A8 (8 встроенных реле):

или вариант более продвинутый T16M (16 mosfet, с более новым ESP32 на борту и в более симпатичном металлическом корпусе):

+ KC868-E8 :

прошивку можно использовать заводскую или tasmota или esphome

контроллер обеспечивает нам связь по сети ethernet/wifi/RS485/modbus на ваше усмотрение. логику управления розетками - управление группами, таймеры/расписания, нотификации и мониторинг по SNMP или MQTT.

  1. DIN рейка для 19” rack, ну или корпус под ваши индивидуальные условия

+розетки на DIN:

если у вас большие пиковые токи, то можно попробовать поставить реле Hongfa серии HF115F-S, с контактом с вольфрамовым покрытием, которые как говорят не “спекаются”

Напомнило

дин рейку под 19” я еще не видел :laughing:

но все это слишком дорого выходит, один контроллер 20 евров только стоит

розетки эти тоже 3.40 х 8 = 27

дин рейка 34

итого 80 евров где-то

продолжаем тему про пду

внезапно, теме почти год, а еще ничего не сделано :weary_cat: :laughing:

купил я еще 6 пду без выключателей о тдельных IBM PDU 97P6221

долго искал что-то подходящее и дешевое и вот купил за все с пересылкой отдал 45 евров где-то

одна такая штука весит порядка 4кг
думал сделать такое из корпуса от свитча, но пилить его пришлось бы долго и покупать маленькую болгарку, так что охотился на такие вот готовые

решил сразу разобрать и выставить фотки

под железными крышками автоматы ампер на 10 наверное

2 розетки на 6 групп

на зеленых платах сделаны “блоки питания” для светодиодов, на варисторах съэкономили, хотя все сделано очень качественно - особенно провода обжаты, а не просто впаяны, что уменьшает механические поперечные нагрузки на пайку и уменьшает вероятность образования кольцевых трещин, а токи там по 10а на розетку, а это 2.3квт

на круглый разъем идут провода толщиной чуть ли не с мой палец
2 синих, 2 желто зеленых и по одному белый, коричневый и черный (3 фазы)


что я задумал с этими железками?

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

сначала я подумал сделать на микросхеме 555 генератор импульсов и 2 микросхемы регистров 595 + оптопары с переходом нуля и симисторы - это дало бы плавный пуск импульсных блоков питания, что всегда хорошо для диодного моста и конденсаторов, чтобы не было импульсных бросков и ток плавно нарастал

потом подумал, что слишком просто и тиристор можеть пробить, да и никто пду не делает на тиристорах

надо ставить хорошие реле, а одно реле стоит от 1.5 евров, а надо будет 72 штуки, а это порядка 130 евров, если брать омрон с прозрачным корпусом

возникает вопрос? как бы так сделать, чтобы реле замыкалось в момент перехода нуля? ведь при переходе напряжение будет 0 реле не сработает

я тут я подумал еще раньше - зачем 555 таймер и 2 регистра, если можно взять контроллер с 12 выводами гпио? там легко делается задержка, надо будет только 2 микросхемы драйверов для реле, чтобы не паять кучу транзисторов и резисторов и защитных диодов (все это уже встроено)

и тут я вспомнил, что в регуляторах мощности на контроллерах есть схема детектора перехода на оптопаре

отсюда рождается алгоритм, когда мы детектим переход, зная частоту тока в 50гц, то мы знаем, что один полупериод длится 10мс

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

т.к. реле механическое, то для замыкания контактов требуется время и оно указано в даташите (поэтому и стоит брать качественные брендовые реле)

таким макаром контакты замкнутся примерно во время перехода через ноль второго полупериода, что вызовет небольшое искрение по сравнению с тем, когда это делалось бы без контроллера и время включения попало бы в самый пик синусоиды, а там 325в и была бы нехилая такая искра, что даже контакты 16а реле пострадали

кстати вчера снимал крышечки со своих б\у реле разных и разглядывал контакты через линзу сбольшим увеличением и вижу, что они сделаны неправильно

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


сейчас я пока занят подсчетом стоимости переделки 6 пду и пересчет на единицу готового изделия

с реле очень дорого выходит + как оказалось нельзя сделать 10вт источник питания на 12в без трансформатора, только с дросселем

а 12 реле жрут порядка 6вт + нужен запас еще, итого 10вт надо

поэтому нужен блок питания на 12в 1а с трансформатором, а он еще стоит денег + надо городить еще фильтр от помех до и после, т.к. продается только сам модуль, а ему обвязка нужна

если бы все делалось на контроллере и симисторах, то там бы хватило маломощного источника и все вышло бы гораздо дешевле

кстати вышел кикад 10, вроде как он теперь более чем подходит для рисования схем и разводки плат + к нему есть мсп сервер, чтобы подключать к нейросетям и делать разводку платы и даже рисовать схемы

хотя я бы не рекомендовал это делать, если вообще нуб, а так это конечно ускорит рисование однотипных соединений

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

такие дела :disguised_face:

по поводу детектора нуля

вчера я скормил гемини один документ

прочитай http://www.atmel.com/dyn/resources/prod_documents/doc2508.pdf и скажи, в чем смысл статьи и как там определяется переход напряжения через ноль? алгоритм программы объясни

Ссылка, которую вы указали, ведет на официальный документ компании Atmel (ныне Microchip) — Application Note AVR182: Zero Cross Detector (документ doc2508.pdf).

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

1. В чем смысл статьи?

Основная цель статьи — показать, как реализовать эффективный, надежный и максимально дешевый детектор перехода напряжения через ноль (Zero Cross Detector) для сетей переменного тока (например, 220 В / 50 Гц) с использованием минимального количества внешних компонентов.

Вместо использования громоздких и дорогих внешних схем (трансформаторов, компараторов, транзисторов или оптопар) Atmel предлагает изящное инженерное решение: использовать встроенные защитные диоды самого микроконтроллера AVR (семейств ATtiny и ATmega) для ограничения высоковольтного сигнала до безопасного логического уровня.

:warning: Важное предупреждение из статьи: Данный метод не имеет гальванической развязки от сети 220 В. Земля микроконтроллера напрямую соединяется с силовой нейтралью, поэтому при отладке и эксплуатации устройства необходимо строго соблюдать технику безопасности: вся низковольтная часть схемы находится под опасным для жизни потенциалом.


2. Как там определяется переход напряжения через ноль?

Определение происходит за счет взаимодействия простой аппаратной обвязки и внутренней структуры портов ввода-вывода AVR.

Аппаратный принцип:

Сетевая фаза (L) подключается напрямую к выводу внешнего прерывания микроконтроллера (например, INT0) через один большой ограничительный резистор номиналом 1 МОм. Нейтраль (N) подключается к общему проводу схемы (GND).

Физика процесса внутри микроконтроллера:

  1. На каждом выводе микроконтроллера AVR установлены внутренние защитные кремниевые диоды (clamping/clipping diodes), предназначенные для защиты от электростатических разрядов (ESD). Один диод подключен анодом к пину и катодом к шине питания $V_{CC}$, второй — анодом к земле GND и катодом к пину.

  2. Когда синусоида сетевого напряжения уходит в положительную полуволну и превышает уровень $V_{CC} + 0.5\text{ В}$, открывается верхний защитный диод. Он «срезает» верхушку синусоиды, удерживая напряжение на пине на безопасном уровне около $V_{CC} + 0.5\text{ В}$.

  3. Когда синусоида уходит в отрицательную полуволну (падает ниже $GND - 0.5\text{ В}$), открывается нижний диод, удерживая напряжение на уровне около $-0.5\text{ В}$.

  4. Резистор 1 МОм ограничивает ток через эти диоды до ничтожно малой величины (для 230 В ток равен примерно $230\text{ В} / 1\,000\,000\text{ Ом} \approx 0.23\text{ мА}$). Документация указывает, что встроенные диоды безопасно выдерживают постоянный ток до 1 мА, поэтому кристалл не повреждается.

Преобразование в меандр:

В результате высоковольтная синусоида на входе пина превращается в прямоугольный сигнал (меандр) с амплитудой от $-0.5\text{ В}$ до $V_{CC} + 0.5\text{ В}$. Частота этого меандра в точности равна частоте сети (50 или 60 Гц).

Порог переключения цифрового входа микроконтроллера из состояния логического «0» в «1» находится примерно на уровне $V_{CC}/2$.

  • Восходящий фронт (rising edge) прямоугольного сигнала возникает чуть после реального перехода сетевого напряжения через ноль.

  • Нисходящий фронт (falling edge) возникает чуть до реального перехода через ноль. Так как спад сигнала происходит непосредственно перед нулевой точкой, микроконтроллер ориентируется именно на нисходящий фронт прерывания, чтобы успеть среагировать точно в момент нуля.


3. Алгоритм программы

Программа полностью построена на прерываниях (Interrupt Driven), что позволяет не загружать центральный процессор постоянным опросом пина в основном цикле.

Этап 1: Инициализация

  • Настраивается порт ввода-вывода (пин прерывания INT0 конфигурируется на вход).

  • Настраивается внешнее прерывание INT0 на срабатывание по нисходящему фронту (falling edge).

  • Глобально разрешаются прерывания (sei()).

Этап 2: Обработка прерывания (внутри ISR — Interrupt Service Routine)

Когда напряжение сети падает и пересекает порог $V_{CC}/2$, генерируется прерывание, и управление передается функции-обработчику:

  1. Программный фильтр шума (дебаунсинг): В электросети всегда присутствует большое количество импульсных помех и выбросов, которые могут вызвать ложные срабатывания. Чтобы защититься от этого, алгоритм выполняет быструю проверку:

    • Программа подряд 5 раз сэмплирует (считывает) логическое состояние пина прерывания.

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

    • Если хотя бы один отсчет отличается (обнаружен кратковременный шум или всплеск), алгоритм считает это помехой, отбрасывает событие и немедленно завершает прерывание, возвращаясь в основной цикл.

  2. Выполнение полезного действия: Если фильтр подтвердил истинность перехода, выполняется целевое действие. В демонстрационном коде статьи микроконтроллер просто кратковременно выставляет высокий уровень на тестовом пине PB0, чтобы разработчик мог проверить точность работы детектора с помощью осциллографа. В реальных задачах в этот момент обычно запускается аппаратный таймер (например, для отсчета фазовой задержки при управлении яркостью лампы или оборотами двигателя через симистор).

  3. Подготовка к следующему циклу: Внешнее прерывание временно сбрасывается/очищается, чтобы избежать повторного дребезга, и микроконтроллер снова переходит в режим ожидания следующего спада сигнала.

ну и смысл был как раз в том, чтобы гемини накидал бы и код, чтобы 2 раза не ходить

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

Для реализации этой задачи на микроконтроллере ATmega328P (который используется, например, в Arduino Uno) мы напишем программу на чистом Си (AVR-GCC).

В качестве входного пина для детектора выберем PD2 (вывод INT0), так как он поддерживает аппаратные внешние прерывания. В качестве выходного пина, который будет менять свое состояние (ноль/единица), возьмем PB0.

#include <avr/io.h>
#include <avr/interrupt.h>

#define DETECT_PIN  PD2  // Вход детектора нуля (INT0)
#define OUTPUT_PIN  PB0  // Выход, который будет переключаться

void init_system(void) {
    // 1. Настройка портов ввода-вывода
    DDRD &= ~(1 << DETECT_PIN);  // PD2 на вход
    DDRB |= (1 << OUTPUT_PIN);   // PB0 на выход
    PORTB &= ~(1 << OUTPUT_PIN); // Изначально на выходе логический 0

    // 2. Настройка внешнего прерывания INT0
    // Согласно апноуту AVR182, ловим нисходящий фронт (falling edge),
    // так как он наиболее точно предшествует переходу через ноль.
    // Для этого задаем биты ISC01 = 1, ISC00 = 0 в регистре EICRA.
    EICRA |= (1 << ISC01);
    EICRA &= ~(1 << ISC00);

    // 3. Разрешаем прерывание INT0
    EIMSK |= (1 << INT0);

    // 4. Глобально разрешаем прерывания
    sei();
}

// Обработчик прерывания INT0
ISR(INT0_vect) {
    unsigned char i;

    // Программный фильтр шума (дебаунсинг из AVR182)
    // Считываем состояние пина 5 раз подряд
    for (i = 0; i < 5; i++) {
        if (PIND & (1 << DETECT_PIN)) {
            // Если хотя бы раз проскочила "1" — это ложная помеха.
            // Немедленно выходим из прерывания, ничего не меняя.
            return; 
        }
    }

    // Если проверка пройдена — переход через ноль истинный.
    // Переключаем состояние пина PB0 на противоположное (Toggle)
    // Операция XOR (^) превратит 0 в 1, а 1 в 0.
    PORTB ^= (1 << OUTPUT_PIN);
}

int main(void) {
    init_system(); // Инициализация периферии

    while (1) {
        // Основной цикл пуст. 
        // Микроконтроллер может спать или выполнять другие задачи.
        // Вся логика работает аппаратно через прерывания.
    }
}

Для реализации этой задачи на микроконтроллере ATmega328P (который используется, например, в Arduino Uno) мы напишем программу на чистом Си (AVR-GCC).

В качестве входного пина для детектора выберем PD2 (вывод INT0), так как он поддерживает аппаратные внешние прерывания. В качестве выходного пина, который будет менять свое состояние (ноль/единица), возьмем PB0.

Код программы

C

#include <avr/io.h>
#include <avr/interrupt.h>

#define DETECT_PIN  PD2  // Вход детектора нуля (INT0)
#define OUTPUT_PIN  PB0  // Выход, который будет переключаться

void init_system(void) {
    // 1. Настройка портов ввода-вывода
    DDRD &= ~(1 << DETECT_PIN);  // PD2 на вход
    DDRB |= (1 << OUTPUT_PIN);   // PB0 на выход
    PORTB &= ~(1 << OUTPUT_PIN); // Изначально на выходе логический 0

    // 2. Настройка внешнего прерывания INT0
    // Согласно апноуту AVR182, ловим нисходящий фронт (falling edge),
    // так как он наиболее точно предшествует переходу через ноль.
    // Для этого задаем биты ISC01 = 1, ISC00 = 0 в регистре EICRA.
    EICRA |= (1 << ISC01);
    EICRA &= ~(1 << ISC00);

    // 3. Разрешаем прерывание INT0
    EIMSK |= (1 << INT0);

    // 4. Глобально разрешаем прерывания
    sei();
}

// Обработчик прерывания INT0
ISR(INT0_vect) {
    unsigned char i;

    // Программный фильтр шума (дебаунсинг из AVR182)
    // Считываем состояние пина 5 раз подряд
    for (i = 0; i < 5; i++) {
        if (PIND & (1 << DETECT_PIN)) {
            // Если хотя бы раз проскочила "1" — это ложная помеха.
            // Немедленно выходим из прерывания, ничего не меняя.
            return; 
        }
    }

    // Если проверка пройдена — переход через ноль истинный.
    // Переключаем состояние пина PB0 на противоположное (Toggle)
    // Операция XOR (^) превратит 0 в 1, а 1 в 0.
    PORTB ^= (1 << OUTPUT_PIN);
}

int main(void) {
    init_system(); // Инициализация периферии

    while (1) {
        // Основной цикл пуст. 
        // Микроконтроллер может спать или выполнять другие задачи.
        // Вся логика работает аппаратно через прерывания.
    }
}


Как работает этот алгоритм?

  1. Ожидание события: Микроконтроллер спокойно выполняет код в цикле while(1) (в данном случае ничего не делает). В это время аппаратный модуль INT0 следит за напряжением на пине PD2.

  2. Фиксация спада: Как только синусоида сети начинает пересекать ноль и уходить в отрицательную полуволну, напряжение на пине PD2 падает ниже порогового. Аппаратный контроллер прерываний видит этот спад (нисходящий фронт) и мгновенно ставит основную программу “на паузу”, передавая управление функции ISR(INT0_vect).

  3. Фильтрация помех: Первым делом в прерывании запускается быстрый цикл проверки. Сетевое напряжение «грязное», и в момент перехода через ноль могут быть микровсплески. Программа делает 5 сверхбыстрых проверок пина. Если на пине стабильный ноль — прерывание признается валидным.

  4. Инверсия выхода (Toggle): Строка PORTB ^= (1 << OUTPUT_PIN); выполняет побитовое исключающее ИЛИ (XOR).

    • Если на пине PB0 был 0, то 0 ^ 1 = 1 (вывод переходит в лог. 1).

    • При следующем прерывании (через один период сети) на пине будет 1, и 1 ^ 1 = 0 (вывод переходит в лог. 0).

  5. Возврат: Программа выходит из прерывания и возвращается к тому месту в main, где её прервали, ожидая следующего перехода через ноль.

:light_bulb: Важный нюанс по частоте: Поскольку данный алгоритм настроен на прерывание по нисходящему фронту (falling edge), он срабатывает ровно один раз за полный период синусоиды (то есть на частоте 50 Гц прерывание будет вызываться 50 раз в секунду).

Если вам нужно, чтобы пин переключался на каждой полуволне (и в плюс, и в минус — то есть 100 раз в секунду при 50 Гц), измените настройку регистра EICRA на срабатывание по любому изменению логического уровня (Any logical change):

EICRA |= (1 << ISC00); EICRA &= ~(1 << ISC01);

(В этом случае программный фильтр шума из кода придется убрать или переписать, так как уровень на пине при прерывании будет каждый раз разным).

я так сходу не ковырялся в регистрах контроллера по этой теме, но думаю все норм он сделал

надо будет как нибудь попробовать этот код, у меня завалялись трансформаторы 50гц

кстати 10вт 50гц трансформатор стоит в 10 раз дороже импульсного блока питания такой же мощности :man_facepalming:

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


в результате дальнейших поисков и детального изучения детекторов перехода нуля я случайно наткнулся на готовую микросхему ETA5001 для этого

оказывается все давно придумано до нас
стоит 5 центов всего