Здравствуйте подскажите, как осуществить одновременную фазовую регулировку вентиляторов 220 Вольт? С одним нет проблем отследил переход нуля, срабатоло прерывание по обоим фронтам, отсчитал заложенное программой время подал на управляющий симистора короткий импульс и закрыл его, ждешь следующий зеро кросс. А вот как одновременно 2 управлять???????????? Ведь функция прерывания крутит свою программу с делай................
Вот ты и ответил на свой вопрос: избавляйся от delay. В псевдокоде, для наглядности: Код (C++): uint32_t interruptTimer1 = 0; uint32_t interruptTimer2 = 0; bool hasZeroCross1 = false; bool hasZeroCross2 = false; void zeroCross1() { interruptTimer1 = micros(); hasZeroCross1 = true; } void zeroCross2() { interruptTimer2 = micros(); hasZeroCross2 = true; } void setup() { attachInterrupt(...); } void loop() { if(hasZeroCross1 && (micros() - interruptTimer1 > SOME_TIME) ) { cli(); hasZeroCross1 = false; sei(); pushImpulse1(); } if(hasZeroCross2 && (micros() - interruptTimer2 > SOME_TIME) ) { cli(); hasZeroCross2 = false; sei(); pushImpulse2(); } } Или я чего не так понял?
Эм, прерывание по изменения состояния на выводе? Таймер считает на фоне время? Зачем делай? При проектировании программы на мк настоятельно рекомендуется обрабатывать прерывания как можно быстрее. Если вы решили использовать delay в обработчике прерывания, тогда первая рекомендация исправить это как можно раньше и больше так не делать.
да кто вам сказал что делай в прерываниях нельзя использовать - 10 милисекунд ничего не станет с вашей программой
ой гемо...ой надо в прерывании по входу включать таймер на совпадение , задавать ocr , потом входить в его функцию включать симистор и выключать таймер до следующего по входу. Ой как плохооооооооо
Зависит от того как запрограммируете. Никто, это рекомендация. Тем более, что можно всё=), вы же сделали и ничего - с одним вентилятором работает) только вопрос как решить вашу проблему. Без delay проще. И да, 10 мс с вашей программой что-то сделали. Можно решить вашу проблему двумя ардуинками, накинуть поверх третью, которая собирала бы инфу и координировала действия первых двух. Можно спроектировать свой проц в конце концов. Для ясности - атмега на ардуинке тактируется 16 МГц это 62.5 нс на такт, 10 мс это 160 000 тактов, если принять, что операции выполняются допустим (!!! хотя можно говорить про 1 такт) 10 тактов, то это 16 000 операций - это много чего ещё можно сделать. (Если писать программу ориентируясь на архитектуру мк)
Отслеживание "нуля" для обоих будет одинаковым, т.к. питающая сеть одна. Если под "одновременной" понимать одинаковость режимов работы вентиляторов (скорость), то достаточно указать для одного вентилятора один пин, а для второго - другой, но управлять пинами одновременно. Еще проще - подключить оба вентилятора к одному симистору.
Двигатель асинхронный? С короткозамкнутым витком? Фазовая регулировка противопоказана. А диммер я делал так. Привязываю пин к блоку сравнения таймера1 Код (C++): #define Dimmer_Pin_Init SetBit(Dimmer_port, Dimmer_pin) // Пин диммера конфигурируем как выход #define Dimmer_pin_Off ClearBit(TCCR1A, COM1A0); TCCR1C = Bit(FOC1A) // Принудительно выключить пин диммера #define Dimmer_pin_On TCCR1A |= Bit(COM1A0) // Включить пин диммера от OCR1A #define Init_TCCR1A TCCR1A = Bit(COM1A0) | Bit(COM1A1) // Привязка пина с симистором к таймеру Это пин будет включаться самостоятельно, а вот выключаем его вручную. Его также можно выключать с помощью средств таймера (режим СТС), но мне надо, чтобы счетчик дальше считал (исключение помех возле перехода синусоиды через ноль). Код (C++): ISR(TIMER1_COMPB_vect) { Dimmer_pin_Off; // Выключаем пин с симистором //InvBit(Reg_Flags, Zero_Falling); // Инвертируем флаг полярности напряжения } Ну и где-то в коде задаём фазу открытия симистора Код (C++): OCR1A = impulse; // передний фронт импульса Ну и в main просто отслеживаем нажатие кнопок (уход на прерывание по нажатию кнопок чреват морганием диммера). Код (C++): while (1) { if (BitIsSet(Reg_Flags, e_Zero_Move) & BitIsSet(Reg_Flags, Zero_Move)) {Get_Button();} for (uint8_t i = 0; i<8; i++) { } } Ну бывай!
Потому что асинхронники регулируются частотой с одновременной регулировкой напряжения. Либо изменением количества полюсов (многовыводные моторы). Регулировка фазы тока приводит к увеличению потребления тока, снижению КПД и нагреву обмоток.
На низкооборотистых моторах или на моторах, у которых очень тяжелый режим (жд транспорт) ставится внешнее охлаждение обмоток.
в железе детектор нуля выжжет мк. С другой стороны, если гальваноразвязка отсутствует, то для чего оптосимисторы?
да это из апнота 182 авр взял - у меня на коленках толькочто попробывал всё отлично пашет - правда с одним вентилятором - все регулируется, завтра с 2 буду травить. Надо снаберку паралельно симистору поставить. Гальваноразвязка на китайском модуле будет, вот на таком https://ru.aliexpress.com/item/AC-L...&terminal_id=b5a916816fb44ed88cdd7fe5b36e1965 Там после моста, оптрон