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

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

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

    LessNICCKoff Гик

    Независимо от настроек ПИД примерно через 156-170 секунд врубает НИ на 100%
    Выглядит примерно так: НИ подогревает разбегом в 2-3 градуса и в момент очередной волны когда лампы тухнут вдруг резко включается 100%
     
    Последнее редактирование: 17 июл 2020
  2. geleos27

    geleos27 Гик

    полные настройки вашего профиля в студию.

    температура на термопарах ВИ, НИ при этом какая?

    Я знаю только 1 способ отлова глюков - вывести значения переменных в Ком порт, и смотреть что изменилось в момент когда начинает жарить на 100%.

    Собственно из скетча нас интересуют:

    Output2 - результат вычисления ПИД низа, ~ мощность на текущий момент.
    Input2 - какая температура на термопаре низа

    Но они вроде и так у вас выводятся в программу.

    можно вывести еще
    p2, integra2, d2 чтобы понять какая из компонент является причиной 100 мощности.

    1437 строку заменить на
    sprintf (buf, "OK%03d%03d%03d%03d%03d03d%03d%03d\r\n", int(Output1), int(Output2), tc1, tc2, currentProfile, (int)p2, (int)integra2, (int)d2); // вывод на комп через UART
     
    Последнее редактирование: 17 июл 2020
  3. LessNICCKoff

    LessNICCKoff Гик

    Сейчас в данный момент: P=5 I=1 D=0.01
    Интегральная составляющая влияет конечно :)
    пид.jpg


    Когда происходит сбой данные мощности НИ в программу не передаются!!! Иногда сразу при включении греет на все 100% так же в программу данные не отсылает.
     
    Последнее редактирование: 17 июл 2020
  4. Dmitrysh

    Dmitrysh Гуру

    а что нибудь вообще передаётся при сбое?
     
  5. LessNICCKoff

    LessNICCKoff Гик

    Передаётся температура и мощность ВИ.
     
  6. geleos27

    geleos27 Гик

    Так вроде низя) Целое число должно быть. Или у вас в интерфейсе 1 забита?

    Т.е. ардуина либо виснет, либо впадает в цикл. Полные настройки можно увидеть?э


    Собственно - попробуйте залить любой другой скетч, вбить туда параметры пид и прогнать его. Если зависнет - смотрите что у вас с питаниями ардуины.

    Нашел странную строку.

    //счётчик скорости роста температуры
    1269 -
    if (Setpoint22 >= setpointRamp) profile.Setpoint2 = setpointRamp;
     
    Последнее редактирование: 17 июл 2020
  7. Dmitrysh

    Dmitrysh Гуру

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

    Dmitrysh Гуру

    Программа пишет log файл, можно на него глянуть?
     
  9. SOLOway

    SOLOway Гуру

    ;););)
    //Коэффициенты PID выводятся на дисплей так: Kp деленный на 10, Ki, Kd деленные на 100.
    Код (C++):
    //настройка "ПИД" верхнего нагревателя
        case REFLOW_STATE_MENU_TOP_P:
          if (updateScreen) {
            lcd.setCursor(0, 1);
            lcd.print("T.Heat: ");
            lcd.setCursor(8, 1);
            lcd.print("P=");
            out_float = profile.kp1 / 10.0;
            lcd.print(out_float);
            lcd.print("    ");
            updateScreen = false;
          }
          lcd.setCursor(10, 1);
          out_float = profile.kp1 / 10.0;
          lcd.print(out_float);
          lcd.print("    ");
    Теперь о своих болячках ...
    Пост #4537 - я забыл прикрепить код тестируемого скетча, а там есть подвох - в IDLE короткое нажатие CANCEL выключает охладитель платы, включаемый коротким нажатием RIGHT.
    Код (C++):
    if (cancelSwitchState == HIGH && ( millis() - ms_button) > 50)
          {
            ms_button =  millis();
            digitalWrite(Ext_Fan, LOW); //выключить охладитель платы
          }
          if (rightSwitchState == HIGH && ( millis() - ms_button) > 50)
          {
            ms_button =  millis();
            digitalWrite(Ext_Fan, HIGH); //включить охладитель платы
          }
    Я закомментировал этот код, и инит предустановленного профиля по longpress CANCEL в режиме IDLE стал работать корректно. Сначала не поверил, поменял платку ProMINI и убедился, то это так. Теперь надо будет решить, как вернуть ручное управление охладителем платы. Остальное расписал в теле скетча.
     

    Вложения:

    • 160720.zip
      Размер файла:
      14 КБ
      Просмотров:
      255
    Последнее редактирование: 18 июл 2020
    Sema нравится это.
  10. Dmitrysh

    Dmitrysh Гуру

    Передаются, просто мы их не видим, точнее контроллер не видит.
     
  11. Dmitrysh

    Dmitrysh Гуру

    попробуйте этот вариант
     

    Вложения:

  12. geleos27

    geleos27 Гик

    Про виснет - я затупил. Про цикл для низа - может и попадает.
     
  13. Dmitrysh

    Dmitrysh Гуру

    Нет, не цикл это. Там логическая ловушка. Подождём результатов последней редакции.
     
  14. geleos27

    geleos27 Гик

    Код (C++):

    struct pr {
     int temperature_step_bottom[10];
     byte kp1; //пропорциональный коэффициент ВИ
     byte ki1; //интегральный коэффициент ВИ
     byte kd1; //дифференциальный коэффициент ВИ
    структура профиля
    };
    int SizeProfile = sizeof(pr); // длинна поля данных
    pr profile; //структура для параметров


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

    void loadProfile()//this function loads whichever profile currentProfile variable is set to
    {
    EEPROM.get((currentProfile - 1)*SizeProfile, profile); // читаем профиль с EEPROM в память
    return;
    }
     
    Подсмотрел в чьем-то скетче. Пишет и читает структуру целиком меняйте как хотите. put пишет только изменения.
    После чтения используем так
    Код (C++):

    profile.temperature_step_bottom[3];
    profile.kp1;
     
     
    Последнее редактирование: 17 июл 2020
  15. Dmitrysh

    Dmitrysh Гуру

    Не совсем так, если меняете в структуре тип данных на больший по размеру, то портите уже сохранённые в EEPROM профили.
     
  16. geleos27

    geleos27 Гик

    Все верно. Но это только на этапе настройки \ экспериментов критично же. Зато не надо возиться при изменениях с функциями чтения \ записи.

    А при отправке профиля с компа, не критично совсем)
     
  17. LessNICCKoff

    LessNICCKoff Гик

    Вот лог. С цифрой 1 с самого начал отвалились показания.
    Правленный скетч ещё не пробовал.
     

    Вложения:

    • conection.zip
      Размер файла:
      907 байт
      Просмотров:
      230
    • conection1.zip
      Размер файла:
      629 байт
      Просмотров:
      233
  18. Beto

    Beto Нерд

    Не надо ничего добавлять. Просто дай возможность сетке при нагреве расширяться - не крепи её сильно жёстко, ослабь чутка винты.
    Это как с ламинатом на полу припуск по перриметру в сантиметр делают на расширение.
     
    hacjka нравится это.
  19. tssergej

    tssergej Нерд

    Я пробовал сетку для теста, просто сверху нагревателей ложить, просто лежала сверху без какого либо крепежа - вспучило почти на сантиметр по центру. Может от размера и формы ячейки зависит.
     
  20. 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 КБ
      Просмотров:
      256
    • eeprom1.ino.zip
      Размер файла:
      538 байт
      Просмотров:
      245
    • 200720.zip
      Размер файла:
      13,9 КБ
      Просмотров:
      248
    Последнее редактирование: 21 июл 2020
Статус темы:
Закрыта.