Так ли нужен zero-cross detection для термофена?

Тема в разделе "Arduino & Shields", создана пользователем Gomez, 25 фев 2025 в 15:06.

  1. Gomez

    Gomez Гик

    Хотел сделать термофен по чешскому рецепту - из готовых модулей
    videoplayback.mp4_snapshot_04.43_[2025.02.13_23.30.31].jpg
    Только модуль с полевиком заменить на более приличный.
    Всё для этого есть, да уже года три собираюсь.
    Но там - о ужас! нет zero-cross!
    Теоретически даже я смогу в нужный фрагмент кода вставить
    Код (C++):
    if(zero_cross == true)
    но тогда придётся энкодеры оставлять без прерываний.

    Но сколько читал, так и не понял, что даст zero-cross для схемы управления нагревателем. "Уменьшение помех в сети"? А мне не по...? :) Или прямо как действие EMI в фильмах - всё заискрится, из мониторов и клавиатур пойдет дым и всё такое прочее?

    Модуль-то у меня с zero-cross, но стоит ли так заботиться об этом пине?

    А так проект смотрится миленько, и сразу с нормальным дисплеем.


    (почему все построители термофенов так любят LCD1602, мне неведомо)
     

    Вложения:

    • hotair4_en.ino
      Размер файла:
      22,6 КБ
      Просмотров:
      7
    • hotair.zip
      Размер файла:
      7,1 КБ
      Просмотров:
      2
  2. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Так в чем проблема ? Не знаете как сделать кросс-детектор ? Нужна симметричная оптопара, или две несимметричных, и три резистора - два пол-ваттных 33 ком, и один любой 10-15 ком. И всех делов на 10 рублей. Главное - не включать в одиночку несимметричную оптопару - пробьёт вход.
    Симметричная опто-пара LTV814, PC814. Если фазоимпульсное управление - резисторов на входе больше чем 33ком лучше не ставить - это съузит диапазон регулирования в сторону макс. значений.
    Термофен устройство мало-инерционное. Просто вкл-выкл регулирование будет происходить очень часто, с большими помехами и токовыми скачками через ключ. Возможно это снизит ресурс ключа, возможно нет. Не знаю. Лучше все же с кросс-детектором. Либо фазовым управлением, либо алгоритмом Брезенхема.
     
    Последнее редактирование: 25 фев 2025 в 19:43
    Gomez нравится это.
  3. Gomez

    Gomez Гик

    Нене, у меня же готовый модуль уже есть.
    схематика_диммера.jpg
    Вопрос в том, что для работы zero-cross нужно прерывание на 2 или 3 пине Arduino, и если включать zero-cross, мне нужно энкодеры снимать с прерываний (или один из них).
    Видел примеры, где прерывания вешаются "на низком уровне" на любые пины, но вот колеблюсь - надо ли так заморачиваться или проще забить на детекцию нуля? Ещё читал, что спираль медленнее нагревается из-за всяких пропусков из-за работы zero-cross.
     
  4. KindMan

    KindMan Гуру

    А как вы будете регулировать мощность, не зная в какой момент открывать симистор?
     
  5. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Энкодеры штуки медленные. Может их приляпать на PCINT-ы ?. Ставите библу, а примеры - при ней... при ней... при ней...
    #include "PinChangeInterrupt.h".
    А кросс-детектор на аппаратное прерывание.
    Выше написано
    ПС. Выложьте пожалуйста файл шрифта из вашего проекта.
    Fonts/URW_Gothic_L_Demi_16.h
    Любопытно погонять в Протеусе. Найти не удаётся. С уважением.
     
    Последнее редактирование: 25 фев 2025 в 21:05
    Gomez нравится это.
  6. Gomez

    Gomez Гик

    Да, я нашёл прекраснейший пример https://arduino.ru/forum/apparatnye-voprosy/ispolzuem-enkoder?page=5#comment-449417 :cool:

    Ооо, это с удовольствием! Интересно, что получится!!! В архиве и тот скетч, и шрифт.
     

    Вложения:

    • hotair.zip
      Размер файла:
      7,1 КБ
      Просмотров:
      4
  7. parovoZZ

    parovoZZ Гуру

    А как ты хочешь управлять симистором? Включать на несколько периодов и затем на несколько периодов выключить? Можно, если не критично, что и температура будет елозить туда-сюда.
     
  8. parovoZZ

    parovoZZ Гуру

    У авр прерывания на всех пинах.
     
    Gomez нравится это.
  9. Gomez

    Gomez Гик

    Ну в вышеуказанном скетче так примерно и есть
    Код (C++):
      const unsigned long measurementPeriod = 250;
    int WindowSize = 1000;
    unsignedlong windowStartTime;
    double Setpoint, Input;  // Temperature (must be in the same units)
    double Output;  // 0-WindowSize, Part of PWM window where output is ACTIVE.

    PID myPID(&Input, &Output, &Setpoint, Kp, Ki, Kd, DIRECT);
    MAX6675 thermocouple(pinSCK, pinCS, pinSO);

      -------------------------------

      //THERMOCOUPLE DRIVER TIMER FOR READING TEMPERATURE (the driver needs min. 250ms)//
      if (millis() - timer >= measurementPeriod) {
        timer += measurementPeriod;
        teplotaC = (thermocouple.readCelsius() + AppSettings.tempadj); //корректировка температуры
      }

      //PART OF THE TEMP PID CONTROL//
      Setpoint = rotary1Count;
      Input = teplotaC, 0;
      myPID.Compute();

      if (currentTime - windowStartTime > WindowSize)
      {
        windowStartTime += WindowSize;
      }
      //WHEN HANDLE SLEEP SWITCH OFF//
      if (digitalRead(sleepsw) == LOW) {
        updateMenu();
        swtrig = false;

        //TRIAC DRIVER OUTPUT CONTROL AFTER PID CALCULATION//
        if (Output < (currentTime - windowStartTime))
          digitalWrite(heaterreg, LOW);
        else
          digitalWrite(heaterreg, HIGH);
    Вкл-выкл, и никаких гвоздей. :)
    Хотя я уже чувствую, что если уж буду делать с zero cross, надо это сделать как-то хитрее, есть прямо под мой модуль с TRIAC библиотека RBDDimmer-master, там есть такие приятности, как

    Код (C++):

    dimmer.setPower(90);
    dimmer.getPower();
     
    И это, как я пониммаю, было бы как-то правильнее увязать с PID, но пока не знаю, как подступиться. :)
     
    Последнее редактирование: 27 фев 2025 в 01:25
  10. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Запустил в протеусе. Экран с графикой и надписями латиницей (на каком-то славянском языке). MAX6675 отлично цифрует температуру. Но на дисплее бред за 1000 градусов. В коде глюк..
     
    Последнее редактирование: 27 фев 2025 в 02:26