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

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

  1. Yurik-o

    Yurik-o Нерд

    Ну, скажем кардинально новых версий пока нет, хотя есть куда двигаться вместе с форумом. Моя последняя версия 1m5. версия 2m1 не пошла и я начал версию 3m0 - здесь у меня полное перелопачивание интерфейса с настройкой параметров почти "на лету", не уходя в отдельное меню настроек, но она далека до завершения - банально нет на это времени, если кому интересно покопаться могу выложить.
    disp.h нужен. В третьей версии их (.h) уже много, я сгруппировал и вынес в отдельные файлы функции и подпрограммы для удобства.
     

    Вложения:

    • ARSUNO_v1m5.ino
      Размер файла:
      54,2 КБ
      Просмотров:
      308
    • disp.h
      Размер файла:
      1,2 КБ
      Просмотров:
      305
    • display_m5.jpg
      display_m5.jpg
      Размер файла:
      580,2 КБ
      Просмотров:
      529
    Последнее редактирование: 5 май 2018
    Vinyla и SOLOway нравится это.
  2. revolover

    revolover Гик

    Бывает) Перекурил, успокоился. Погляжу, может и интерфейс поправлю, может перезакажу, только теперь я совсем в ступоре, как экран выбрать и нужен ли шилд...
     
  3. Dmitrysh

    Dmitrysh Гик

    нет не нужен, если только на sd карту писать не будете. А на моем, вроде и сдишка есть
     
    Последнее редактирование: 4 май 2018
  4. Dmitrysh

    Dmitrysh Гик

  5. bamik

    bamik Нерд

    Под системой понимается не только нагреватель. Его инерционным можно называть только в том случае, если мы будем управлять его нагревом и измерять его температуру. Для стандартного алгоритма применения ПИДа к паяльной станции нагреватели должны быть такой мощности, которой достаточно для достижения температуры уставки. А не по принципу, чем больше тем лучше. Либо сам нагреватель должен успевать менять свою температуру в короткое время. Тогда вся система будет достаточно инерционной для работы ПИДа. Есть разработки, где и нижний и верхний нагреватели имеют мощность по 350 Вт в кварце. И все отлично работает.
    По-идее, ПИД предназначен для поддержания некоего состояния с минимумом выходов за пределы при неопределенных факторах сторонних воздействий. Мы же его заставляем делать несколько другую работу.
     
  6. tssergej

    tssergej Нерд

    только не у этого перца заказывать...слишком много негативных отзывов у него.
     
  7. Dmitrysh

    Dmitrysh Гик

    Да, это я для примера показал какой нужен.
     
  8. Dmitrysh

    Dmitrysh Гик

    Расписал переменные скетча, так как я их понимаю. Может кому сгодится.
    Код (C++):
    extern uint8_t SmallFont[];      //маленький шрифт lcd
    extern uint8_t BigFont[];        //большой шрифт lcd
    extern uint8_t BigFontRus[];     //Кирилица
    extern uint8_t SevenSegNumFont[];//шрифт в виде семисегментного индикатора

    int temp;

    int er1 = 1;  //переменная для расчета переполнения в алгоритме Брезенхема для ВИ
    int er2 = 1;  //переменная для расчета переполнения в алгоритме Брезенхема для НИ
    int reg1;     //промежуточная переменная для алгоритма Брезенхема для ВИ
    int reg2;     //промежуточная переменная для алгоритма Брезенхема для НИ
    boolean out1; //выход импульса управления ВИ алгоритма Брезенхема
    boolean out2; //выход импульса управления НИ алгоритма Брезенхема

    //int pwr1; - атавизм, нужно убрать из скетча
    //int pwr2; - атавизм, нужно убрать из скетча

    //секция ввода/вывода для ПЭВМ
    char buf[20];   //буфер вывода сообщений через сом порт
    char buf1[70];  //буфер вывода праметров через сом порт
    String ttydata; //принятая строка параметров с сом порта от ПЭВМ



    int min_pwr_BOTTOM;              //минимальная мощность нижнего нагревателя
    int max_pwr_BOTTOM;              //максимальная мощность нижнего нагревателя
    int min_pwr_TOPStep[3];          //минимальная мощность верхнего нагревателя
    int max_pwr_TOPStep[3];          //максимальная мощность верхнего нагревателя

    //RelayPin "1"-ВЕРХНИЙ нагреватель
    //RelayPin "2"-НИЖНИЙ нагреватель
    #define RelayPin1 7  //назначаем пин "ВЕРХНЕГО" нагревателя для управления симистором ВИ
    #define RelayPin2 6  //назначаем пин "НИЖНЕГО" нагревателя для управления симистором НИ


    // Выходы реле
    #define P1_PIN 9   //назначаем пин реле 1 - секция 1 НИ
    #define P2_PIN 10  //назначаем пин реле 2 - секция 2 НИ
    #define P3_PIN 11  //назначаем пин реле 3 - секция 3 НИ
    #define P4_PIN 12  //назначаем пин реле 4 - секция ВИ


    int tableSize=3;  //количество подключенных секций НИ
    int buzzerPin = 8;//пин пищалки

    // int time = 0; - это что-то лишнее

    //Назначаем пины кнопок управления
    int upSwitchPin = 21;     //пин кнопки вверх
    int downSwitchPin = 20;   //пин кнопки вниз
    int cancelSwitchPin = 19; //пин кнопки отмена или назад
    int okSwitchPin = 18 ;    //пин кнопки ОК или подтверждения

    //состояние кнопок по умолчанию
    int upSwitchState = 0;       //состояние кнопки вверх
    int downSwitchState = 0;     //состояние кнопки вниз
    int cancelSwitchState = 0;   //состояние кнопки отмена или назад
    int okSwitchState = 0;       //состояние кнопки ОК или подтверждения

    //переменные для кнопок
    long ms_button = 0;                 //время в мс сколько была нажата кнопка
    boolean  button_state = false;      //статус короткого нажатия кнопки
    boolean  button_long_state = false; //статус длинного нажатия кнопки

    //секция профиля
    byte currentProfile = 1;//текущий профиль
    int currentStep = 1;    //текущий шаг профиля
    byte profileSteps=3;    //количество шагов профиля
    int profileName;        //имя профиля

    //current editing step pointer
    int editStep = 0; //номер шага профиля который редактируется в данный момент

    int dwellTimerStep[3]; //установленное время перехода на следубщий шаг
    double rampRateStep[3];//скорость роста температуры
    double TimerStep;      //текущее время перехода на следующий шаг

    int kp1;  //пропорциональный коэффициент ПИД для ВИ
    int ki1;  //интегральный коэффициент ПИД для ВИ
    int kd1;  //дифференциальный коэффициент ПИД для ВИ
    int kp2;  //пропорциональный коэффициент ПИД для НИ
    int ki2;  //интегральный коэффициент ПИД для НИ
    int kd2;  //дифференциальный коэффициент ПИД для НИ

    double startTemp; //стартовая температура для профиля, когда НИ вышел на уставку, используется для определения шага профиля с которого начинаем

    int setpointRamp; //заданная температура по определённому шагу профиля ВИ, связана с заданной скоростью роста температуры
    boolean TopStart = false; //флаг включения ВИ
    int flag = 0;             //флаг для фиксации стартовой температуры
    int x=1;                  //переменная для перехода на нужный шаг при горячей плате
    int temperatureStep[3];   //заданные температуры для шагов профиля ВИ

    //int eepromAddress = 0;//начало eepromaddress - атавизм, нужно убрать из скетча

    long previousMillis; //это для счетчиков времени

    double counter;     //это сам счетчик времени

    //these are the different states of the sketch. We call different ones depending on conditions
    // ***** TYPE DEFINITIONS *****
    //структура статусов событий
    typedef enum REFLOW_STATE:byte
    {
      REFLOW_STATE_IDLE,
      REFLOW_STATE_MENU_STEPS,
      REFLOW_STATE_MENU_TABLE_SIZE,
      REFLOW_STATE_MENU_BOTTOM_HEAT,
      REFLOW_STATE_MENU_BOTTOM_PWR_MIN,
      REFLOW_STATE_MENU_BOTTOM_PWR_MAX,
      REFLOW_STATE_MENU_STEP_RAMP,
      REFLOW_STATE_MENU_STEP_TARGET,
      REFLOW_STATE_MENU_TOP_PWR_MIN,
      REFLOW_STATE_MENU_TOP_PWR_MAX,
      REFLOW_STATE_MENU_STEP_DWELL,
      REFLOW_STATE_MENU_BOTTOM_P,
      REFLOW_STATE_MENU_BOTTOM_I,
      REFLOW_STATE_MENU_BOTTOM_D,
      REFLOW_STATE_MENU_TOP_P,
      REFLOW_STATE_MENU_TOP_I,
      REFLOW_STATE_MENU_TOP_D,
      REFLOW_STATE_STEP_RAMP,
      REFLOW_STATE_TABLE_SIZE,
      REFLOW_STATE_STEP,
      REFLOW_STATE_STEP_DWELL,
      REFLOW_STATE_COMPLETE,
      REFLOW_STATE_ERROR
    }
    reflowState_t;

    typedef enum REFLOW_STATUS:byte   //структура статуса пайки, запущен или нет
    {
      REFLOW_STATUS_OFF,
      REFLOW_STATUS_ON
    }
    reflowStatus_t;

    #define SENSOR_SAMPLING_TIME 1000 //read tc every second //время обновления температуры в милисекундах

    reflowStatus_t reflowStatus; //переменная статусов событий
    // Reflow oven controller state machine state variable
    reflowState_t reflowState;   //переменная статуса пайки

    //TC read timer variables
    //unsigned long nextCheck1; - атавизм, убрать если не надо
    unsigned long nextRead1; //переменная для времени обновления текущей температуры

    //PID stuff
    double Setpoint1, Input1, Output1;  //соответственно для ВИ: установленная температура(уставка) | текущая температура(измеренная max6675) | выход ПИД регулятора

    //Specify the links and initial tuning parameters

    //unsigned long windowStartTime;    //атавизм, убрать, если не нужно
    //PID stuff
    double Setpoint2, Input2, Output2;  //соответственно для НИ: установленная температура(уставка) | текущая температура(измеренная max6675) | выход ПИД регулятора
    //Specify the links and initial tuning parameters


    //Alarm state boolean
    boolean alarmOn = false;          //признак предупреждения

    //Update whole screen boolean
    boolean updateScreen = true;      //признак обновления экрана

    //назначаем пины уселителя термопары MAX6675 "ВЕРХНЕГО" нагревателя   clk=sck cs=cs do=so
    int thermoCLK = 14;  //=sck
    int thermoCS = 15;   //=cs
    int thermoDO = 16;   //=so
    //назначаем пины уселителя термопары MAX6675 "НИЖНЕГО" нагревателя clk=sck cs=cs do=so
    int thermoCLK2 = 14;  //=sck
    int thermoCS2 = 17;   //=cs
    int thermoDO2 = 16;   //=so

    // переменные для калмана "ВЕРХНЕГО" нагревателя
    float varTerm1 = 0.25;  // среднее отклонение (ищем в excel)
    float varProcess1 = 0.0125; // скорость реакции на изменение (подбирается вручную)
    float Pc1 = 0.0;
    float G1 = 0.0;
    float P1 = 1.0;
    float Xp1 = 0.0;
    float Zp1 = 0.0;
    float Xe1 = 0.0;

    // переменные для калмана "НИЖНЕГО" нагревателя
    float varTerm2 = 0.25;  // среднее отклонение (ищем в excel)
    float varProcess2 = 0.0125; // скорость реакции на изменение (подбирается вручную)
    float Pc2 = 0.0;
    float G2 = 0.0;
    float P2 = 1.0;
    float Xp2 = 0.0;
    float Zp2 = 0.0;
    float Xe2 = 0.0;
    // переменные для калмана
    int tc1; //переменная для хранения текущей температуры ВИ
    int tc2; //переменная для хранения текущей температуры НИ
     
    SOLOway нравится это.
  9. Dmitrysh

    Dmitrysh Гик

    Достаточно это >=. И обязательно запас по мощности минимум процентов 10, а в нашем случае чем больше тем лучше(без фанатизма конечно).
    Вот зачем нужен запас по мощности.
    Кварц излучает нужный ИК спектр, по этому и мощность можно меньше. А у меня, допустим, снизу галоген, сверху керамика. Излучают они нужного ИК не так уж и много, поэтому и мощность у них выше.
    Дак у нас, по идее, так и есть. Об этом я позже напишу.
     
  10. bamik

    bamik Нерд

    Скорость изменения температуры на излучателе не только зависит от мощности. От мощности зависит нагрев, а охлаждение зависит от теплоемкости. Керамика - совсем не для наших целей. Вот яйца в инкубаторе греть - да, сгодится. В Китае продаются различные кварцевые излучатели в типовые разъемы для галогенок. Просто покупаешь и заменяешь. А верхний нагреватель придется переделывать.
    Я планирую собрать верх из кварцевых ламп, а низ из кварцевых трубок.
     
    Dmitrysh нравится это.
  11. Dmitrysh

    Dmitrysh Гик

    Поддерживаю.
    Вот в этом и основная проблема не только у меня но и у большинства других людей. А именно отсутствие достаточного финансирования. Проект не коммерческий, требуется изыскивать средства из своего бюджета, а это не у всех получается. Да и хочется сделать устройство, которое будет работать на всём что доступно.
     
  12. Dmitrysh

    Dmitrysh Гик

    Вы как-то писали:
    Так у нас так и есть, смотрите кусок кода:
    Код (C++):
    //счётчик скорости роста температуры            
          if ((currentMillis - previousMillis) > 1000 * rampRateStep[currentStep - 1] * 0.1) //скорость роста температуры от 0.1с. до 3с.
           {
            previousMillis = currentMillis;
            counter = counter + 1;
            setpointRamp = counter + startTemp;
            myGLCD.setFont(BigFont);
            myGLCD.setColor(250, 180, 000);
            myGLCD.printNumI(setpointRamp,420, 300,3,'0');
            Setpoint1 = setpointRamp;
           }
    Setpoint1 отправляется в ПИД как уставка, в зависимости от скорости роста температуры. Т.е каждый шаг разбивается на много частей и по частям скармливается ПИДу. И чем медленнее рост температуры, тем больше частей делается. А на шаги профиль разбивается для того чтобы делать "полки", т.е промежутки времени с одинаковой температурой. Смотрите код, он по-уму написан.
     
  13. SOLOway

    SOLOway Гик

    Попробуем представить концепцию инфракрасной паяльной станции? Основные тезисы, против которых не станут возражать большинство участников?
    1.Нагреватели:
    Т.к. требуется, чтобы максимальное количество излучаемого тепла было поглощено паяемым объектом, нужно длинноволновое излучение в диапазоне, наглядно показанном на рисунке temperatura_volny_0.
    temperatura_volny_0.jpg
    Более короткие волны плохо проникают внутрь материалов, но сильнее разогревают поверхность, что вызывает "загар" и опасные деформацией и разрывом межслойных соединений дорожек механические напряжения в слоях платы.
    Также для преднагрева плат успешно используется конвекция - нагрев плат над алюминиевой плитой, применение термофена сверху.
    Размеры излучающих поверхностей выбирают исходя из следующих условий: для НИ - немного больше самой большой из плат, которые будем паять часто (деление на секции позволит удобно работать с малыми платами и экономить на электричестве), для ВИ - больше самого большого чипа.
    Желательно предусмотреть различные размеры и формы излучателей ВИ для следующих случаев: а) пайка чипа, б) пайка разъема. Для простоты замены, оба варианта излучателя должны иметь одинаковую мощность.
    Расчет мощности нагревателей.
    Применяя бесконтактный нагрев, учитываем, что воздух - плохой проводник тепла, затраты на прогрев у нас больше, чем при контактной пайке. По той же причине нужно иметь мощность нагревателей, позволяющую скомпенсировать возможные просадку напряжения в сети, снижение окружающей температуры, внезапный сквозняк. При малой мощности преднагревателя сталкиваемся с ещё одной серьезной проблемой - увеличивается время прогрева платы, длительность термопрофиля выходит за рамки, рекомендованные производителями, а также компоненты платы подвергаются длительному воздействию высоких температур, на которые не расчитаны. Также замечено, что слабый ~200 Вт нагреватель, расположенный, скажем, в ~5 см над чипом, при ~200*С у чипа, разогреется до ~600*С и выйдет в видимый спектр, а мощный ~800 Вт - при тех условиях не дойдет и до ~400*С, потребляя при этом менее 50% и оставаясь в темной зоне ИК-излучения.
    Равномерность по площади нагрева.
    Выше описаны возможные пагубные последствия неравномерного прогрева. Достаточная мощность излучателей позволит поднять плату над ними до уровня, где неравномерность излучения сведется к пренебрежимо малой величине из-за особенностей распространения излучения - наглядно на рисунке izluchenie_Rom.by.
    izluchenie_Rom.by.jpg
    Вывод - хотим снизить мощность нагревателей - применяем очень качественные термоэлементы с хорошей равномерностью отдачи тепла по всей поверхности и располагаем плату близко к ним.
    Учет перечисленного и анализ конструкций самодельных станций за период с 2009-года подтвердил обоснованность следующих вводных для расчета мощностей, позволяющих комфортно работать: Для НИ плотность 3,5-2,5 Вт/кв.см. Для ВИ 20-12 Вт/кв.см. В расчет принимается именно излучающая площадь, а не общая площадь нагревателя.
     
  14. Dmitrysh

    Dmitrysh Гик

    Полностью со всем согласен. Хотелось бы узнать, как считать расстояние от трубочных излучателей до платы, чтобы распределение энергии излучения было по-возможности равномерным.
     
  15. Vinyla

    Vinyla Нуб

    А где достать "s_button.h"?
     
  16. SOLOway

    SOLOway Гик


    Dmitrysh
    Вот то что у меня в закладках есть: №1, №2, №3, практика.
    Статью с теоретическими обоснованиями и формулами расчета никак пока не могу вспомнить, где видел, поищу ещё, но быстрее у меня получилось как в видео подобрать...
     
    Последнее редактирование: 5 июн 2019
    Иван_В. нравится это.
  17. Yurik-o

    Yurik-o Нерд

    Упс
    про него-то я забыл
    распаковать в папку со скетчем или (что лучше) в отдельную папку в Arduino/libraries
    очень корректная, быстрая и функциональная библиотека обработки кнопок
     

    Вложения:

    • s_button.zip
      Размер файла:
      2,5 КБ
      Просмотров:
      104
    Vinyla и SOLOway нравится это.
  18. bamik

    bamik Нерд

    В любом случае вливания финансов требуются. Сам по себе проект не коммерческий, но в большинстве случаев делается для коммерческих нужд. Редко кто готов потратить 5-10К рублей на хобби, на станцию, которая будет использована 2-3 раза в год. Из этого следует, что выгодней задавить жабу и купить нормальные нагреватели, чем дешевые галогенки и непонятные керамики.
    Это как раз в коммерческих проектах используют керамику чаще всего, промышленные контроллеры, которые не предназначены для этого. "Мы слепили, а вы мучайтесь. Главное, термопрофиль правильно подберите."
    А мы делаем для себя. И хотим достичь идеала. Потому многие делают и переделывают. Начинают с дешевых галогенок, результат - поджарка; решают, что лучше керамика (немного дороже, но руками меньше двигать), результат - в лучшем случае работает, но несколько чипов пузырями; и только намучившись и самые упорные добираются до кварца. Моя любимая поговорка из личного опыта работы с клиентами: "Скупой платит дважды, чаще трижды, но обычно до него доходит на четвертый раз."
     
    buivol135 нравится это.
  19. SOLOway

    SOLOway Гик

    Я! Я такой бываю! Нет бизнеса у меня ремонтного :(
     
  20. Dmitrysh

    Dmitrysh Гик

    Ну это надо постараться на галогене поджарить.
    Вот на керамике поджарить как два байта переслать, я её боюсь.
    Сам хочу, но пока не могу:(