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

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

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

    SOLOway Гуру

    Пост #4692
    Видео в посте #4359 вполне рабочий вариант.
    По версии v.1.3.4c.
    В общем, переписал я обработку включения/отключения охладителя платы кнопкой ВПРАВО. Конечно, кривовато переписал, но работает нормально.
    Также поправил порядок значений при инициализации тестового / предустановленного профиля.
    UPD: По посту #4658 .
    в посте #4677 .
    Переписал так:
    Код (C++):
    //---секция профиля---//
    struct pr                                       // основные поля профиля
    {
      byte profileSteps;                            //количество шагов профиля
      int Setpoint2;                                //установленная температура(уставка) НИ
      byte pwr_BOTTOM;                              //максимальная мощность нижнего нагревателя
      byte min_pwr_TOPStep[4];                      //минимальная мощность верхнего нагревателя
      byte max_pwr_TOPStep[4];                      //максимальная мощность верхнего нагревателя
      byte rampRateStep[4];                         //скорости роста температуры по шагам
      byte temperatureStep[4];                      //заданные температуры для шагов профиля ВИ
      byte dwellTimerStep[4];              //установленное время перехода на следующий шаг (полочка на шаге)
      byte kp1;                                     //пропорциональный коэффициент ПИД для ВИ
      byte ki1;                                      //интегральный коэффициент ПИД для ВИ
      byte kd1;                                     //дифференциальный коэффициент ПИД для ВИ
      byte kp2;                                     //пропорциональный коэффициент ПИД для НИ
      byte ki2;                                      //интегральный коэффициент ПИД для НИ
      byte kd2;                                     //дифференциальный коэффициент ПИД для НИ
    };
    //byte SizeProfile = sizeof(pr);              //длина поля данных
    int SizeProfile = sizeof(pr);                   //длина поля данных
    pr profile;
    //---доп. коэфициент для Pid2TEST2 НИ
    byte kf2 = 60;                                       //Значение множителя К для Сопротивления изменению t° (f = friction)
    byte currentProfile = 1;                        //текущий профиль
    byte editStep = 0;                                //номер шага профиля который редактируется в данный момент
    byte currentStep = 1;                           //текущий шаг профиля
    byte Setpoint1;                                     //установленная температура (уставка) ВИ
    //---секция профиля---//
    Вернул задание от 80 до 330°С для НИ:
    Код (C++):
    //устанавливаем температуру "Нижнего Нагревателя"
        case REFLOW_STATE_MENU_BOTTOM_HEAT:
          if (updateScreen)
          {
            lcd.setCursor(2, 2);
            lcd.print("Bottom  Heat:      ");
            updateScreen = false;
          }
          lcd.setCursor(15, 2);
          lcd.print(SP2);
          lcd.print(" ");

          if (upSwitchState == HIGH && ( millis() - ms_button) > 200)
          {
            ms_button =  millis();
            profile.Setpoint2 = profile.Setpoint2 + 10;
            if (profile.Setpoint2 >= 330)
            {
              profile.Setpoint2 = 330;
            }
          }
          if (downSwitchState == HIGH && ( millis() - ms_button) > 200)
          {
            ms_button =  millis();
            profile.Setpoint2 = profile.Setpoint2 - 10;
            if (profile.Setpoint2 <= 80)
            {
              profile.Setpoint2 = 80;
            }
          }
          if (okSwitchState == HIGH && !button_state && ( millis() - ms_button) > 200)
          {
            ms_button =  millis();
            button_state = true;
          }
          if (okSwitchState == LOW && button_state && ( millis() - ms_button) > 200)
          {
            ms_button =  millis();
            button_state = false;
            updateScreen = true;
            reflowState = REFLOW_STATE_MENU_BOTTOM_PWR;
            SaveProfile ();
          }
          if (cancelSwitchState == HIGH && ( millis() - ms_button) > 50)
          {
            ms_button =  millis();
            updateScreen = true;
            reflowState = REFLOW_STATE_IDLE;
          }
          break;
    в посте #4678 .
    Я "для чистоты экспериментов" сначала использую скетч, записывающий в EEPROM единицы, затем загружаю основной скетч. Сейчас работает ручной вызов инита предустановленного профиля, однако в этом профиле уставка НИ ниже t°C плавления SnPb припоев. Подскажите, пожалуйста, как будет развиваться негативный сценарий при приведенной мною реализации записи/чтения в EEPROM уставок НИ размерностью больше, чем byte?
    P.S.:

     

    Вложения:

    • 190720.zip
      Размер файла:
      13,9 КБ
      Просмотров:
      196
    • eeprom1.ino.zip
      Размер файла:
      538 байт
      Просмотров:
      196
    • 200720.zip
      Размер файла:
      13,9 КБ
      Просмотров:
      203
    Последнее редактирование: 21 июл 2020
  2. LessNICCKoff

    LessNICCKoff Гик

    Необходимо реализовать пуск ВИ скажем так на 2 градуса от установленной. Может на керамике благодаря её инерционности доходит до уставки. На лампах если и дойдёт до установленой температуры то только из-за случайности. Сейчас P=11 I=2.10 D=0.40. Чем выше я поднимаю параметры тем система более резкой становиться.
     
  3. Dmitrysh

    Dmitrysh Гуру

    Если не дотягивает до уставки увеличиваем I, все остальные параметры не трогаем
     
  4. prusony

    prusony Нерд

  5. LessNICCKoff

    LessNICCKoff Гик

    Не работает так. Только когда P больше 20 переваливает за уставку.

    Надо сказать: температуру держит с поразительной точностью, но 149 градусов при уставке в 150. При увеличении "I" более равномерней управление нагревом идёт.

    При работе на подправленном скетче глюков пока не возникало.
     
    Последнее редактирование: 18 июл 2020
  6. Dmitrysh

    Dmitrysh Гуру

    Нужно больше I, увеличьте раз в 10-15. Если начнутся колебания добавьте D.
     
  7. SOLOway

    SOLOway Гуру

     
  8. LessNICCKoff

    LessNICCKoff Гик

    Вот видеоролики:
    Настройки ПИД поднял до максимума. Вроде заработало.

    Для стабилизации на хватает пределов.

    Как вариант старт сделать на градус раньше: при уставке в 150 старт ВИ на 149. Тогда стабилизировать можно идеально.

    В 3-ем профиле шагов очень много за 50шт.
     
    Последнее редактирование: 20 июл 2020
  9. geleos27

    geleos27 Гик

    Хорошее видео для понимания принципа работы PID

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

    Dmitrysh Гуру

    А вы сколько шагов поставили? Можно попробовать переписать профиль на стандартный длительным удержанием cancel.
     
  11. Dmitrysh

    Dmitrysh Гуру

    Пределов какого параметра?
     
  12. Foxweld

    Foxweld Нерд

    Хотел спросит у Dmitrysh можно ли в вашем скетче V4_EX сделать преднагрев платы до определенной температуры как это-то реализовано в скетче от Watashi плата греется нижним нагревателем до определенной температуры график не идет потом при запуске основного профиля начинает идти график
     
    Последнее редактирование: 20 июл 2020
  13. Dmitrysh

    Dmitrysh Гуру

    Думаю можно, надо подумать.
     
    Foxweld нравится это.
  14. geleos27

    geleos27 Гик

    По идее все должно почти без проблем отработать.

    profile = {4, 160, ....

    Обновит текущие значения в структуре profile которая сейчас в оперативке.

    Если поправить текущие SaveProfile & LoadProfile
    Код (C++):
    //чтение профиля из EEPROM
    void loadProfile()
    {
      for (byte j = 0; j <= SizeProfile - 1; j++) EEPROM.get((currentProfile - 1)*SizeProfile, profile);
    }
    //сохранение текущего профиля
    void SaveProfile ()
    {
      for (byte j = 0; j <= SizeProfile - 1; j++) EEPROM.put((currentProfile - 1)*SizeProfile, profile);
    }

    на:
    Код (C++):

    //чтение профиля из EEPROM
    void loadProfile()
    {
    EEPROM.get((currentProfile - 1)*SizeProfile, profile); // читаем профиль с EEPROM в память
    return;
    }

    //сохранение текущего профиля
    void SaveProfile () {
    EEPROM.put((currentProfile - 1)*SizeProfile, profile);
    }
     

    То загрузка и сохранение будут работать без проблем

    EEPROM.get((currentProfile - 1)*SizeProfile, profile)

    EEPROM.get("адрес начала", "в какой объект записывать")

    (EEPROM.get самостоятельно вычисляет размер "в какой объект записывать", и полностью его заполняет значениями.
    Если до чтения по адресу начала уже сделана запись этого-же объекта (переменной \ структуры), то прочитается без проблем.

     
    Последнее редактирование: 21 июл 2020
  15. LessNICCKoff

    LessNICCKoff Гик

    При параметрах примерно (P= 4.00 I= 0.50 D= 0.50) система ведёт себя стабильно. Доходит до 149 градусов при уставке в 150. Лампы светят в пол накала, температура стоит как вкопанная, НО до 150 не доходит и на следующий шаг не переключается.
    P= 20 I- 2.50 D=2.55 держит 150 с колебаниями +- 2 градуса. И стабилизировать по I и D не получается 2.55 максимум
     
  16. hacjka

    hacjka Гик

    и хотел бы попросить,сделать меню настройки PID так,чтоб можно было перебирать опции не одной кнопкой только вперед,а и вернуться на предыдущую позицию.
    если конечно такое возможно!
    если нет,ну ничего,привыкнем так.
     
    LessNICCKoff нравится это.
  17. Dmitrysh

    Dmitrysh Гуру

    Такое проще реализовать, если использовать пятую кнопку резистивной клавиатуры. Для 4-х кнопочной клавиатуры сложнее, надо использовать комбинацию из 2-х клавиш или использовать энкодер.
     
    hacjka нравится это.
  18. hacjka

    hacjka Гик

    у меня как раз 5 кнопочная(как на картинке от @Watashi)
    и енкодер.
     
  19. Dmitrysh

    Dmitrysh Гуру

    Есть в процедуре Pid2 следующие строчки
    Код (C++):
      integra2 = (integra2 < i_min) ? i_min : (integra2 > i_max) ? i_max : integra2 + (kI * e2) / 1000.0; //И составляющая
      d2 = (kd/10)  * (temp - ed); //Д составляющая
    если их заменить на
    Код (C++):
      integra2 = (integra2 < i_min) ? i_min : (integra2 > i_max) ? i_max : integra2 + (kI * e2) / 100.0; //И составляющая
      d2 = (kd)  * (temp - ed); //Д составляющая
    то составляющие I и D увеличатся в 10 раз при тех же настройках.
     
    SOLOway, LessNICCKoff и hacjka нравится это.
  20. Dmitrysh

    Dmitrysh Гуру

    А вот и нет, будет совсем не так. Следующий за правленным профилем профиль сдвинется на один байт вправо, второй на 2 байта, третий на 3 и тд. Одним словом теряются все профили сразу, поэтому их надо будет перенастраивать ВСЕ.
    При старте скетча в оперативке уже лажа будет, кроме параметра profileSteps первого профиля.
     
    SOLOway и hacjka нравится это.
Статус темы:
Закрыта.