Собираем станцию : основы регуляторов мощности и бич-версия диммера

Тема в разделе "off.Топик", создана пользователем Surge, 08.11.2016.

  1. vipok72

    vipok72 Пользователь

    Регистрация:
    04.02.2018
    Сообщения:
    10
    Симпатии:
    0
    Решил проблему так как вы советовали, просто начал резать полупериодами, на лампочке ужас как заметно, а на галогенках впринципе создается какой то такой эффект дыхания быстрого и он мне даже нравится.
    Режу так:
    В loop() принимаю данные о необходимой мощности на данный момент, далее создаю счетчики: (формула такая: если надо 50% мощности, то по логике каждый второй полупериод мы должны пропустить, а считаем так: 50%/2=25 это то самое количество полупериодов которое нам нужно оставить, 50/25 = 2 это через каждые сколько периодов надо наконец пускать полупериод, и кажется я шас понял что это работает только до 50% мощности)
    Код:
        top_power = RAW_DATA[0]; //принятая из проги необходимая в данный момент мощность верха 0-100%
        bottom_power = RAW_DATA[1]; //для низа
        if(top_power<=2) top_power = 2; //минимальная мощность = 2%, т.к. при делении ниже может быть ошибка
        if(bottom_power<=2) bottom_power = 2;
        def_t = 50/(top_power/2); //считаем сколько надо пропустить для верха полупериодов
        sch_t = def_t; //это счетчик
        def_b = 50/(bottom_power/2); //для низа
        sch_b = def_b; //это счетчик
    А внутри самого прерывания такое:
    Код:
    void tick()  // function to be fired at the zero crossing to dim the light
    {
      if(sch_t<=1) {//когда наш счетчик на единице - мы пропустили сколько надо полупериодов
        sch_t = def_t; //счетчик опять на первоначальное значение
        PORTD |= 1<<TOP_TRIAC; //пускаем полупериод
      } else { //если счетчик не на единице
        sch_t = sch_t-1; //значит этот полупериод пропускаем
      }
      //и все тоже самое для низа
      if(sch_b<=1) {
        sch_b = def_b;
        PORTD |= 1<<BOTTOM_TRIAC;
      } else {
        sch_b = sch_b-1;
      }
      delayMicroseconds(200); //ожидание симистора
      PORTD &= ~(1<<TOP_TRIAC); //вырубаем без проверок, ибо к этому моменту они по любому должны быть вырублены
      PORTD &= ~(1<<BOTTOM_TRIAC);
    }
    А вот насчет фаз что-то меня это пугает, я не совсем шарю в электрике, но не хотелось бы бахнуть так... ну, вроде как провода из розетки идут, а есть ли она там не знаю эта фаза
     
    Последнее редактирование: 22.02.2018
  2. vipok72

    vipok72 Пользователь

    Регистрация:
    04.02.2018
    Сообщения:
    10
    Симпатии:
    0
  3. Surge

    Surge Пользователь

    Регистрация:
    25.01.2016
    Сообщения:
    1.177
    Симпатии:
    440
    Брезенхем как раз и занимается ровным распределением внутри каждых 100 полупериодов :) На первой странице есть готовый код

    Код:
    volatile int power=35;
    volatile int error=50;
    
    void tick()
    {
     // Начало брезенхема
      error=error-power;
      if(error<0)
      {
        error+=99;
        triac_on();
      }
    // Конец брезенхема
      else
      PORTD &= B11110111;
    }
    
     
    vipok72 нравится это.
  4. vipok72

    vipok72 Пользователь

    Регистрация:
    04.02.2018
    Сообщения:
    10
    Симпатии:
    0
    А я то думал для чего это... Спасибо большое, всё прекрасно работает.
    Но есть еще одна проблема... Включается холодильник - самопроизвольное срабатывание симистора происходит - зависание ардуины. Я так понял нужен снаббер, как вы решили эту проблему?
     
  5. Surge

    Surge Пользователь

    Регистрация:
    25.01.2016
    Сообщения:
    1.177
    Симпатии:
    440
    Оч просто - никак. У меня этой проблемы не возникает.
    По даташиту нужно резистор на 39ом и 0.1 мкф (300v rated) между выводами.
     
  6. vipok72

    vipok72 Пользователь

    Регистрация:
    04.02.2018
    Сообщения:
    10
    Симпатии:
    0
    Посмотрел, вроде самопроизвольного срабатывания семистора нет (было когда резал полупериоды), а когда начал пропускать полупериоды уже нет. А отключение и последующая невозможность подключения к ней думаю из-за длинного провода usb (5 метров), видимо БП в моем пк при включении холодильника входит в панику + в проводе теряется ток и минимально требуемое для ардуино напряжение перестает поступать, ардуино перезагружается, но подключиться к ней уже нельзя без полного отключения питания
     
  7. Surge

    Surge Пользователь

    Регистрация:
    25.01.2016
    Сообщения:
    1.177
    Симпатии:
    440
    Посади на отдельный ac-dc адаптер, будет немного понятнее.
     
  8. vipok72

    vipok72 Пользователь

    Регистрация:
    04.02.2018
    Сообщения:
    10
    Симпатии:
    0
    Как то возможно спасать электроприборы в одной сети? мб ибп или стабилизаторы какие?
     

Поделиться этой страницей