Как я могу запрограммировать переключатель (на основе полупроводникового реле или симистора), который запускает питание при пересечении нуля?
Для тех, кто не знаком с предметом: Включите питание 230 В, когда синусоида линии электропередачи пересекает ноль - в результате минимизируются электромагнитные помехи, вызванные быстрым скачком тока.
В частности, я бы предпочел перенести как можно больше в программное обеспечение. Схема обнаружения, состоящая из небольшого трансформатора, диода и пары резисторов для контроля уровней и токов, выдает «1», когда входная мощность переменного тока находится в положительной половине, «0» - в отрицательной, подключенной к входному выводу GPIO. Выходной сигнал состоит из нескольких твердотельных реле и базовых элементов, необходимых для их работы (подтягивания и т. Д.), Подключенных к выходным выводам GPIO.
Проблема заключается в синхронизации: при 50 Гц переменного тока мы получаем 100 пересечений нуля в секунду, один полупериод равен 10 мс. Чтобы добраться до разумного расстояния от пересечения нуля, чтобы поддерживать низкий уровень электромагнитных помех, мы не должны активировать выход более чем на 10% после (или до) события пересечения нуля, что означает допуск + -1 мс. Это не означает, что время реакции составляет 1 мс - мы можем разумно ожидать, что следующий переход через ноль произойдет ровно через 10 мс после первого или четвертого - 40 мс. Речь идет о гранулярности - если мы допустим 20 мс для реакции, это должно быть между 19 и 21 мс, а не 18 или 22.
Как я могу реализовать такой выход GPIO с триггерным таймером либо в пределах 1 мс, поскольку вход обнаруживает фронт, либо в пределах фиксированного кратного 10 мс с тех пор - предпочтительно с учетом некоторого отрицательного смещения (скажем, трансформатор и реле вводят задержку 1,6 мс; поэтому я хочу, чтобы триггер сработал через 8,4+ (n * 10) мс с момента входного импульса, таким образом, смещение нейтрализует задержку, вносимую схемой.) - все это, конечно, «по требованию пользователя», скажем, пользователь пишет «1 msgstr "в файл / sys / class / ... и при ближайшей (грубо) возможности вывод будет" включен ". Пользователь пишет «0», и когда наступает переход через ноль, конкретное реле отключается.
Я считаю, что это потребует написания или взлома модуля ядра. Не могли бы вы указать мне, что обрабатывает выводы GPIO Raspberry Pi в ядре, и какие таймеры я могу подключить к нему (если они еще не установлены), чтобы получить такую функциональность?
Ответы:
Вам не нужно взламывать ядро. Вам просто нужно переместить процесс из очереди планировщика.
Отныне наш процесс получает
cat /proc/sys/kernel/sched_rt_runtime_us
миллисекунды из каждогоcat /proc/sys/kernel/sched_rt_period_us
отрезка времени в миллисекундах, непрерывного выполнения без риска упреждения в течение этого времени (на практике по умолчанию для BerryBoot: 0,95 с каждую секунду). Если вам нужно больше, запутайтесь с этими значениями, но мне не нужно больше для моих целей здесь.Я использую функцию таймера в миллисекундах (это о точности, которая мне нужна),
clock_gettime()
чтобы синхронизировать мои задержки.Вызов
timer(1)
сбрасывает его, вызовtimer(0)
возвращает время с момента сброса.Вам необходимо создать ссылку на
rt
библиотеку, чтобы это скомпилировать - добавьте-lrt
в команду gcc.Теперь для основного цикла. Я использую входной переключатель для «запроса пользователя», но вы можете использовать сеть, таймер или что-то еще. Все, что вам нужно, это ввести логическое значение
in
.источник
TRIAC_PIN
наin
, я должен был бы установитьTRIAC_PIN
1, подождать определенное количество времени (пропорционально желаемый уровень диммера), а затем установитеTRIAC_PIN
обратно на 0. Будет ли это работать?if(in==out) continue;
наif(out==0) continue;
, не так ли? На самом деле, я совершенно новичок в программировании для pi, так что, возможно, в этом нет необходимости - я предполагаю, что все это происходит синхронно (то есть нам не нужно беспокоиться о вызове основного цикла, пока вложенные циклы еще выполняются)