кто ответит на вопрос на 100 балов?

Тема в разделе "Флудилка", создана пользователем рокки1945, 15 июн 2018.

  1. рокки1945

    рокки1945 Нерд

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

    DIYMan Гуру

    Вот ты и ответил на свой вопрос: избавляйся от 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();
        }
     
    }
    Или я чего не так понял?
     
  3. Daniil

    Daniil Гик

    Эм, прерывание по изменения состояния на выводе?
    Таймер считает на фоне время? Зачем делай?
    При проектировании программы на мк настоятельно рекомендуется обрабатывать прерывания как можно быстрее. Если вы решили использовать delay в обработчике прерывания, тогда первая рекомендация исправить это как можно раньше и больше так не делать.
     
    parovoZZ нравится это.
  4. рокки1945

    рокки1945 Нерд

    и что они будут рывками работать в лупе?
     
  5. рокки1945

    рокки1945 Нерд

    да кто вам сказал что делай в прерываниях нельзя использовать - 10 милисекунд ничего не станет с вашей программой
     
  6. рокки1945

    рокки1945 Нерд

    ой гемо...ой надо в прерывании по входу включать таймер на совпадение , задавать ocr , потом входить в его функцию включать симистор и выключать таймер до следующего по входу. Ой как плохооооооооо
     
  7. Daniil

    Daniil Гик

    Зависит от того как запрограммируете.
    Никто, это рекомендация. Тем более, что можно всё=), вы же сделали и ничего - с одним вентилятором работает) только вопрос как решить вашу проблему. Без delay проще.
    И да, 10 мс с вашей программой что-то сделали.

    Можно решить вашу проблему двумя ардуинками, накинуть поверх третью, которая собирала бы инфу и координировала действия первых двух.

    Можно спроектировать свой проц в конце концов.

    Для ясности - атмега на ардуинке тактируется 16 МГц это 62.5 нс на такт, 10 мс это 160 000 тактов, если принять, что операции выполняются допустим (!!! хотя можно говорить про 1 такт) 10 тактов, то это 16 000 операций - это много чего ещё можно сделать. (Если писать программу ориентируясь на архитектуру мк)
     
    Последнее редактирование: 15 июн 2018
  8. Belkin

    Belkin Гик

    Отслеживание "нуля" для обоих будет одинаковым, т.к. питающая сеть одна.
    Если под "одновременной" понимать одинаковость режимов работы вентиляторов (скорость), то достаточно указать для одного вентилятора один пин, а для второго - другой, но управлять пинами одновременно.
    Еще проще - подключить оба вентилятора к одному симистору.
     
  9. parovoZZ

    parovoZZ Гуру

    Двигатель асинхронный? С короткозамкнутым витком? Фазовая регулировка противопоказана.

    А диммер я делал так.
    Привязываю пин к блоку сравнения таймера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++)
            {
            }
        }
    Ну бывай!
     
    рокки1945 нравится это.
  10. рокки1945

    рокки1945 Нерд

    ПОЧЕМУ???????????
     
  11. рокки1945

    рокки1945 Нерд

  12. parovoZZ

    parovoZZ Гуру

    Потому что асинхронники регулируются частотой с одновременной регулировкой напряжения. Либо изменением количества полюсов (многовыводные моторы). Регулировка фазы тока приводит к увеличению потребления тока, снижению КПД и нагреву обмоток.
     
    рокки1945 нравится это.
  13. рокки1945

    рокки1945 Нерд

    но это ерунда для моих целей - нагрев обмоток
     
  14. parovoZZ

    parovoZZ Гуру

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

    рокки1945 Нерд

    фух сделал - весь день убил - правда в железе незнаю как получится
     

    Вложения:

    • 2.png
      2.png
      Размер файла:
      248,2 КБ
      Просмотров:
      81
  16. parovoZZ

    parovoZZ Гуру

    в железе детектор нуля выжжет мк. С другой стороны, если гальваноразвязка отсутствует, то для чего оптосимисторы?
     
  17. рокки1945

    рокки1945 Нерд

    да это из апнота 182 авр взял - у меня на коленках толькочто попробывал всё отлично пашет - правда с одним вентилятором - все регулируется, завтра с 2 буду травить. Надо снаберку паралельно симистору поставить. Гальваноразвязка на китайском модуле будет, вот на таком
    https://ru.aliexpress.com/item/AC-L...&terminal_id=b5a916816fb44ed88cdd7fe5b36e1965
    Там после моста, оптрон
     
  18. рокки1945

    рокки1945 Нерд

    Ничего не выжжет мегаомный резик и два диода плюс кондёр на входе
     
  19. parovoZZ

    parovoZZ Гуру

    в аппноуте по мегому сопротивления стоят.
     
  20. Airbus

    Airbus Оракул

    За правильный ответ премия?