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

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

  1. xake

    xake Нерд

    вот как выглядит участок кода с энкодером
    Код (C++):
          if (upSwitchState)
          {
            if (++currentProfile > 4) { currentProfile = 4; }
          }
          if (downSwitchState)
          {
            if (--currentProfile < 1) { currentProfile = 1; }
          }

          if (okSwitchState) { // старт профиля
              tone(buzzerPin, 1045, 500);  //звуковой сигнал при старте профиля
              updateScreen = true;
              curCount = 0;
              nextRead2 = millis();
              reflowStatus = REFLOW_STATUS_ON;
              reflowState = REFLOW_STATE_STEP_RAMP;
              Start_sec = millis()/1000;
              m_bottom = s_bottom = 0;
              TopStartTime = false;
          }
          if (longOkSwitchState) { //меню настроек
              reflowState = REFLOW_STATE_PTN_SETTING;
              updateScreen = true;
          }
          if (cancelSwitchState)
          {
    - блоки переменых и setup будут отличаться
    - все расчеты милисекунд, антидребезга в read_key()
    - read_key() возвращает значение нажатой кнопки xxxSwitchState = true;
     
    Последнее редактирование: 13 июл 2018
  2. vector99

    vector99 Гик

    Я это и имел ввиду
     
  3. revolover

    revolover Гик

    Оказалось, что алгоритм всё же не очень подходит. После создания структуры нет возможности добавить пункт... Только на 100% всё продумав - всё прописать. Блин, уж и не знаю, по какому алгоритму идти
     
  4. revolover

    revolover Гик

    Вот подхожу к пробам паялки, пока воюю с низом.
    В целом сразу: Мощность низа излишняя явно, надо было последовательно соединять по 4 лампы а не по три. А то и по 6).
    Удержание температуры 120 - 5-6% мощности уверенный рост при 20% (0,7 - 1 градус.) От этих цифр можно быстренько подобрать "И"
    на первом испытании (график ниже) довольно линейный рост, под конец - я вмешался, снизил интегральную составляющую, потом чуть добавил. При нормальных коэффициентах, думаю, что сверху будет не так линейно. Но можно к верхней точке дописать алгоритм резкого уменьшения автоматом. Как видно по графику - стекло совсем не инерционно! Только понизил мощность - снизилась температура. Отзывчивость хорошая.
    935.jpg
     
  5. revolover

    revolover Гик

    второе испытание не удалось, погасла одна цепь ламп, рост был медленный дугообразный, но пид справился вывел с перелетом 5 град.
     
  6. revolover

    revolover Гик

    Еще проэкспериментировал... Выход низа на уставку около 3х минут, график, как я и думал нелинейный. Перелет 1 градус. Я думаю, что со второго раза удачные коэффициенты в настройке ПИД - это хорошо, помогает логика и вывод составляющих на экран. Можно сделать выход еще более резким, при этом точным.
    Но чует моя чуйка, что надобно линейности добиваться. Кто скажет конкретно для низа идеальные цифры? Скорость, время. и на какую температуру выходить(самую универсальную).
    Буду мудрить версию 4-0 с контролем по скорости, авось повезет. Да, нагрев однозначно будет скачкообразный, но думаю, что скорость усреднено будет нормальной. И за несколько градусов переход на обычный ПИД для мягкого выхода и удержания.
    Тоесть что-то более похожее на график выше, но резче и точно в цель) Хотелось бы так.
     

    Вложения:

    • 986.jpg
      986.jpg
      Размер файла:
      161,5 КБ
      Просмотров:
      238
  7. SOLOway

    SOLOway Гик

    Чем чреват отказ от фильтра Калмана?
    На вычислении П.И.Д как скажется?
    У Yurik-o в скетче фильтры отключены, полагаю, для уменьшения размера скетча лишь.
    Я прошил загрузчик optiboot в Pro Mini и теперь имею ~10 % флеши свободно. В погоне за уменьшением размера скетча, хочется сохранить важные его элементы за счет отказа от стандартных библиотек.
    Прошу помочь разобраться с заменой библиотеки max6675 на это: http://forum.amperka.ru/threads/ИК-паяльная-станция-на-arduino-mega-2560-Доработка-скетча-ars_v2_lilium_jsn.10176/page-49#post-163918
    IDE (1.8.5) ругается, что я не объявил thermocouple1, thermocouple2, и еще сообщает, что-то про "("
     

    Вложения:

    Последнее редактирование: 19 авг 2018
  8. revolover

    revolover Гик

    Будут скачки мощности на нагревателе, но на процессе нагрева не скажется особо.
    Но смотреться будет не красиво, если решусь на контроль скорости роста, то там фильтрация более важна.
     
  9. revolover

    revolover Гик

    Вот еще, без перелета, точно в градус и напорядок быстрее... сейчас еще чуть ускорю процесс. контроль скорости(по верхнему пределу) в данном случае обеспечивает максимальная мощность 80%. А всё-таки нормально, что лампы по три последовательно) Выход на уставку около 100 сек.
    887.jpg
     
  10. SOLOway

    SOLOway Гик

    revolover спасибо. Я так и предполагал :( .
    С комнатной до уставки НИ (Pb- (~180*C)) примерно 1*С/сек нужно, ниже нехорошо, выше - плохо. Хотя до 100*С можно и до 3*С/сек.
     
    revolover нравится это.
  11. revolover

    revolover Гик

    Ничего не пойму, везде где ни наткнусь - до 120 преднагрев, да еще и с площадкой. дальше я так понимаю, что верх стартует.
     
  12. revolover

    revolover Гик

    Нашел вот такое:
    0f590d5da0e5.jpg
    Решил экспериментировать - максимум свинца, минимум бессвинца.
    Еще скорректировал (это всё обычный пид) настройку П
    Получилось как-то так:
    607.jpg
    Рост 1,5 - 1 град/сек.
    плавный добор до уставки.
    Попадание идеально в цель. Ни градуса перелета.
    И удержание с колебанием около 0,1 градус!!!
    Можно еще резче подъем отстроить и более резкий выход. но нужно ли?
    Уставка(150) за 90 сек где-то.
     
  13. revolover

    revolover Гик

    Ну и на этом с низом закончу. Его я оставлю без контроля скорости, ведь и так хорошо.
    Или я не прав?
    Вот последний график:
    630.jpg
    Старт около 1,5 град/сек
    Далее один градус стабильно почти.
    И сравнительно резкий выход, точно в градус и удержание без колебаний практически.
     
  14. Приведите полный лог ошибки, чтобы всем было понятно

    У меня такой скетч например компилируется без ошибок:
    Код (C++):
    double Input1 = 0;
    double Input2 = 0;

    void setup() {
      // put your setup code here, to run once:
      pinMode(5, OUTPUT);
      pinMode(6, OUTPUT);
      pinMode(4, OUTPUT);
      pinMode(7, INPUT);
    }

    void loop() {
      // put your main code here, to run repeatedly:
      Input1 = max6675_read_temp (4, 5, 7);
      Input2 = max6675_read_temp (4, 6, 7);
    }

    double max6675_read_temp (int ck, int cs, int so)          
    { char i;
        int tmp = 0;
       digitalWrite(cs, LOW);//cs = 0;                            // Stop a conversion in progress
       asm volatile
        (
         " nop"        "\n\t"
        );
       for (i=15;i>=0;i--)
        {  digitalWrite(ck, HIGH);
          asm volatile
        (
         " nop"        "\n\t"
        );
          if( digitalRead(so))
          tmp|=(1<<i);

          digitalWrite(ck, LOW);
        asm volatile
        (
         " nop"        "\n\t"
        );
        }
       digitalWrite(cs, HIGH);
       if (tmp & 0x4) {
         return NAN;
       } else
       return ((tmp>>3))*0.25;
    }
    Dmitrish вам посоветует как поступить правильно. Но я в гпостроении и логике кода ошибок не вижу. Проверьте переменные, возможно вы где то по коду не объявили thermocouple1...
     
    Последнее редактирование: 15 июл 2018
  15. А меня заинтересовала реализация алгоритма Брезенхема вот на этом сайте. Возможно ли применить для своих целей это?
    (http://trolsoft.ru/ru/articles/bresenham-algo)
    Файлы оттуда прикладываю
     

    Вложения:

    • bresenham.h
      Размер файла:
      1,2 КБ
      Просмотров:
      167
    • bres_test.c
      Размер файла:
      4,9 КБ
      Просмотров:
      161
  16. Вложения:

    • main.c
      Размер файла:
      1,8 КБ
      Просмотров:
      175
    • menu.h
      Размер файла:
      1,1 КБ
      Просмотров:
      180
  17. SOLOway попробуйте заменить
    Код (C++):
    // MAX6675
      thermocouple1(max6675_read_temp (thermoCLK, thermoCStop, thermoSO)); //термопара "ВЕРХНЕГО" нагревателя
    // MAX6675
      thermocouple2(max6675_read_temp (thermoCLK, thermoCSbott, thermoSO)); //термопара "НИЖНЕГО"  нагревателя

    ...

    if (millis() > nextRead1)
          {
            nextRead1 += SENSOR_SAMPLING_TIME;// Read thermocouples next sampling period
            Input1 = thermocouple1.readCelsius();
            Input2 = thermocouple2.readCelsius();
            tc1 = Input1;
            tc2 = Input2;
            tc1_gr = (tc1 < 299) ? tc1 : 299;
            tc2_gr = (tc2 < 299) ? tc2 : 299;

          }

     
    на

    Код (C++):

    if (millis() > nextRead1)
          {
            nextRead1 += SENSOR_SAMPLING_TIME;// Read thermocouples next sampling period
            Input1 = max6675_read_temp (thermoCLK, thermoCStop, thermoSO));
            Input2 = max6675_read_temp (thermoCLK, thermoCSbott, thermoSO));
            tc1 = Input1;
            tc2 = Input2;
            tc1_gr = (tc1 < 299) ? tc1 : 299;
            tc2_gr = (tc2 < 299) ? tc2 : 299;

          }

     
    thermocouple1() и thermocouple2() тут лишние, это функции библитеки. В новом коде они уже не нужны
     
    SOLOway нравится это.
  18. По поводу фильтра
    Есть простой код с сайта http://we.easyelectronics.ru/Theory/chestno-prostoy-cifrovoy-filtr.html
    Код (C++):
    uint filter(ucha x, ucha Nb, ucha k){
      static ucha y = 0;
      static uint z = 0;
      z += (x — y);
      return y = (Nb * z) >> k;
    };
    Также обсуждалось тут http://kazus.ru/forums/showthread.php?t=36553
     
  19. xake

    xake Нерд

    revolover,
    Ваш код с вынесенным энкодеом, сравните, может понравится :)
    Думаю так же можно вынести любые кнопки.
     

    Вложения:

    revolover нравится это.
  20. SOLOway

    SOLOway Гик

    Вот полный лог ошибок (это после замены thermocouple1() и thermocouple2()). А на что этот кусок заменить?:
    Код (C++):
    Input2 = thermocouple2.readCelsius();
    лог:
    Код (C++):
    C:\Users\DELL\Desktop\my_ARSUNO_v1m5\my_ARSUNO_v1m5.ino: In function 'void loop()':

    my_ARSUNO_v1m5:361: error: expected ';' before ')' token

             Input1 = max6675_read_temp (thermoCLK, thermoCStop, thermoSO));

                                                                          ^

    my_ARSUNO_v1m5:362: error: expected ';' before ')' token

             Input2 = max6675_read_temp (thermoCLK, thermoCSbott, thermoSO));

                                                                           ^

    my_ARSUNO_v1m5:1473: error: 'thermocouple1' was not declared in this scope

           Input1 = thermocouple1.readCelsius();

                    ^

    my_ARSUNO_v1m5:1474: error: 'thermocouple2' was not declared in this scope

           Input2 = thermocouple2.readCelsius();

                    ^

    exit status 1
    expected ';' before ')' token
     
     

    Вложения: