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

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

  1. tssergej

    tssergej Нерд

    Я подозреваю что Watashi имел в виду налие что то типа аварийного режима например в случае отвала термопары или пробоя симистора в силовой части.
     
  2. Dmitrysh

    Dmitrysh Гик

    Вот скетч из поста #2118. Переработал его основательно, причесал, оптимизировал, исправил детские болячки, убрал не нужные редакции крупикуса. Выбросил все кроме экрана сторонние библиотеки. Теперь ему нужна только UTFT ну и стандартная EEPROM.
    Скетч рассчитан на работу с кнопочной и резистивной клавиатурой. Чтобы активировать кнопочную раскомментировать строку
    Код (C++):
    #define resist_keyboard 1
    для кнопочной - закоментировать
    Для возможности чтения параметров в ПК раскомментировать
    Код (C++):
    #define params_from_pc 1
    для отключения закомментировать
    Для отключения связи с ПК вообще сделать так
    Код (C++):
    //#define params_from_pc 1
    #define no_pc 1;
    Если сделать вот так
    Код (C++):
    //#define params_from_pc 1
    //#define no_pc 1;
    то передаваться будут только параметры для построения графиков
    Все остальные варианты приведут к ошибкам компиляции.
    Когда вы что-то комментируете или раскомментируете добавляются или убираются соответствующие части кода, поэтому размер кода будет меняться.
    Поменял логику расчёта скорости роста температуры верхнего излучателя. Теперь когда вы задаёте, допустим, 0,5 градуса за секунду, то и получаете 0,5, а не 2 как это было раньше.
    Скорость чтения температуры и расчёта ПИД теперь равные и равны 250мс.
    Заменил фильтр Калмана.
    Графики выводятся со скоростью 1 точка в секунду и синхронизированы с началом пайки.
    Программа для работы со скетчем в архиве. Она совместима с предыдущими скетчами и со скетчами для mega328(по выводу графиков).
     

    Вложения:

    Yojiq, tssergej и Alexey30682 нравится это.
  3. chirokiy77

    chirokiy77 Нерд

    Dmitrysh огромнейшое спасибо!!! Подскажите этот скетч переделан под какое управление нагрузками твердотелки и плата ноля или без платы ноля на симисторах и оптронах без зеро кросс?
     
  4. SOLOway

    SOLOway Гик

    Один из вариантов, без дополнительных датчиков: #1789 от Leonid0071.

    В LDZ на каждом шаге профиля задавалась мощность шага, конечная температура шага и его время, ПИД включался за определенное самим LDZ число градусов до уставки шага и держал уставку заданную в меню оператором длительность шага-(полка). Это (как и у нас) - только для верха, а низ у него, как и у нас работает. LDZ после настройки может работать автономно, но профили в контроллер заливаются через софт для ПК.
    Как сделал Leonid0071? По сути - так же, только ПИД у него работает всё время. Управление от mvm_ksaa похоже реализовано.
    Особняком держится mon с его Atmega128+lcd1602+AD7705+PT100. Однако меню у него - "китайский язык для средних и старших классов" (шутка!!!) - очень навороченное...
    ------------------------------------------------------------------------------------------------------
    Всё хотел попробовать, т.к. где-то даже обсуждали это в теме.
    Код (C++):
    if ((currentMillis - previousMillis) > 1000 / (rampRateStep[currentStep - 1] * 0.1)) //скорость роста температуры от 0.1с. до 3с.
     
    Эта строка? И некоторые переменные увеличились в длину?
     

    Вложения:

    Последнее редактирование: 27 фев 2019
  5. Dmitrysh

    Dmitrysh Гик

    Да, эта строка. Переменные не увеличились.
    Теория говорит, что это должно быть как раз именно так, одно получение температуры - один расчёт ПИД.
    Вот этот вариант очень спорный, можно попасть на сбои в работе.
     
    SOLOway нравится это.
  6. Dmitrysh

    Dmitrysh Гик

    Это димер, рассчитан он на работу с детектором нуля. Какой вариант силовой части не очень принципиально, но предпочтительнее симисторы и оптроны без детектора.
    Для вас поясню. У нас применяется 2 схемы управления нагрузкой
    1. Симисторная схема с оптронной развязкой(в которой нет детектора нуля) и обязательно отдельный детектор нуля.
    2. Твердотельное реле(SSR) в котором детектор нуля уже есть и отдельный детектор нуля. Вот эту схему можно сделать без детектора нуля, используя прерывание таймера(нужно переписывать скетч). Но в таком варианте есть некоторая ошибка управления нагрузкой. Но работать будет в любом случае.
     
  7. chirokiy77

    chirokiy77 Нерд

    Спасибо понял значит ставить твердотелные реле с детектором ноля и отдельную плату ноля
     
  8. Ptisa

    Ptisa Нерд

    Доброе время суток всем участникам проекта. Хотелось бы присоединится к проекту. В программировании не силён. Занимаюсь ремонтом электроники. Заканчиваю слесарную сборку станции. Низ и верх галогенки, SSR самоделки. Низ 9 по 1500W по 3 последовательно, стол разделён на 3+6 (малый, большой либо все) и верх 4 на 500W по 2 последовательно. Детектор ноля, Мега, TFT и блок питания 2А 12V.
     

    Вложения:

    Dmitrysh нравится это.
  9. SOLOway

    SOLOway Гик

    Опять я припёрся с вопросами! :( .
    v1.3.3 было
    Код (C++):
    byte curCount = 0;
    volatile uint8_t counter;
    byte Secs, prev_millis = 0; //это для графиков на ПК
    А у вас
    Код (C++):
    int curCount = 0;
    int counter;
    byte Secs=0;
    double prev_millis=0;
    v1.3.3 использует отдельную переменную для "пересчета ПИД"
    Код (C++):
    unsigned long nextRead3; //переменная для скорости ПИД
    и отдельную переменную для "обновления текущей температуры"
    Код (C++):
    unsigned long nextRead1; //переменная для обновления текущей температуры
    У вас используется только nextRead1, а что вместо nextRead3 ?
    В квадратных скобках цифры:
    Код (C++):
    double rampRateStep[9];
    byte dwellTimerStep[9];
    byte temperatureStep[9];
    в v1.3.3 их значение втрое больше, чем у вас, за что они отвечают?
    Не бейте сильно - последние мозги растеряю :)
     

    Вложения:

    Dmitrysh нравится это.
  10. Dmitrysh

    Dmitrysh Гик

    Давайте по порядку.
    curCount - это похоже знакоместо звездочек, смело ставим byte
    counter - счётчик для рампы и счетчик для времени нахождения на полке, в принципе это byte
    Secs - секундный счётчик количества полупериодов сетевого напряжения(по нему каждую секунду сбрасываются данные в сом порт для графиков). Максимальное значение 100, значит byte.
    prev_millis - в версии скетча 1,3,3 вообще не используется, удаляем. А для формы это unsigned long.
    А зачем 2 переменные для замера одного и того же промежутка времени? Для версии 1.3.3 используются 3 переменные nextread1, nextread2 и nextread3. Первая должна использоваться для отсчёта замеров температуры по 250мс, а используется для формирования буфера отправки данный на ПК(это нехорошо). Вторая должна использоваться для вывода графики через 500мс, а там ещё и меряется температура(не хорошо). Третья используется для отсчёта ПИДа - 250мс, всё вроде хорошо, но есть косячок небольшой.
    Напрашиваются выводы:
    1. Почему так, а не как надо?
    2. Зачем 2 переменные отмеряют один и тот же промежуток времени 250мс?
    Отвечая на ваш вопрос скажу что, в скетче для arduino mega2560 используется только один промежуток времени 250мс и там нужна только одна переменная nextread1. В скетче версии 1.3.3 и др для символьных LCD используются 3 переменные - одна для чтения температуры, вторая для ПИД, третья для графики. Если ПИД и температура считаются за один промежуток времени, то переменных может быть две.
    В квадратных скобках цифры обозначают шаги профиля. У вас 4 профиля по 9 шагов в каждом. А в скетче для arduino mega2560 - 5 профилей по 3 шага в каждом. Вот и вся любовь, как говорится.
    Если что-то не понятно, спрашивайте, не стесняйтесь, я обязательно объясню.
     
    SOLOway нравится это.
  11. tssergej

    tssergej Нерд

    Dmitrish
    Можно и на мой вопрос?
    Я залил ваш последний скеч для теста,.Чисто мега с кнопками и термопарами на столе, хотелось просто потестировать вывод графиков и редактирование профилей с пк. Так вот у меня данные считываются с порта только в режиме "простоя", то есть стоит запустить профиль, тут же график обнуляется (как задумано), но передача данных с этого момента останавливается и в окне данных стоит "ожидаем данные", как только останавливаю профиль . тут же начинается передача данных. Это у меня косяк или же в скече/программе ошибка?
     
  12. Dmitrysh

    Dmitrysh Гик

    Так должно быть, профиль нельзя менять по ходу пайки, только в простое. В режиме пайки выводятся только данные для графика.
    Это обусловлено несколькими причинами
    1. В режиме пайки отрабатывается критическая секция, свободного времени мало, а передача параметров в ПК занимает много времени.
    2. Как правило, менять параметры профиля во время его выполнения нет никакой надобности.
    И ещё, для того чтобы в режиме пайки отображались графики необходимо наличие детектора нуля! Не забывайте это. В режиме простоя графики выводятся без детектора.
     
  13. Dmitrysh

    Dmitrysh Гик

    Подправил вам скетч, что-то много всего накопалось. Посмотрите файл changes.txt, я там вкратце описал что сделал.
     

    Вложения:

    SOLOway нравится это.
  14. Dmitrysh

    Dmitrysh Гик

    Для справки. Чтобы все знали. Если вы увеличиваете скорость пересчёта ПИД, необходимо Ki уменьшать в такое же количество раз в какое вы увеличили скорость пересчёта, а Kd увеличивать в такое же количество раз. При уменьшении скорости пересчёта ПИД наоборот, Ki увеличиваем, Kd уменьшаем. Коэффициент Kp остаётся неизменным.
     
    SOLOway нравится это.
  15. chirokiy77

    chirokiy77 Нерд

    Dmitrysh доброго дня у меня тоже вопрос если нагреватели примерно кварц верх и кварц низ и если нагреватели квац верх и низ керамика но не китай какие примерно цифры выставить в программе на компе по настройке пида у вас я так понял нагреватели галогенки низ и верх
     
  16. Dmitrysh

    Dmitrysh Гик

    Я не могу вам сказать какие коэффициенты подойдут вам, они уникальные для каждого нагревателя и конфигурации оборудования. Эти коэффициенты нужно подбирать под своё железо. Есть много методов, вам советую попробовать метод Зиглера-Никольса. Он хорошо описан в интернете и даёт неплохие результаты, но подстраивать все-равно придётся.
     
  17. Dmitrysh

    Dmitrysh Гик

    Да у меня пока так, но для верха я делаю параболический кварц.
     
  18. Leonid0071

    Leonid0071 Нерд

    Продолжение практики )

     
    Dmitrysh и SOLOway нравится это.
  19. SOLOway

    SOLOway Гик

    (8:25)Я видел очень жирных блох :) Однако Leonid0071 благодарность и признательность от меня! Если открыто игнорировать правила установки датчиков - безусловно, - гоняться за точностью управления нагревателями нет смысла. Кто-то, ведь и платы сверлит иглой от шприца, когда нет сверла. А вообще же во всяком сложном процессе есть некий свод правил, которыми принято руководствоваться, - это приведет и к повторяемости результатов и к обоснованности той самой "ловли блох" - использованию алгоритмов повышенной точности управления нагревателями. Конечно, опыт работы может компенсировать несовершенство оборудования, его слабые места, и в конечном счете это получится тот же самый свод правил, о котором чуть выше я упомянул (только hand made).
     
    Последнее редактирование: 3 мар 2019
    Dmitrysh нравится это.
  20. SOLOway

    SOLOway Гик

    Снова мои вопросы...
    Dmitrysh:
    "16. значение скорости роста выводим вот так lcd.print(rampRateStep[editStep]); Это будут десятые части градуса в сек.
    Например 15 = 1,5*С/сек, 25 = 2,5*С/сек и т.д"
    Значит вот так пояснение:
    Код (C++):
            if (rampRateStep[editStep] >= 30)  //(только целые числа) максимальная скорость роста температуры умноженная на 10
            {
              rampRateStep[editStep] = 30;  //(только целые числа) максимальная скорость роста температуры умноженная на 10
            }
    Тут понятно, а непонятно вот где:
    Код (C++):
     if (rampRateStep[editStep] <= 1)  //(только целые числа) минимальная скорость роста температуры умноженная на 10
            {
              rampRateStep[editStep] = 1;  //(только целые числа) минимальная скорость роста температуры умноженная на 10
            }
    Мы ведь не можем точно удерживать рост температуры со скоростью 0,1С/сек... Или уже можем?
    По количеству шагов внутри профиля - ну, ОК, пусть будут все 9, т.к. карман не тянут и каши не просят, просто работа верха - это 3-4 минуты, как их на 9 шагов раскидать при наших ограничениях вычислительной мощности... И еще обнаружился глюк: Если выставлять от 1 до 30, выставляется, но если от 30 до 1, то после 10 будет 90-80-70-60-50-40-30-20-10. А дальше, если снова нажимать Up будет 20-30-40-50-60-70-80-90-10-11-12-13-14- и так до 30. Можно ли это как-то побороть?
    Dmitrysh:
    "14. Увеличил ограничение dwellTimerStep до 180сек, на всякий случай"
    Я теперь могу верх в один шаг уложить :) . Раньше только двумя приходилось задавать. И тут напасть: от 0 до 180 ставится нормально, а наоборот - вместо остановки на 0 вылезают 251-246-241- до 1, затем 252-247-242- до 2. Но если нажать Up, то сразу станет 180.
    Есть гадость и с установкой мощностей для НИ и ВИ: от 0 до 100 ставится нормально, но если проскочить 0, то станет 255-254-253- до 0, затем опять 255-254-253-. А если нажать Up, станет 100 при условии, что значение более 100.
    Отмечу, что описанные глюки не связаны с правками Dmitrysh. Эти глюки были и ранее, ждал, может кто ещё о них расскажет...

    Причесанный по примеру из поста #2153 Dmitrysh скетч в архиве прилагаю.Файл ПРАВКИ обновлен.
     

    Вложения:

    Последнее редактирование: 3 мар 2019