Собираем станцию : учимся определять и удерживать температуру

Тема в разделе "off.Топик", создана пользователем Surge, 13.11.2016.

  1. Surge

    Surge Пользователь

    Регистрация:
    25.01.2016
    Сообщения:
    1.177
    Симпатии:
    440
    Чтож. Перейдем ко второй стадии.
    Разберемся с самыми простейшими в реализации вариантами получения температуры, разберемся как ее удерживать.

    1 - Термодатчик а-ля DS18B20 : отметается сразу. Не замеряет выше 120

    2 - Платиновый терморезистор. Хорошая точность, простая реализация в коде всего одним аналоговым чтением. Собираем мостовую схему или простой резистивный делитель напряжения потипу
    [​IMG]
    Замеряя выходное напряжение и зная точное сопротивление R1 , можно по формуле Uвых = Uвх*(R2 / R1 + R2) высчитать значение R2 (терморезистор меняет свое сопротивление в зависимости от температуры , что очевидно). Для терморезисторов производители дают таблицы из пар сопротивление-температура, соотносим одно с другим и получаем желаемый ответ.
    По такому же принципу (резистивные делители и мостовые схемы) построены многочисленные тестеры полупроводниковых компонентов. Я возможно остановился бы на терморезисторах, если нашел в местной продаже за адекватную сумму

    3 - Термопара. Принцип работы у нее довольно прост : специально подобранные сплавы в составе проводов. При нагреве возникает эффект Зеебека - термопара становится очень дохлой батарейкой, выдающей несколько микровольт на каждый градус температуры. Наше дело уловить это напряжение и усилить в более понимаемые микроконтроллером (0-5в) и определить температуру по напряжению.
    И тут опять таки есть несколько путей : усилитель на операционнике (напр LM358-) либо специализированные микросхемы (MAX6675,MAX31855).

    Операционный усилитель : нужда в правильной настройке, общая низкая точность, необходимость в кучке резисторов и кондеров. Зато подключается всего к одному аналоговому выходу и может работать с любым типом термопар, если изменить коэф. усиления.
    Первая подопытная плата пошла у меня пузырями и чипы на бессвинце слезли без верха, хотя по показаниям на плате было всего порядка 160. После таких дел я операционники забросил подальше.
    Операционник с обвязкой обойдется рублей в 30 максимум + термопару можно отодрать от тестера.
    Вполне рабочая схема

    [​IMG]

    Спец. микросхема : компенсация нагрева самой термопары, точность 0.25 градуса, готовность к работе "из коробки" - никаких настроек, минимум обвязки. Однако и занимают уже 3 ноги ибо работает по серийному протоколу, да и библиотечка под это дело нужна. Продаются в районе 350р за плату с проводом термопары. Вполне вменяемо.
    [​IMG]
    Что использовать - дело за вами. Я сам никуда с 6675 не слезу
     
    Последнее редактирование: 13.11.2016
    Armorant нравится это.
  2. Surge

    Surge Пользователь

    Регистрация:
    25.01.2016
    Сообщения:
    1.177
    Симпатии:
    440
    Теперь про удержание. Ходить вокруг да около - не вижу смысла, поковыряем ПИД алгоритм. И нет, это не первые три буквы обзывательства.
    Почему именно он :
    - Позволяет точно подстроиться под тип нагревателей, можно учесть инерционность.
    - Как бы ни казалось относительно прост в реализации.
    - Хорошо подходит для цикличных регулировок. В моем случае я пересчитываю все 2 раза в секунду. Овер-точность нам не нужна и многократный запуск массового умножения сильно жрет процессорное время.

    Алгоритм позволяет учесть 3 вида составляющих :
    - Мгновенная ошибка регулирования : Пропорциональная составляющая (Tжелаемая-Тсейчас)
    - Накопленная ошибка регулирования : Интегральная составляющая (Площадь графика ошибки)
    - Будущая ошибка регулирования : Дифференциальная составляющая (2 последние точки показывают тенденцию роста функции)
    Зачем так много, когда можно просто ориентироваться на текущее отклонение и включать - выключать нагрев?
    Ответ : неустойчивость, перерегулирование. Правильно настроенный ПИД регулятор практически не осциллирует вокруг желаемой температуры и достигает ее гораздо быстрее.
    Эту штуку придумали умные дяди, я думаю нет смысла сомневаться в ее эффективности ;)

    Приступим к реализации. Тут нам понадобится немножко вычислительной математики, а точнее всего 2 метода. Один для численного интегрирования, один для численного дифференциирования. И того, для алгоритма нам нужно :
    - Определенный постоянный промежуток между подсчетами нового результата. У меня это 0.5с.
    - Ошибка в температурах в данный момент времент. Это просто как A-B.
    - Интеграл всех ошибок, возникших с момента старта. Что вообще есть интеграл? На самом деле в геометрическом смысле он трактуется как площадь графика. Не сложно ведь найти площать прямоугольника, зная его стороны? И метод уже такой есть - https://ru.wikipedia.org/wiki/Метод_прямоугольников.
    Безымянный.png
    Площать каждого такого кусочка получается 0.5*ошибка. Не слишком точно, но нам и не в космос лететь :)
    Находим площадь, суммируем. Вот и все интегрирование.
    - Дифференциал по последним двум точкам. Тут нужно взять численную производную, что еще проще интеграла. А что есть производная?
    А это мера определения силы увеличения наклона графика. Всего то что сделать нужно - из последней ошибки вычесть предпоследнюю и поделить на время шага. Изи.

    Таким образом у нас есть все необходимые слагаемые для определения результирующего воздействия. Каждому мы присвоим вес - заданный множитель и сольем воедино.
    Мощность ламп = Kp*[Мгновенная ошибка]+Ki*[Площадь графика ошибки]+Kd*[Численная производная];
     
    Последнее редактирование: 13.11.2016
    Armorant нравится это.
  3. Surge

    Surge Пользователь

    Регистрация:
    25.01.2016
    Сообщения:
    1.177
    Симпатии:
    440
    Теория разжевана, напишем бич-реализацию в 3 строчки. Библиотеки для слабаков.
    Нам понадобится :
    - Статическая переменная, чтобы хранить площадь графика ошибки. Назовем ее S.
    - Статическая переменная, чтобы хранить предыдущую ошибку. Назовем ее Ep.
    - Набор из 3х констант для задания весов слагаемых
    Все остальное считается на-лету в локальных переменных (обнуляются каждый вызов функции).
    Каждые 500мсек будем вызывать функцию.

    Код:
    int computePID(int err)
    {
      S+=err*0.5;
      double out=(Kp*err)+(Ki*S)+Kd*((err-Ep)*2);
      Ep=err;
      if(out>maxpower) out=maxpower;
      if(out<0) out=0;
      return (int)out;
    }
    1 шаг - добавляем кусок к сумме площади
    2 шаг - определяем воздействие в соответствии с весами, деление разности последних двух точек на 0.5 заменяем на умножение на 2. Суть операции та же, а умножение выполняется быстрее. Мало ли компилятор забудет оптимизировать.
    3 шаг - запоминаем ошибку для будущих расчетов
    4,5 шаг - обрезаем воздействие в соответствие с рамками мощности
    6 шаг - обрезаем до целого числа и возврашаем управление

    Ну и целиковая программка, настроенная под мой нижник. Будет бегать вокруг точки 120 градусов с вылетом примерно на 1-2 в обе стороны. В данном случае, интегральная составляющая отрицательная - лайфхак для гашения инерции нагревателей. По мере приближения к отсечке, накопленная ошибка увеличивается и тянет вниз всю сумму.

    Код:
    #include "max6675.h"
    // PID
    volatile unsigned int temp=0;
    int setpoint=120;
    double S=0,Ep=0;
    double Kp=5.0,Ki=-0.005,Kd=4.0;
    // Ints
    volatile int tick=0;
    volatile int power=10,maxpower=50;
    volatile int error=50;
    
    int vccPin = 5;
    int gndPin = 4;
    MAX6675 thermocouple(6,7,8);
    
    int computePID(int err)
    {
      S+=err*0.5;
      double out=(Kp*err)+(Ki*S)+Kd*((err-Ep)*2);
      Ep=err;
      if(out>maxpower) out=maxpower;
      if(out<0) out=0;
      return (int)out;
    }
    
    void setup()
    {
      // Pins
      pinMode(2,INPUT_PULLUP);
      pinMode(3,OUTPUT);
      pinMode(vccPin, OUTPUT); digitalWrite(vccPin, HIGH);
      pinMode(gndPin, OUTPUT); digitalWrite(gndPin, LOW);
      // Every zero-cross
      attachInterrupt(0,cross,RISING);
    }
    
    void cross()
    {
      if(power>0)
      {
        error=error-power;
        if(error<0)
        {
          error+=99;
          bottom_on();
        }
      }
    }
    
    void bottom_on()
    {
      // Turn on triac and wait 20us to stabilize
      PORTD |=B00001000;
      delayMicroseconds(200);
      PORTD &= B11110111;
    }
    
    void loop()
    {
      if(millis()%500==0)
      {
        temp=thermocouple.readCelsius();
        power=computePID(setpoint-temp);
      }
    }
    Следующее псто - отдам размеры железок и посчитаю стоимость.
    [​IMG]
     
    Последнее редактирование: 13.11.2016
    Armorant и PlintuZz нравится это.
  4. buivol135

    buivol135 Пользователь

    Регистрация:
    22.02.2015
    Сообщения:
    409
    Симпатии:
    47
    А блюпуп туды при делать моно!!!
    Балдею конечно!
    А так может просто REX-C100 как самый простой вариант
     
  5. buivol135

    buivol135 Пользователь

    Регистрация:
    22.02.2015
    Сообщения:
    409
    Симпатии:
    47
  6. buivol135

    buivol135 Пользователь

    Регистрация:
    22.02.2015
    Сообщения:
    409
    Симпатии:
    47
    mc59-3.png Велосипед!!!
     
  7. Surge

    Surge Пользователь

    Регистрация:
    25.01.2016
    Сообщения:
    1.177
    Симпатии:
    440
  8. Russel

    Russel Пользователь

    Регистрация:
    03.12.2011
    Сообщения:
    478
    Симпатии:
    6
  9. aleksandrych

    aleksandrych Пользователь

    Регистрация:
    04.12.2016
    Сообщения:
    142
    Симпатии:
    10
    @Russel, Можно, если купить еще блок питания на 24 В или доработать тот, что в feita 936 стоит.
    В общем дорогой корпус получается.
     
  10. Surge

    Surge Пользователь

    Регистрация:
    25.01.2016
    Сообщения:
    1.177
    Симпатии:
    440
    Да и зачем?
    Проще сразу готовое взять
     
  11. Russel

    Russel Пользователь

    Регистрация:
    03.12.2011
    Сообщения:
    478
    Симпатии:
    6
    ну если у меня моя станция есть уже к ней хотел воткнуть чтоб в цыфрах показывало температуру
     
  12. aleksandrych

    aleksandrych Пользователь

    Регистрация:
    04.12.2016
    Сообщения:
    142
    Симпатии:
    10
    @Russel, Поставишь диодный мост с конденсатором и можно втыкать.
     
  13. Russel

    Russel Пользователь

    Регистрация:
    03.12.2011
    Сообщения:
    478
    Симпатии:
    6
    в ней итак 24 вольта идет
     
  14. aleksandrych

    aleksandrych Пользователь

    Регистрация:
    04.12.2016
    Сообщения:
    142
    Симпатии:
    10
    В твоей станции стоит трансформатор. С этого трансформатора (если после него нет выпрямителя) выходит 24 Вольта переменки. Для этой платы, которую ты хочешь поставить нужны 24 Вольта постоянки, для этого ставится диодный мост (выпрямитель) и конденсатор в качестве фильтра.
     
  15. Russel

    Russel Пользователь

    Регистрация:
    03.12.2011
    Сообщения:
    478
    Симпатии:
    6
    ааа все ясно)
     
  16. Russel

    Russel Пользователь

    Регистрация:
    03.12.2011
    Сообщения:
    478
    Симпатии:
    6
    станция на 24 вольта переменки если заменить блок на постоянку 24 вольта что измениться??
     

Поделиться этой страницей