ИК паяльная станция на Arduino Mega 2560. Доработка скетча "ARS_v2_Lilium_JSN"

Тема в разделе "Arduino & Shields", создана пользователем vector99, 7 дек 2016.

  1. Dmitrysh

    Dmitrysh Гик

    Я же вам показывал что даже при Кр=1 и большой ошибке будет 100%
     
  2. Dmitrysh

    Dmitrysh Гик

    Нет, вы ошибаетесь. Посмотрите библиотеку и вы увидите что там простое ограничение выхода, никакого масштабирования ничего, тупо if ( out>out_max ) out=out_max;
     
  3. Aleksander1997

    Aleksander1997 Нерд

    Да спасибо вы правы, плохо посмотрел исходники. Теперь стало понятно:).
     
  4. bamik

    bamik Нерд

    На самом деле, смотря как понимать выход у ПИДа. Его можно понимать как готовое значение для ШИМ, а можно понимать как некий % мощности. И уже снаружи ПИДа получать эту мощность. По здравому смыслу, запихивать границы реальной мощности в библиотеку ПИДа - вносить сумятицу в горячие головы. Правильней сделать дополнительную функцию, которая будет вычислять значение подаваемой мощности на основе данных ПИДа. А ПИД должен выдавать значения от -100% до 100%. В AVR211 проверка на границы есть, но то границы разрядности или масштаба %%, а не мощности.
     
  5. Dmitrysh

    Dmitrysh Гик

    Дело в том что выход ПИД в общем смысле величина бесконечная. Там нет ни процентов мощности ни границ. По формуле видно что интеграл будет копиться пока есть ошибка или пока его не ограничат, как у нас в библиотеке.
     
  6. Dmitrysh

    Dmitrysh Гик

    Попробуйте сформулировать идею поподробней, это интересно.
     
  7. Dmitrysh

    Dmitrysh Гик

    А как понимать отрицательный выход? Охлаждение?
     
  8. bamik

    bamik Нерд

    С точки зрения ПИД - охлаждение.

    Тут Вы ошибаетесь несколько раз. Как минимум есть ограничение разрядности. Любые ограничения, накладываемые на составляющие ПИДа - это не ограничения абсолютных величин, а ограничение точности. Можно ограничить диапазоном +-100. Но это будет значить только то, что точность регулирования равна 1%. Если взять +-200, то 0,5%. В идеале, когда процесс перестал колебаться, выход ПИДа должен быть равен 0, т.к. ошибка равна 0, и дифференциальная составляющая полностью нигилирует интегральную составляющую. Если это не будет достигаться, то процесс будет продолжать колебаться. Подаваемая мощность формироваться должна вне функции ПИДа. ПИД только подбирает эту мощность. Либо я где-то что-то упустил и недопонял.
     
  9. Dmitrysh

    Dmitrysh Гик

    Так не бывает, потому что система всегда теряет энергию. В установившемся режиме выход пид просто будет постоянной величиной, которая будет компенсировать потерю энергии. Ну а теоретически да, при нулевой ошибке нулевой выход. А колебания для ПИДа это нормальное явление,это же регулятор. Вопрос в каком диапазоне? Вообще, классический ПИД без ошибки работать не может в принципе. Посмотрите на математику библиотеки - всё завязано на ошибку.
    Могу ошибаться, не спорю. Но, я думаю, что у нас если не ограничить ПИД он все равно не выскочит за разрядность double. Просто нам значения больше 100 ни к чему на данный момент. Наш ПИД, кстати, считает с точностью 32 бита, просто нам их некуда запихнуть. Не знаю как это правильно объяснить, но у нашего ПИДа нету верхней границы выходной величины с точки зрения математики, потому как она зависит от коэффициентов и накопленного интеграла, а интеграл бесконечен.
    Тут я не понимаю как так получается, но думаю что похоже на правду если не заходить в отрицательную область.
    А вообще мне понравилась реализация SNMar4enko. Идея на грани гениальности. Он расширил диапазон регулирования до 200, т.е 0,5%. Организовал ШИМ на таймере. Вот только я не понял зачем он разделил НИ и ВИ по разным полупериодам. По сути это, как вы пишите:
     
  10. bamik

    bamik Нерд

    Я говорил про идеальные условия, когда нет случайных факторов. Под ошибкой понимается разность между чем-либо. Между желаемым и текущим, между прошлым и текущим.
    Значение 0 на выходе ПИД говорит о том, что система стабилизировалась. И требуется только поддерживать найденное состояние. Поэтому снаружи ПИД и должно находиться значение мощности, подаваемое на нагреватель. А ПИД указывает, сколько нужно добавить или убавить.
    С точки зрения математики ограничений нет, но у нас есть разрядность переменных. Потому мы и накладываем ограничение. Но ограничиваем мы не мощность, а только максимальное значение ПИД. Потому я и говорю о %%. Ведь больше 100% быть не может. Вопрос только в том, к чему эти проценты прикладывать. Если к мощности нагревателя, как сейчас, то процесс ускоряется, но будут дикие выбросы, удары тока по ключам, в случае малой инерционности нагревателей локальный перегрев элементов с высокой теплопроводностью (дроссели, трансформаторы, конденсаторы). Если % прикладывать к текущей мощности, то все встает на свои места. Процесс немного замедляется (в шагах заметно, во времени почти не заметно), но выбросов резких не будет.
    Попробую описать. Мы включаем станцию и подаем изначально 10Вт из 3КВт, например. ПИД наблюдает огромную ошибку и говорит увеличить мощность на 100%. Мы подаем 20Вт. ПИДу мало - опять 100%. 40Вт, 80Вт, 160Вт, 320Вт, 640Вт, 1280Вт. Т.е. при опросе ПИД каждую секунду разогрев нагревателя будет происходить целых 7 секунд. Плавно. Но тут он почувствовал, что ошибка уменьшилась, но все еще велика. 50% просит добавить. 1920Вт. Этого оказалось много, и следующее измерение показало отрицательную ошибку, но она будет меньше по модулю, чем предыдущая. ПИД просит убавить 25%. 1440ВТ остается. Это уже ближе к желаемому. и т.д.
    Зачем разделять ВИ и НИ по полупериодам я не понимаю. Смысл в чем? Разве что уменьшить нагрузку на электросеть. Но нагреватели будут работать не более чем на 50%. Я не вникал в скетч в разделе непосредственного управления нагрузкой. Там не должно быть ничего сложного. Но считаю, что датчик перехода 0 - лишнее. Управление симистором лучше доверить железу с датчиком перехода 0. А импульсы на открытие подавать с частотой 100Гц и длительностью 95% от длины периода. Тогда перекрытия периодов не будет, а накапливаемая ошибка рассогласования частоты электросети и частоты импульсов управления даст незначительное снижение мощности.
     
  11. Dmitrysh

    Dmitrysh Гик

    Датчик перехода нужен ибо нужно синхронизироваться с сетью. Если мы подадим 95% от длины ПОЛУпериода с частотой 100Гц в середину полупериода, то захватим 2 полупериода. А это ущерб для точности.
     
  12. SNMar4enko

    SNMar4enko Нерд

    все просто если мощность нагревателей велика и на 50 % мощности тоже перелеты (есть запас) то можно так делать ....если нагреватели слабы - то можно убрать четность периодов.
     
  13. Dmitrysh

    Dmitrysh Гик

    Это достаточно сложно реализовать, потому как при использовании твердотельных реле получается не очень большая точность и скорость, потому что работать нужно с целыми периодами или полупериодами.
     
  14. Dmitrysh

    Dmitrysh Гик

    Да наверно так тоже хорошо.
    Расскажите по этому кусочку кода
    Код (C++):
    if (!TopStart) DimmerUP=220;
        else {
          myPID1.Compute();
          DimmerUP=map(Output1,0,200,200,16);
          }
         
        if (!flag) DimmerDOWN=220;
        else {
          myPID2.Compute();
          DimmerDOWN=map(Output2,0,200,200,16);
        }
    Откуда DimmerUP=220? Почему 220?
     
  15. Aleksander1997

    Aleksander1997 Нерд

    #124("Народный" инкубатор http://arduino.ru/forum/proekty/narodnyi-inkubator?page=2)
    Код (C++):
    //расчет мощности по ПИД закону регулирования
        //Параметры регулятора
        #define kP 6//коэффициент пропорциональности
        #define p_min 0.0//минимум П составляющей - не < 0
        #define p_max 100.0//максимум П составляющей - не > 100
        #define kI 0.100//коэффициент интегрирования
        #define i_min 0.0//минимум И составляющей
        #define i_max 30.0//максимум И составляющей
        #define kd 0//коэффициент диференциирования
        #define d_ctl 7.0//зона пропорциональности ust-d_ctl
        #define out_min 0//минимальный выходной %
        #define out_max 100//максимальный выходной %

        //Расчет управляющего воздействия
        //возвращает необходимое воздействие в %
        uint8_t PIDctl(float temp, float ust) {
            uint8_t out = 0;
            static float i = 0;
            static float ed = 0;
            float e, p;
            float d;
            e = (ust - temp); //ошибка регулирования
            p = (temp < ust - d_ctl) ? p_max : (temp > ust) ? p_min : (kP * e); //П составляющая
            i = (i < i_min) ? i_min : (i > i_max) ? i_max : i + (kI * e); //И составляющая
            d = kd * (e - ed); //Д составляющая
            ed = e;
            out = (p + i + d < out_min) ? out_min : (p + i + d > out_max) ? out_max : p + i + d;
        return out;
        }
    От себя добавлю, что расчет ПИД PIDctl лучше задавать как в библиотеке через опр промежуток времени. Идея проста - использовать конструкцию с millis() как в примере blink без delay

    Код (C++):
    //
    void tempToPID( ) {
    static unsigned long prevTime = 0;
      if (millis() - prevTime > 500) { // замеряяем каждые 500 мс
        prevTime = millis();  //
        outputPower1 = PIDctl(tc1, setTemp1); //расчет мощности
      }
    }
    У себя объявил
    Код (C++):
    uint8_t setTemp1 = 0.0; // заданная температура тип uint8_t
    float tc1 = 0.0; // текущая температура тип float
    byte outputPower1 // вых мощность
    Оцените такой вариант ПИД регулятора

    Также полезные ссылки
    1 Управление ТЭНами пропуском периодов ШИМ (http://arduino.ru/forum/programmirovanie/upravlenie-tenami-propuskom-periodov-shim)
    2 Устройство ФИУ на симисторе (диммер) для Ардуино (http://arduino.ru/forum/apparatnye-voprosy/ustroistvo-fiu-na-simistore-dimmer-dlya-arduino?page=1)
     
    Последнее редактирование: 17 май 2018
  16. bamik

    bamik Нерд

    Не нужен, если оптосимистор имеет встроенный модуль перехода 0. А 95% длины полуволны требуется, чтобы импульс не закончился до перехода через 0. Тогда гарантированно ключ откроется в следующем полупериоде.
     
  17. Dmitrysh

    Dmitrysh Гик

    Да откроется. Но мы не знаем когда он закроется и когда открывать в следующий раз. Поэтому будут выпадать полупериоды. Лучше все таки детектор иметь.
     
  18. SOLOway

    SOLOway Гик

    Разные схемы ZCC ловят ноль по-разному, плюс термонестабильность простейших схем, связанная с рассеиванием тепла на гасящих резисторах, плюс сильная зависимость от помех и величины тока через фототранзистор оптрона... Я видел осцилограммы - там всё "не айс", схемы с трансформатором тоже не лишены недостатков. Или есть вариант использования ZCC тех же самых MOC3043 для ловли ноля? Эти факторы как-то влияют на правильность работы?
     
  19. Dmitrysh

    Dmitrysh Гик

    По идее должны влиять, но у меня проблем пока не было.
     
  20. Aleksander1997

    Aleksander1997 Нерд

    У меня ПИД (я ранее предлагал) отрабатывает нормально:). Для тех кому интересно добавлю - видел предложения кажется ваше Dmitrysh чтобы выход был в % 0т 0 до 100%. В коде как раз это реализовано out_min = 0, out_max = 100. Значение d_ctl у себя ставил 100, чтобы уже на полпути мощность начинала падать прцентов на 20-25%. И не было перелетов. Попробуйте у себя сделать, код более емкий по расходу памяти но функционал хороший