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

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

  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 КБ
      Просмотров:
      22
    • hotair.zip
      Размер файла:
      7,1 КБ
      Просмотров:
      33
  2. Ariadna-on-Line

    Ariadna-on-Line Гуру

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

    Gomez Гик

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

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

    Вложения:

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

    parovoZZ Гуру

    А как ты хочешь управлять симистором? Включать на несколько периодов и затем на несколько периодов выключить? Можно, если не критично, что и температура будет елозить туда-сюда.
     
    Gomez и Ariadna-on-Line нравится это.
  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
  10. Ariadna-on-Line

    Ariadna-on-Line Гуру

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

    parovoZZ Гуру

    Здесь пид не нужен. Тупо по температуре с гистерезисом.
     
    Gomez нравится это.
  12. parovoZZ

    parovoZZ Гуру

    Вот только на практике тебя ждёт сюрприз)
     
    Gomez и KindMan нравится это.
  13. parovoZZ

    parovoZZ Гуру

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

    Ariadna-on-Line Гуру

    Не знаю как в реале, но в Протеусе все скетчи с MAX6675 показывали бред. В том числе и собственные примеры из библиотеки МАХа от Адского Фрукта. Совсем уверился в глючность модели. Но - Увидел в репозитории библу MAX6675_with_hardware_SPI. Её собственные примеры в Протеусе идут отлично. Пробую ваш скетч исправить под нее.
    ПС. Ваш скетч тоже пошел на отлично.
     
    Последнее редактирование: 27 фев 2025
    Gomez нравится это.
  15. KindMan

    KindMan Гуру

    Можно немного оффтопа, да простит ТС. Вы, как фанат протеуса, можете протестить этот код
    Код (C++):
    uint8_t Channel_A, Channel_B, Channel_C;
    int8_t Znak = 1;

    void setup()
    {
      TCCR3A = (1 << COM3A1) | (1 << COM3B1) | (1 << COM3C1) | (1 << WGM30);
        TCCR3B = (1 << CS31);

        TCCR4A = (1 << COM4A1) | (1 << COM4B1) | (1 << COM4C1) | (1 << WGM40);
        TCCR4B = (1 << CS41);
     
        DDRE |= (1 << PE3);
        DDRE |= (1 << PE4);
        DDRE |= (1 << PE5);
     
        DDRH |= (1 << PH3);
        DDRH |= (1 << PH4);
        DDRH |= (1 << PH5);
     
        OCR3A = 50;
        OCR3B = 150;
        OCR3C = 250;
     
        OCR4A = 50;
        OCR4B = 150;
        OCR4C = 250;
    }


    void loop() {

      if (((Channel_A += Znak) == 255) || ((Channel_A += Znak) == 0)) {
        Znak = Znak * -1;
      }
      OCR4A  = Channel_A;
      OCR4B  = Channel_A;
      OCR4C  = Channel_A;

      OCR3A  = Channel_A;
      OCR3B  = Channel_A;
      OCR3C  = Channel_A;

      delay(10);
    }
    Это мега2560, У меня в протеусе не работает правильно осцилл на каналах 4B и 4С, после заполнения на половину уходит в 0. При этом в железе всё работает.
    Прикрепил файл протеуса, только расширение сменил, чтобы дал загрузить
     

    Вложения:

    • 2560timer.ino
      Размер файла:
      15,9 КБ
      Просмотров:
      23
  16. Ariadna-on-Line

    Ariadna-on-Line Гуру

    . У вас Протеус 8.13. У меня 8.6. Не берёт. ))) Может сделаете скрин Протеусной схемы. Скомпилилось, мигает пинами. "Навесил" интеграторы - RC цепи 10К, 0,1мкФ. По осциллу вижу шим, формирующий синфазную спадающую пилу с периодом 1280мС. На 6-ти пинах. Это всё. Частота проца в Протеусе - 16МГц. Возможно у вас комп перегружен задачами и симуляция "захлебывается". Обычное дело. Чем новее прога, тем жрет больше ресурсов. И чаще не по делу.
    Могу выложить скрин, но картинка большая и мало-полезная.
     
    Последнее редактирование: 27 фев 2025
  17. KindMan

    KindMan Гуру

    У меня до 50% заполнения шим идёт везде одинаково, а после на пинах PH4 и PH5 уходит в 0.
    Просто уже была пара косяков с протеус, и забил на него, когда принимал его ошибки за свои. А вы, смотрю, прям всё в нем делаете.
     
  18. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Неоднократно читал жалобы на Протеус 8.13 и советы откатиться на 8.6й.
    ПС. В мире нет чудес и у всего есть объяснения. Протеус довольно точно соблюдает тайминги. Поэтому если в библиотеке они не совсем точно соблюдены, то он показывает то, что может произойти в реале.
    Однажды гонял в Протеусе схему подключения к ATmega128 внешней RAM памяти. Вроде схема известная. - Не идет и всё. Допер - ввел в линию элемент задержки - два инвертора, и все засимулировалось отлично. Потом читал жалобы "собиральщиков", на такую же бяку в реале, и на метод ее устранения. А потом внимательно перечитал даташит, и нашел что разработчик процессора сам не гарантирует точного соблюдения таймингов такого подключения. Вот так. Так что Протеус мне нравится. Он достаточно честный.
     
    Последнее редактирование: 28 фев 2025
    KindMan нравится это.
  19. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Симистор с пина без гальванической развязки ???????
     
  20. KindMan

    KindMan Гуру

    А что вас пугает?