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

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

  1. SOLOway

    SOLOway Гик

    Спасибо за видео!
    Я тут изголялся с прожектором 2*1кВт вместо НИ. Не уследил, что датчик НИ выпал в ошибку (теснота, куча проводов, невнимательность)... Плата подопытная щелкнула и все детали снизу разом отлетели и сверху центр платы вспучился :) . Я хотел её всю разобрать используя только НИ. Второй день запах "текстолитового попкорна" в комнате держится...
     
    Yojiq нравится это.
  2. Yojiq

    Yojiq Гик

    текстолитовый маньяк ))
     
    SOLOway нравится это.
  3. Yojiq

    Yojiq Гик

    Смотрю я видео с галогеном и мне все больше нравиться его работа, пид и скорость прогрева просто ошеломляют.
    KIMG0281.jpg
    на кварце со стеклокерамикой все более инертно, но работоспособно.
    Снимок.PNG
    снятие без_свинец, долго нижний нагреватель выходит на уровень ...
     
  4. tssergej

    tssergej Нерд

    а где у вас термопара низа стоит? На фото вижу только одну возле чипа
     
  5. Yojiq

    Yojiq Гик

    за головой ее не видно (на заднем краю платы)
     
  6. Watashi

    Watashi Гик

    Немного теории. Речь касается последней версии sketch_TFT-320x480_dimer_PC_revolver_Dmitrysh_v4 и моей версии пост #2560
    Целевая температура, к которой стремится ПИД, формируется так:
    Код (C++):
            if ((currentMillis - previousMillis) > 1000 / (profile.rampRateStep[currentStep - 1] * 0.1))  {  //скорость роста температуры от 0.1с. до 3с.  
              previousMillis = currentMillis;
              counter = counter + 1;
              setpointRamp = counter + startTemp;
     
    т.е. вычисляется время когда надо увеличить на 1 температуру, которую потом передаем ПИДу в качестве целевой. Это время может быть и меньше секунды и больше в зависимости от параметра "скорость роста температуры ". При этом расчет реальной температуры и ПИДа осуществляется 4 раза в секунду.
    В своей программе решил поместить расчет целевой температуры рядом с расчетом ПИДа.
    Получилось так:
    Код (C++):
          if (millis() > nextRead1)     {          // график температуры nextRead1
             nextRead1 = millis() + SENSOR_SAMPLING_TIME;
             Count1++;
             TempRead();    //  считываем температуру
             if (chast < (Температура низа)) {  // это условие работы низа
               bottomTemp =<стартовая температура> + <Скорость роста температуры>*Count1/4;
             }
               else bottomTemp = <температура низа>;
               Output2 = Pid2(Input2,bottomTemp,kp2,ki2,kd2);
     
    Простыми словами, на каждом цикле к стартовой температуре прибавляем постоянную величину скорости роста температуры, рассчитанную для времени 250 мс.
    Результат: более плавное регулирование температуры(мои лампы более плавно включались), применения программ "плавного" включения ламр просто не потребовалось. На мой взгляд, легче подобрались коэффициенты ПИДа.
     
  7. Dmitrysh

    Dmitrysh Гик

    Идея хорошая, но "палка" всегда о двух концах. Сколько это нам будет "стоять" по вычислительным затратам?
     
  8. Watashi

    Watashi Гик

    Практически один в один, в одном месте убирается, в другое переносится.
    У меня есть продолжение кода, где есть идея как сэкономить ресурсы МК:
    Код (C++):

      int chast = Count1/4;    // получаем секунды, нужно для вывода графиков
      int kluch =  Count1 % 4;  // принимает значения от 0 до 3
    // по этой переменной разделяется по времени вывод графиков раз в секунду и передача данных на комп
    // и еще 2 состояния свободны пока))
             if (kluch =1) {
               TimeLine(chast+X_graf);               // линия времени
               myGLCD.setColor(VGA_RED);      
               M_dr_point(chast-2, bottomTemp);      // рисуем ожидаемый график низа
             
               myGLCD.setColor(VGA_LIME);
               M_dr_point (chast-1, tc2);             // рисуем график низ
               myGLCD.setColor(VGA_AQUA);
               M_dr_point (chast-1, tc1);             // рисуем график верх      
               myGLCD.setFont(SevenSegNumFont);
               myGLCD.setColor(VGA_SILVER);
               myGLCD.printNumI(tc1,50, 45,3,'0');    // выводим температуру верха
               myGLCD.printNumI(tc2,350, 220,3,'0');  // выводим температуру низа
             }
      #ifdef SetConnectPC
            if (kluch =2) {
              sprintf (buf, "OK%03d%03d%03d%03d%03d\r\n", int(Output1), int(Output2), tc1, tc2,int(profileName)); // график ПК
              Serial.print(buf);
              }
      #endif
     
     
  9. alsh_0907

    alsh_0907 Нерд

    Приветствую. Немного ресурсов МК, а точнее ОЗУ, можно сэкономить, если вместо функции sprintf пользоваться sprintf_P. В вашем примере
    sprintf (buf, "OK%03d%03d%03d%03d%03d\r\n", int(Output1), int(Output2), tc1, tc2,int(profileName));
    попробуйте заменить на
    sprintf_P (buf, PSTR("OK%03d%03d%03d%03d%03d\r\n"), int(Output1), int(Output2), tc1, tc2,int(profileName));

    http://mainloop.ru/avr-atmega/avr-progmem-strings.html
     
  10. SOLOway

    SOLOway Гик

    chast
    Count1
    kluch
    О-о-о, блин 0_0
    alsh_0907 Александр! Вы всё-таки иногда с нами!
     
  11. Dmitrysh

    Dmitrysh Гик

    А смысл? Ну есть у меня мысли по этому поводу, но мне кажется здесь потянем, там развяжется.
    Чтобы это работало, надо иметь float <скорость роста> и float bottomTemp, а у нас они целые.
     
  12. tssergej

    tssergej Нерд

    Сделал чертежик для китайских резистивных кнопочек, может кому пригодится
     

    Вложения:

    • LCD & KEY.pdf
      Размер файла:
      102,4 КБ
      Просмотров:
      69
    SOLOway нравится это.
  13. SOLOway

    SOLOway Гик

    Это которые покупные, как у автора темы? Спасибо, сохранил себе. У меня брат версию Mega2560+TFT3.2" 320x480 с такой платкой использует, передам ему чертеж ваш.
    Я пока на 1602 и 2004 под mega328p и 168p тусуюсь :)
     
  14. tssergej

    tssergej Нерд

    [​IMG]
    такие как на фото
     
  15. Watashi

    Watashi Гик

    Действительно <скорость роста> у нас имеет тип byte, но этот параметр в 10 раз увеличен и мы его все равно делением преобразуем в float или double. В посте #2566 <Скорость роста температуры> это операнд написанный для наглядности, в реальной программе он вычисляется заранее и по сути является константой (кстати и деление на 4 надо отсюда убрать).
    Что касается bottomTemp, то ничего не мешает ему стать float или double, тем более что в подпрограммах дла расчета ПИДа этот параметр для верха тип byte, а для низа double.
     
  16. Watashi

    Watashi Гик

    Спасибо, возьму на заметку.
     
  17. Dmitrysh

    Dmitrysh Гик

    Это не совсем так, там для наглядности умножение на 0,1. А в реальности строчка
    Код (C++):
    if ((currentMillis - previousMillis) > 1000 /(rampRateStep[currentStep - 1] * 0.1))
    преобразуется компилятором в такую
    Код (C++):
    if ((currentMillis - previousMillis) > 10000 /(rampRateStep[currentStep - 1] ))
    Это косячок, там и верх и низ должен быть byte.
    Это очень "дорогое" удовольствие работать с четырёх байтными числами, мы от этого стараемся уйти, для этого и переписывали ПИД под (на сколько это возможно) целочисленную математику.
     
  18. Dmitrysh

    Dmitrysh Гик

    А как эта конструкция во флеш переменные загонит? И вообще от sprintf надо избавляться, очень медленная функция.
     
  19. alsh_0907

    alsh_0907 Нерд

    Во флеш она переменные не загонит, зато строчка "OK%03d%03d%03d%03d%03d\r\n" не будет висеть в оперативе. Действие макроса PSTR аналогично макросу F.
    Медленная, зато удобно пользоваться, когда например число 87 надо отобразить как 0087.
    Прародитель функции sprintf появился в конце 60-х годов, тогда компьютеры были врядли сложнее или быстрее контроллера AVR, и ничего, люди работали на таких машинах.
     
    Последнее редактирование: 19 май 2019
  20. Watashi

    Watashi Гик

    Значит быстродействие говорите ..? Провел замеры времени на выполнение разных участков программы и вот что у меня получилось:
    обработка клавиатуры 5440 мкс
    опрос энкодера 5280 мкс
    опрос тачскрина 6005 мкс
    вывод графиков (там где kluch =1) 100500 мкс
    и самое интересное - чтение температуры с максов, вычисление bottomTemp, и расчет ПИДа низа - 800 мкс.
    вывод думаю очевиден, меньше парится с расчетом ПИДа, а больше уделять внимания экрану и не выводить на него ничего лишнего.