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

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

Статус темы:
Закрыта.
  1. поменяйте на это

    Код (C++):
    (float temp,uint8_t ust)
    static float i = 0;
    static float ed = 0;
    float e, p;
    float d;
     
     
  2. Dmitrysh

    Dmitrysh Гуру

    Код (C++):
    float e, p;
       float d;
    Вот эти как раз я бы оставил. UST можно и в байт уложить.
     
  3. Dmitrysh

    Dmitrysh Гуру

    Если кому интересно то ПИД по предложению Aleksander1997 можно организовать так
    Код (C++):
    byte Pid1(double temp, byte ust, double kP, double kI, double kd)
    {
            byte out = 0;
       
            static float ed = 0;
            float e, p;
            float d;
    if (millis() > nextReadPID1)
    {       nextReadPID1+=pidSampleTime;
            e = (ust - temp); //ошибка регулирования
            p =  (kP * e); //П составляющая
            integra = (integra < i_min) ? i_min : (integra > i_max) ? i_max : integra + (kI * e)/100; //И составляющая
            d = kd * (e - ed); //Д составляющая
            ed = e;
            out = (p + integra + d < out_min) ? out_min : (p + integra + d > out_max) ? out_max : p + integra + d;
        return out;}
        }

    byte Pid2(double temp, byte ust, double kP, double kI, double kd)
    {
            byte out = 0;
       
            static float ed = 0;
            float e, p;
            float d;
    if (millis() > nextReadPID2)
    {       nextReadPID2+=pidSampleTime;
            e = (ust - temp); //ошибка регулирования
            p =  (kP * e); //П составляющая
            integra2 = (integra2 < i_min) ? i_min : (integra2 > i_max) ? i_max : integra2 + (kI * e)/100; //И составляющая
            d = kd * (e - ed); //Д составляющая
            ed = e;
            out = (p + integra2 + d < out_min) ? out_min : (p + integra2 + d > out_max) ? out_max : p + integra2 + d;
        return out;}
        }
    Дополнительные определения
    Код (C++):
       float integra, integra2;
        #define i_min -100.0//минимум И составляющей
        #define i_max 100.0//максимум И составляющей

        #define out_min 0//минимальный выходной %
        #define out_max 100//максимальный выходной %
    В функцию setup добавляем
    Код (C++):
    nextReadPID1 = millis();
      nextReadPID2 = millis();
    Обнуляем интегралы integra и integra2
    Код (C++):
    //включаем пайку, кнопка сработает после отпускания "ОК"  
          if (okSwitchState == LOW && button_state && ( millis() - ms_button)>100)
          {    
            ms_button =  millis();
            button_state = false;
            tone(buzzerPin, 1045, 500);  //звуковой сигнал при старте профиля
            //update next screen

       
            integra=0;
            integra2=0;

            updateScreen = true;
            reflowStatus = REFLOW_STATUS_ON;
            reflowState = REFLOW_STATE_STEP_RAMP;
          }
          break;
    Вызываем так
    Код (C++):
         Output1=Pid1(Input1,Setpoint1,kp1,ki1,kd1);

          Output2=Pid2(Input2,Setpoint2,kp2,ki2,kd2);
     
    Последнее редактирование: 21 май 2018
    SOLOway нравится это.
  4. Dmitrysh

    Dmitrysh Гуру

    Размер кода уменьшается.
     
  5. bamik

    bamik Нерд

    Холодильник - замкнутая система. А у нас открытая. Потому колебания возможны.
     
  6. revolover

    revolover Гик

    Совсем не замкнутая... он был из ДСП + 2-4 см пенопласта, реагировал на температуру в комнате очень не слабо, мощность гуляла от 35% до 75%, но температуру держал стабильно. Ах да забыл сказать, это холодильник для брожения пивного сусла. Сам процесс брожения сопровождается большим выбросом тепла, особенно первые сутки. В это время холодильник работал до всех 100% мощности.
     
  7. revolover

    revolover Гик

    В алгоритме Станции используются фильтры показаний термопар? Когда-то давно слышал про то, что шумы сильные и применяют программные фильтры. Это я про контроль температуры паяльника читал. Если у нас нет фильтра, а есть шумы, то скачки возможны и по этой причине.
     
  8. SOLOway

    SOLOway Гуру

    revolover Да, фильтр Калмана используется в скетчах. Его на каждую max6675 vector99 еще в начале темы внедрил, а позже ссылку предоставил на видео, в котором объясняется подробно, как коэффициент вычислить для фильтра.
     
  9. tssergej

    tssergej Нерд

    Господа программисты, извените что встреваю в ваш разговор, но мне действительно непонятно.
    Для чего ограничивать себя изначально в ресурсах, строя станцию на ардуино микро/нано/уно, а затем бесконечно оптимировать код в битве за каждый байт. Ведь таже мега с связке с дисплеем 320х240 стоит ненамного больше, но имеет побольше ресурсов, да и дисплей гораздо информативнее чем тотже 20х4
     
  10. SOLOway

    SOLOway Гуру

    tssergej На данный момент активно общаются в теме именно владельцы контроллеров на базе ардуино микро/нано/уно, Те, у кого Mega2560 плюс tft480х320 - пока воздерживаются от обсуждения... Думаю, вовсе не плохо, что несколько веток развития проект получил, главное не потеряться и чтобы не забросили их.
     
  11. revolover

    revolover Гик

    Микросхеме (меге) гораздо проще производить операции с байтовыми операндами нежели с 4х-6ти байтовыми. И место в памяти никогда не бывает лишним))) Поверьте. А еще это правила хорошего тона. Код должен быть оптимизирован, чтоб не получилось как у мелкософта
     
    SOLOway нравится это.
  12. revolover

    revolover Гик

    Может стоит в интернете создать страничку(сайт), где разделить ветки, но сохранить целостность проекта. Так может и народ подтянется...
    А на форуме хранить обсуждения...
     
    SOLOway нравится это.
  13. tssergej

    tssergej Нерд

    То есть типа как в песне " я тебя слепила из того что было..."
    Никто же не говорит что это плохо. Просто мне кажется это как то нерационально, сэкономить пару баксов на железе, а затем инвестировать свое время в оптимизацию кода с целью экономии ресурсов.
     
  14. Dmitrysh

    Dmitrysh Гуру

    Дело не в железе. Нам скорость вычислений важна. Поэтому стараемся оптимизировать. А у меня, кстати, mega2560 + TFT480x320.
     
  15. Dmitrysh

    Dmitrysh Гуру

    Если кому надо избавиться от библиотеки max6675, вот код
    Код (C++):
    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;
    }
    В setup прописать
    Код (C++):
      pinMode(thermoCS, OUTPUT);
      pinMode(thermoCS2, OUTPUT);
      pinMode(thermoCLK, OUTPUT);
      pinMode(thermoDO, INPUT);
    Вызываем так
    Код (C++):
    Input1 = filter1(max6675_read_temp (thermoCLK, thermoCS, thermoDO));
    Input2 = filter2(max6675_read_temp (thermoCLK, thermoCS2, thermoDO));
    Размер кода уменьшится.
    Также можно отключить библиотеку Wire.h. Зачем нам i2c?
     
    SOLOway нравится это.
  16. Dmitrysh

    Dmitrysh Гуру

    А вы не задумывались сколько времени тратит mega на отрисовку дисплея(пусть даже не всего) 480х320? При этом UNO NANO MEGA имеют одинаковое быстродействие. Я просто приведу пример: у snmar4enko на NANO ПИД в режиме пайки позволяет опросить его в пике 73 раза в секунду, а у меня на MEGA2560 только 12. Грустно.
     
  17. bamik

    bamik Нерд

    И универсальность тоже много значит. И есть определенная красота в минимализме. А еще нет никакого смысла в лишних вычислениях. Все измерения величин мы получаем в виде целочисленных значений. Для своего удобства приводим их в удобочитаемую для нас, в первую очередь, форму. А уже потом используем. Вопрос зачем? Нам эти данные нужны раз в секунду для вывода на экран. А для принятия решений требуется только очищенные от шумов данные измерений, которые мы можем получать гораздо чаще. И на основе этих данных нам требуется принимать решение о необходимой мощности нагревателей. Но раз измерения целочисленные, то зачем применять плавающую точку в алгоритме принятия решений? Она бы нужна была, если бы нам требовалась точность в тысячные доли градуса. Но нам +-1 градус вполне достаточно.
    До Калмана еще не добрались. Там тоже плавающая точка. Можно ли его перевести в целочисленные вычисления? Может быть достаточно усредненного значения? Или применить формулу (T(n-1)-T(n))/2. Это некое приближение к реальному значению. Если датчик будет опрашиваться гораздо чаще, чем требуются данные с него, то показания будут довольно близки к реальным.
     
  18. bamik

    bamik Нерд

    Зачем нам i2c? У меня дисплей на нем висит...
     
  19. bamik

    bamik Нерд

    Dmitrysh, а зачем во всем целочисленном коде ты применил единственное действие с плавающей точкой? Может быть достаточно было разделить на 4? Или сместить на 2 разряда вправо. Получился бы целочисленный результат.
     
  20. SOLOway

    SOLOway Гуру

    а какой у вас дисплей и какая плата ардуино?
    snmar4enko свою ветку ProMini+LCD1602+2 x MAX6675 вот здесь ведёт.
     
    Последнее редактирование: 22 май 2018
Статус темы:
Закрыта.