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

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

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

    bamik Нерд

    Дык потому и делят самодельщики и не только прогрев платы на 2 фазы. Сначала выход на нужный нагрев НИ, затем ВИ. Термопрошники НИ требуют разогревать предварительно. Их станции сколько стоят? 2К зеленых рублей, не меньше. Такая станция должна работать без перерыва на обед. И такую мелочь, как сон. Потому НИ пусть будет уже готов. А пока плату установят, ВИ направят и включат, то плата прогреется и термоудара не будет. Нам такая технология не подходит. Нам подходит предварительный разогрев низа до требуемой температуры. А потом включение верха. Никаких проблем нет с ограничением выделяемого тепла низом. Подсоедини последовательно больше ламп, максимальная температура упадет. Но увеличится время прогрева. Причем в основном за счет прогрева самих ламп. Стекло тоже плохой проводник тепла. Где-то читал, что кто-то выполнил НИ из открытых спиралей. Результат очень положительный с точки зрения температурно-временных характеристик. Но абсолютное отсутствие безопасности какой-либо.
     
  2. SOLOway

    SOLOway Гуру

    Ну, так у их столов в характеристиках значатся те же длины волн, что мы культивируем в кварце/керамике:
    ScreenShot 49.jpg
     

    Вложения:

  3. SOLOway

    SOLOway Гуру

    : кварцевое стекло
     
  4. vector99

    vector99 Гик

  5. SOLOway

    SOLOway Гуру

    IMHO придется менять на stm cortex***
    Я пытался намекнуть, что станция РФ за 170тыров принцип пользует (возможно, это мне привиделось...), что и апчхи-шные, только точность и частота замеров температуры крутее (типа RTD PT-1000 платина, 24bit ADC, 50 раз/сек). Апчхишные рулят низом, как электроплиткой, лишь с более "умным" термостатом с ПИД-алгоритмом (RKC REX-C100). Профиль выполняет только верх. На Паяльнике 4uvak предложил вариант тот же...
    Я могу ошибаться и не хочу холивара в теме.
     
    Последнее редактирование: 22 ноя 2019
  6. bamik

    bamik Нерд

    Эммм... ПИД не совсем поняли, а как с этим жить. И можно понятно в 2х словах это объяснить?
     
  7. SOLOway

    SOLOway Гуру

    bamik Я почитал ... и не понял...:вот тут
    Т.е. познавательно, но как это осуществлять...
     
  8. Yurik-o

    Yurik-o Нерд

    да уж...
    как говорится без бутылки не разобраться
     
  9. Yurik-o

    Yurik-o Нерд

    впрочем, сейчас я тоже разобраться с наскоку не смог
    (праздник, немного с бутылкой)
    Кстати,
    всех с Днем Победы, с праздником!
     
  10. SOLOway

    SOLOway Гуру

    Парни, snmar4enko проявляет чудеса трудоспособности! Кому интересно, посмотрите, зацените, пожалуйста его новую версию управления контроллером. Напомню, он принципиально использует LCD1602 и платы с Mega328 и старается отработать сразу несколько веток развития управления, ему очень нужны тестеровщики.
     
  11. bamik

    bamik Нерд

    Намекни ему, что целочисленный ПИД будет за меньшее время вычисляться.
     
  12. SOLOway

    SOLOway Гуру

    У них там с mon активное общение происходит, иногда с mvm_ksaa. Я там просто читатель :)
     
  13. Dmitrysh

    Dmitrysh Гуру

    Я глянул слегка его скетч и должен сказать что он ошибается. Он пишет:
    Не было у нас 1 сек никогда. 0,1сек да было и есть.
    Нет не уменьшил. Обращение к ПИДу да, сделал по 50(там даже чуть быстрее) МИЛИсекунд не микросекунд. Объясню в чем дело. Он ввел дополнительную переменную nextRead3 = PID_SAMPLING_TIME = 50. По этому времени идет обращение к функции myPID1.Compute.
    Код (C++):
     if (millis() > nextRead3)
        {
          nextRead3 += PID_SAMPLING_TIME;

        if (!TopStart) DimmerUP=220;
        else {
          myPID1.Compute();
          DimmerUP=map(Output1,0,200,200,16);
          }
       
        if (!flag) DimmerDOWN=220;
        else {
          myPID2.Compute();
          DimmerDOWN=map(Output2,0,200,200,16);
        }
        }
    Вроди бы как все и правильно, НО. У нашего ПИДа есть своя переменная SampleTime = 100; Она стоит по умолчанию. Чтобы её поменять необходимо использовать конструкцию SetSampleTime(int NewSampleTime) :
    Код (C++):
    void PID::SetSampleTime(int NewSampleTime)
    {
       if (NewSampleTime > 0)
       {
          double ratio  = (double)NewSampleTime
                          / (double)SampleTime;
          ki *= ratio;
          kd /= ratio;
          SampleTime = (unsigned long)NewSampleTime;
       }
    }
    Вот только тогда мы поменяем время пересчёта ПИД. А так у него как было 100милисекунд так и осталось.
     
    Последнее редактирование: 10 май 2018
  14. Dmitrysh

    Dmitrysh Гуру

    В подтверждение моих слов смотрите на результат симуляции. В окне виртуального терминала число, которое соответствует количеству раз пересчета ПИД за 1 секунду. Там число 8 или 9(теоретически это 10, просто где-то полпериода на "синхронизацию" теряется).
     

    Вложения:

    • snmar4enko.jpg
      snmar4enko.jpg
      Размер файла:
      436,6 КБ
      Просмотров:
      696
  15. Dmitrysh

    Dmitrysh Гуру

    Ну а вообще snmar4enko молодец. Живенький такой, культурный, и теорию посматривает, скетч "выглаживает". Прицепил быстренькую библиотеку CyberLib. Для 328 контроллера самое то, да и нам можно прикрутить. С инициализацией EEPROM мне не очень нравиться, я с компьютера правлю, так быстрее.
     
    SOLOway нравится это.
  16. Dmitrysh

    Dmitrysh Гуру

    А готовый код есть на посмотреть, оценить?
     
  17. SNMar4enko

    SNMar4enko Нерд

    - да это время опроса(Интегрирования и Диффиринцирования ПИД) по у молчанию. Менять ее нужно если наше время опроса будет сильно отличаться от требуемого нам. Как вы же пишите
    Меняет коэффициенты ki и kd в разы разности времени опроса и SampleTime
     
  18. bamik

    bamik Нерд

    Выкладывал же. Смотри на предыдущих страницах.
    Но не забываем еще о Калмане... Этот алгоритм тоже надо перелопачивать на целые числа.
     
  19. Dmitrysh

    Dmitrysh Гуру

    Не совсем так. Это время пересчета самого пида. Смотрите часть библиотеки:
    Код (C++):
    bool PID::Compute()
    {
     
       unsigned long now = millis();
       unsigned long timeChange = (now - lastTime);
       if(timeChange>=SampleTime)     //здесь проверяем наше время, а оно у нас 0.1сек
       {
          /*Compute all the working error variables*/
         
       }
       else return false; // здесь нас выбрасывает без расчёта если время не 0.1сек
    Таким образом даже если вызывать эту функцию 1000 раз в секунду, расчет все равно будет делаться 10 раз в сек. Так что меняйте SempleTime для ускорения расчётов. Но скажу вам сразу - это бесполезно. Ваш скетч может не более 11-12 раз в секунду. Можете сами убедится - включите ком порт и посмотрите.
    Так должно быть, потому как эти коэффициенты зависят от времени пересчета ПИД. Там интеграл и производная по ВРЕМЕНИ.
     
  20. SNMar4enko

    SNMar4enko Нерд

    - не все умеют править EEPROM с компьютера - поделитесь как делаете

    И по поводу ПИД:
    если пользовать от ATMELa - то для двух регуляторов нужно будет два таймера, или дорабатывать скетч - что чревато не работотособностью даже во время работы какой нибуть задержки или даже Пищалки.
    Если избавляться от библиотеки PID_v1 или PID_v2 и писать код в самом скетче - неплохая идея для уменшения размера и повышения быстроты.

    На логике .... до конца не вник - ну по ходу все приведется к регулятору по типу меньше температура от заданной включить нагрев - больше измеренная температура от заданной - выключить .... если быстродействие сделать на уровне одного полупериода сети - то есть 100гц то вполне рабочая версия может получится.

    По поводу:
    для эффективного регулирования ПИД необходимо выбрать время за которое ПИД регулирует - к примеру нам необходимо чтобы шаг роста на 1 градус отрабатывал за 0.5 секунды. ПИД для установки стабильного значения мощности на выходе требует такое количество периодов, сколько значений мощности выдает ПИД. Здесь оно ограничено 20. Поясню откуда это.Период ШИМ 200 милисекнд, то есть 5 Гц а нагрузка включается на один полупериод сети 10 милисекунд то есть 100 гц, а отношение их: 200 микросекунд на 10 = 20. То есть время опроса ПИД (время интегрирования и время диффиринцирования) 25 милисекунд. (40Гц). Как писал на другом форуме Период ШИМ должен быть таким или меньшим чем это время .
    А он здесь 5 гц (200 микросекунд) что приводит к збоям когда ПИД сильно регулирует. Далее ПИД фактически выдается значения мощности от 0 до 100. Tо есть период опроса ПИД и максимальный период ШИМ должен быть 5 милисекунд (200 Гц) . А это еще ухудшает качество регулирования на 200 милисекундном ШИМ. Вывод - привести шкалу выхода ПИД к 20 и уменьшить ПИД коэффициенты в 5 раз. Понижать частоту ШИМ (твердотельное реле) приведет к ухудшению регуляторных возможностей - так что не нужно.

    - что здесь не правильно с учетом того что внутренней переменной ПИД меняются только
    ki *= ratio;
    kd /= ratio;
     
Статус темы:
Закрыта.