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

Тема в разделе "Глядите, что я сделал", создана пользователем Jalnin, 2 ноя 2012.

Статус темы:
Закрыта.
  1. Dmitrysh

    Dmitrysh Гуру

    Услышали и я с вами согласен.
     
  2. Dmitrysh

    Dmitrysh Гуру

    В точку! Так и есть, и это настораживает.
     
  3. alfataks

    alfataks Гик

    Ничего здесь страшного нет, я ноутбучные платы кухонной фальгой накрываю и вырезаю окно для чипа, равномерность нагрева повышается. На низ я оставил термопару, но установил ее возле кварцевых трубок, вылет по температуре бывает и до 10 градусов, но на плате этот вылет практически не ощущается. Датчик верха поменял на терморезистор РТ100 и увеличил мощность верха до 800 Вт. и все Ок стало.
     
  4. Dmitrysh

    Dmitrysh Гуру

    А что в качестве ВИ используете?
     
  5. alfataks

    alfataks Гик

    Кварцевые трубки. Когда делал, всю информацию брал вот из этого форума
    http://www.rom.by/forum/Samodelnaja_IK_pajalnaja_stantsija
    Всем советую прочитать весь раздел форума, там очень много информации, все расчеты и не только.
     
    SOLOway нравится это.
  6. SNMar4enko

    SNMar4enko Нерд

    Хорошо - не хотите ПИД разгонять, тогда шкалу мощности приведите к фактической: 20 - для твердотельного реле или 50 для фазового управления симмистором, плюс по возможности период ШИМ регулятора сделайте меньше или равным периоду опроса ПИД. Дружить параметры - выводит нашы паяльные станции в рабочий режим. Ведь как гдето ранее писал паяльная станция с твердотельным реле не имеет никакого согласования по мощности с выходом ПИД что приводит к невозможности установить коэффициенты ПИД.

    Рассуждаем дальше: время установившегося значения ПИД тоже 500 милисекунд. ПИД опрашивается раз в 100 милисекунд. Получается для установки значения есть 5 периодов ПИД. В принципе если не будет никакой нештатной ситуации и обогреватели у нас довольно мощные (около 2 квт низ - 5% это 100вт) то на 1 градус нагреем.

    Далее рассмотрим случай с твердотельным реле. У нас Период ШИМ 200 милисекунд. Включение происходит на один полупериод сети 10 милисекунд. То есть ШИМ твердотельного реле имееет 20 значений (200/10). Одно значение фактически 5%. Вишеупомянутые 5 делений уже 25% (500 вт для низа - не хило - перелет обеспечен). Тем более что есть несогласованость переиода ШИМ 200 милисекунуд и периода ПИД 100 милисекунд, причем период ШИМ для полноценного регулирования должен равняться или меньше периода ПИД. Получается что ШИМ отработав пол периода получает новое значение мощности. Это кое как работает лишь в случае накопления прошлой мощности как ошибки и включение по 50% уровню. В версии my1.5.3 и my1.5.4 регулирование происходит пропорционально заданной мощности - сразу включение , потом когда время перевалит время пропорциональное мощности включения - выключение. Приводит к сбоям в регулировании - в частности когда перегрев и идет сброс мощности меньше 50% - а прошлый весь переиод уже нагрет (на первые 50% уже не повлияешь и идет перегрев дальше.) Обратная ситуация была небольшая мощность, нагрев выключился допустим на 20%, во втором полупериоде регулирования повисили мощность вплоть до 50% - так как время до 50% вышло - то до конца переиода ничего не включается - а донагрев раз ПИД сказал нужен ... и получем недолет ...... думаю внятно объясняю.
    Да еще - раз 20 значеним ШИМ регулятора - то ограничение мощности еще их сокращает и ухудшает качество регрулирования.

    Далее рассмотрим случай с Симмисторным фазовым управлением. Раз ПИД период опроса не уменьшаем то и нормировать выход ПИД на уровне 50 не имеет смысла. Оставим его на уровне 100. Далее период ШИМ 10 милисекунд есть меньше периода опроса ПИД. Здесь все в порядке - регулятор 10 периодов отрабатывает на одном устновленном значение мощности. Ограничивать мощность на 100 кратной шкале вполне можно. Но здесь есть ложные срабатывания - когда импульс одного полупериода опаздывает попадая в другой (следующий) полупериод - а симмистору то что - включил на весь полупериод и доволен как слон.Отсюда и вылеты температур.
    Нужно с этим как то придумать как бороться.

    Общим спорить больше нет сил .... и времени
     
  7. Здравствуйте уважаемый SNMar4enko, также приветствую всех остальных.
    Сразу скажу о себе. Я студент и ранее не занимался ремонтом ноутбучных плат, это значит не пользовался инфракрасной станцией (пока проводил тесты на лампочке и на нижнем подогреве). C азами теории автоматического регулирования и электроникой знаком. Любые советы по программной части будут от вас не лишними.

    Станция построена на контроллере Arduino Uno. Нижний нагреватель - галогеновые лампы 9 шт по 400 Вт включенные секциями по 3 шт, за секцию отвечает свой тумблер на корпусе. Верх - керамика 450 Вт.
    Для отображения важных настроек сделано меню на 4 пункта со своими подпунктами, аппаратная часть - 6 кнопок(покупал клавиатуру), 2 модуля термопары с max6675, пьезо, LCD2004 I2C, 2 твердотельных реле на 40А.

    О коде - выбран ШИМ частотой 5 Гц ( идея взята с сайта https://mysku.ru/blog/aliexpress/47529.html)
    Периодичность вывода на дисплей температуры - 1 cекунда. Время расчета ПИД также 1 cекунда. Как считаете это допустимо для такой системы?

    Теперь о режимах меню

    1 Ручной режим. Использует параметры, которые можно менять в реальном времени и содержит две операции - прогрев платы и прогрев места пайки. Планирую добавить ограничение мощности
    Здесь нужен совет
    У меня сделано так запускается НИЗ. ПИД выходит сразу на полную мощность (100), затем при приближении к уставке (пусть 150 гр) ПИД начинает постепенно снижаться и до нуля,возможен перегрев. Как только достигнута уставка НИЗА запускается ВЕРХ и аналогично греет до скажет 210 гр. SNMar4enko в этом случае согласен с вами "регулирование происходит пропорционально заданной мощности", то есть это сразу ниочем вариант?
    Считаю что более правильно для этого режима в меню выбирать текущий нагреватель(работает либо низ либо верх но не оба), передавать ему фиксированную мощность (без пида) и по достижении скажем +-5 гр от уставки отключать.

    2 Автоматический режим. Использует заранее настроенный профиль записанный в EEPROM
    Будет полностью аналогично коду SNMar4enko
    3 Настройки. Будет почти анвлогично вашему коду, но вместо долгого нажатия кнопки выбран отдельный пункт
    4 ******. Связь с ПК через Serial интерфейс

    Следующие вопросы
    Посмторел много версий прошивок станций, но как ограничить мощность на выходе ПИД пример до 50%(полка) от максимальной 100 % не понял.
    По коду pwr_BOTTOM - значение огр мощности, outputPower1 - мощность после ПИД, reg1 - огр мощность. Это подойдет подзадачу? У меня не заработало ПИД начал чудить

    Код (C++):
    uint8_t OutPWR_BOTTOM() {
      static uint8_t er1=0; //  ошибка округления
      uint8_t reg1 = round(outputPower1*(pwr_BOTTOM*0.01)) + er1; //pwr- задание выходной мощности в %, er- ошибка округления
      if (reg1 < 50) er1 = reg1; // reg- переменная для расчетов
      else er1 = reg1 - 100;
      return reg1;
    }
    Следующие предложения
    Исползуйте для кнопок отдельную библиотеку. позволит не переписывать каждый раз конструкцию с millis.
    Код (C++):
    if (downSwitchState == HIGH && ( millis() - ms_button)>500)//same as above just go down one profile
          {
            ms_button =  millis();
    Код станет более читабельным и понятным
    Выложил файлы своей (короткое и долгое нажатие), создайте папку "Class_do_btn_long" в documents/libriries и переместите туда эти файлы
    Далее до setup() объявите
    Код (C++):
    Cl_do_btn_long Btn_down(/*пин*/8);
    Cl_do_btn_long Btn_up(9);
    Cl_do_btn_long Btn_ok(10);
    Cl_do_btn_long Btn_prev(11);
     
    Функции объявите до setup()
    Код (C++):
    // кнопка 1
    void press_down() { /*обработчик короткого*/
      // что то делать
    }
    void longPress_down() { /*обработчик длинного*/
    // что то делать
    }
    В loop() поместите
    Код (C++):

    Btn_down.run(&press_down, &longPress_down);
     

    Вложения:

    Последнее редактирование: 15 май 2018
  8. Dmitrysh

    Dmitrysh Гуру

    Какой у вас ПИД и какой скетч? Есть вариант с димером и фазовым управлением
     
  9. SOLOway

    SOLOway Гуру

    Оставлю здесь не рекламы ради, но просвещенья для :)
    На страничке ссылки на скачивание софта (не требует установки, работает из папки) и описания к нему. Где-то в теме по ИК станциям видел, что в софте есть режим ДЕМО, там можно покрутить профили из предложенных производителем софта...
     
  10. Скетч приложил (более новый дорабатываю). У меня нагрузка диммируется без детектора нуля симисторным оптроном(твердотельное реле)

    Объясню подробнее
    Функция ШИМ, входным аргументом является рассчитанная мощность Output1
    Код (C++):
    // алгоритм ШИМ с частотой 5 Гц
    void mode_PWM1(uint8_t Output1) {
      static unsigned long prevTime = 0;
      if ((state_bottom == 0) && ((millis() - prevTime) >= 200 * (100 - Output1) / 100)) {
        state_bottom = 1;
        PORTC |= 1 << RELAYPIN_H;
        prevTime = millis();
      }
      if ((state_bottom == 1) && ((millis() - prevTime) >= 200 * Output1 / 100)) {
        state_bottom = 0;
        PORTC &= ~(1 << RELAYPIN_H);
        prevTime = millis();
      }
    }
    Инициализация библиотеки ПИД. outputPower1 - выходная мощность
    Код (C++):
    PID myPID1(&tc1, &outputPower1, &setTemp1, kp1, ki1, kd1, DIRECT);
    И она передается в функцию в строке
    Код (C++):
    mode_PWM1(outputPower1);
    Мне нужно передавать в эту функцию допустим не более р = 50% мощности(при макс 100), то есть outputPower1 ограничивается р
    Код (C++):
    mode_PWM1(p); // р <= 50%
     

    Вложения:

    • my1.5.4.ino
      Размер файла:
      37,8 КБ
      Просмотров:
      493
    Последнее редактирование: 15 май 2018
  11. Dmitrysh

    Dmitrysh Гуру

    Есть в библиотеке метод
    myPID.SetOutputLimits(min_pwr, max_pwr);
    Ставте min_pwr=0; max_pwr=50;
     
  12. Dmitrysh

    Dmitrysh Гуру

    А почему детектор не поставите, точнее включение будет и можно программный димер использовать с алгоритмом Брезенхема.
     
  13. Не хочется усложнять, буду благодарен если объясните суть алгоритма Брезенхема конкрктно для регулирования
    Этот метод задает границу выхода, а не ограничение(меня интересует второе).
    По умолчанию граница 0 - 255. При этом выход принимает значения только в этом диапазоне. Если ограничить 0 -100
    Код (C++):
    myPID.SetOutputLimits(0,100);
    подаваемая мощность не изменится,сузится диапазон ее изменения (100 делений против 255)
     
    Последнее редактирование: 15 май 2018
  14. Dmitrysh

    Dmitrysh Гуру

    Алгоритм нужен для равномерного распределения импульсов управления по периоду. Допустим у нас есть 8 периодов(или полупериодов) сетевого напряжения. Нам нужно подать 50% мощности. Самый простой вариант 11110000 и тд 11110000. А можно использовать алгоритм Брезенхема и он сделает 01010101. Это в двух словах. Для излучателя так лучше.
     
  15. Dmitrysh

    Dmitrysh Гуру

    Вы приводили, кстати его реализацию.
    Код (C++):

    uint8_t OutPWR_BOTTOM() {
      static uint8_t er1=0; //  ошибка округления
      uint8_t reg1 = round(outputPower1*(pwr_BOTTOM*0.01)) + er1; //pwr- задание выходной мощности в %, er- ошибка округления
      if (reg1 < 50) er1 = reg1; // reg- переменная для расчетов
      else er1 = reg1 - 100;
      return reg1;
    }
     
    У нас реализация такая
    Код (C++):
    void OutPWR_TOP(){
           reg1 = round(Output1) + er1; //pwr- задание выходной мощности в %,в текущем шаге профиля, er- ошибка округления
            if (reg1 < 50){
              out1 = LOW;
              er1 = reg1; // reg- переменная для расчетов
              }
            else {
              out1 = HIGH;
              er1 = reg1-100;
            }
           digitalWrite(RelayPin1,out1);//пин через который осуществляется дискретное управление
           }
     
  16. Спасибо, понял уже что нужна привязка к нулю сетевого напряжения, а есть ли возможность просто в лоб ограничить мощность. Допустим задали ограничение 75%( или для 4 периодов 1110). Запустили нагрев. ПИД сразу захотел поднять мощность до 100%(текущая пусть 25 гр - уставка 150 гр). Но вот это ограничение должно не давать так завышать мощность и держать ее на уровне 0-75%. То есть фактическмй максимум 100% но требуется ограничить поменьше

    Да переделал под себя, но тогда не задумывался о привязке к сети
     
    Последнее редактирование: 15 май 2018
  17. Dmitrysh

    Dmitrysh Гуру

    Дак так и должно быть. Смотрите, ошибка 150-25=125. Даже если Kp=1, то выход ПИДа 125% не учитывая интеграл и дифференциал.
    Ограничте условием if (outputPower1>75 ) outputPower1=75; Уменьшите Kp. Передавайте уставку частями чтобы ошибка была не большой. Используйте методы усреднения. Вариантов много, все зависит от потребности.
    А зачем вам так надо?
     
  18. Этот вопрос больше касается низа
    Давайте порассуждаем.
    Да суть процесса определяется правильным выбором коэффициентов. Но пускай я взял средние, Kp небольшой. Вот запустили мы нижний нагрев. Мощности явно не хватает, нагрев протекает долго. Увеличил Kp сразу мощность возросла до максимальной, плата снизу догрелась, но заметное перерегулирование в 5 гр. Возможно это и нормально. Но если первоначально ограничить планку мощности до 90% то второй случай пройдет более равномерно. Как считаете?
    Есть вариант для нижнего нагрева в основной части и при приближении к уставке использовать разные коэффициенты. Когда остается 10-15 гр до уставки использовать более низкие, чтобы мощность стабилизировалась. Подумайте
     
    Последнее редактирование: 15 май 2018
  19. Dmitrysh

    Dmitrysh Гуру

    Терпимо, но можно лучше. Теоретически при опросе датчика в 1 сек, точность достижима +/- 1 градус.
    Ну да, так и есть. Используйте рампу, т.е передавайте уставку частями. Посмотрите как у SNMar4enko сделано. Его скетч по железу ближе к вашему, а ещё он его постоянно оптимизирует. У нас тоже есть такая фишка для верхнего нагревателя. Я думаю это самый лучший вариант.
     
  20. Подумаю, спасибо
     
Статус темы:
Закрыта.