Помогите с таймерами при прерывании программы

Тема в разделе "Arduino & Shields", создана пользователем gada94, 21 янв 2017.

  1. ИгорьК

    ИгорьК Гуру

    В том посте есть ссылки на первоисточники - там код более понятен.
    Что касается моего, то здесь идёт работа с регистрами МК напрямую, если Вы с этим не сталкивались - подумайте, надо ли оно Вам.
    Это достаточно большая тема, объяснить её в нескольких постах я не возьмусь. Осваивать это надо лишь в том случае, если Вы будете работать с МК, а не хотите сделать разовое устройство.
    Почитать - Прокопенко. Программирование МК ATMEL на языке Си.
    Здесь кое что есть.
     
    Последнее редактирование: 21 янв 2017
  2. gada94

    gada94 Нуб

    скажите а возможно ли сделать регулировку вот так как на картинке?
    то есть убрать оптопару для проверки перехода через 0 и просто использивать оптрон MOC3063 которий регулируєт через 0?
    находил на форумах где так делали но у меня не получилось
     

    Вложения:

    • I2FVdYSaPwA.jpg
      I2FVdYSaPwA.jpg
      Размер файла:
      149,5 КБ
      Просмотров:
      608
  3. ИгорьК

    ИгорьК Гуру

    ИМХО - нельзя. Суть скетча - ловить каждую полуволну и регулировать время открытия крана на каждой.
    Можно, конечно, без этого выдать какой-нибудь неспешный ШИМ на управление, но плавное удержание яркости Вы не добьетесь.
     
  4. ИгорьК

    ИгорьК Гуру

    Скорее так: для управления отопителем типа ТЭН это возможно. Для света - все будет мерцать.
     
    gada94 нравится это.
  5. qwone

    qwone Гик

    Код (C++):
    /*to_gada94.ino
      прерывание -> 2
      на лампу -> 4 ( Lamp_pin)
    */

    //#1 ШИМ
    const byte Lamp_pin = 4;
    bool logic = 1; // уровень при котором вкл симистор.
    volatile byte PDW = 50; // 0-100% освещения 0 все горит 100 не горит вообще

    volatile uint32_t past = 0;
    volatile uint32_t past_old = 0;
    const int pulse = 50; // длительность импульса для открытия симистора
    volatile uint32_t Pulse_time = 0;
    volatile bool F_pulse; // фронт импульс 0 не было / 1 появился
    volatile bool B_pulse; // спад импульса 0 не было / 1 появился

    // функция прерывания
    void zero_cros() {
      past_old = past;
      past = micros();
      Pulse_time = (past - past_old) * PDW / 100;
      F_pulse = 0;
      B_pulse = 0;
    }
    void setup() {
      //#1 ШИМ
      pinMode(Lamp_pin, OUTPUT);
      digitalWrite(Lamp_pin, ! logic);
      F_pulse = 1;
      B_pulse = 1;
      attachInterrupt(0, zero_cros, RISING);
    }

    void loop() {
      //#1 ШИМ
      if (! F_pulse && micros() - past >= Pulse_time) { // формирование переднего фронта импульса
        F_pulse = 1;
        digitalWrite(Lamp_pin, logic);
      }
      if (! B_pulse && micros() - past >= Pulse_time + pulse) { // формирование заднего фронта импульса
        B_pulse = 1;
        digitalWrite(Lamp_pin, ! logic);
      }
    }