Четверг, 05.12.2024, 15:26
Радиосервис - ИЗМАИЛ

Меню сайта

Статистика
Форма входа
Друзья сайта

Форум поддержки программ "Tiny Tools" (CPLD/USB-S/USB-F/USB-SPI EJTAG Tiny Tools)

Электроника на KitPost
Поиск
Наш опрос
Оцените мой сайт
1. Отлично
2. Хорошо
3. Неплохо
4. Ужасно
5. Плохо
Всего ответов: 86
Ссылки по uCoz
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • [ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
    Модератор форума: Alexandr_  
    Инфракрасная паяльная станция своими руками на ARDUINO
    Alexandr_
    Дата: Среда, 08.02.2017, 19:55 | Сообщение # 1        
    Генералиссимус
    Группа: Администраторы
    Сообщений: 814
    Статус: Offline

    Форумчане, куплю-продажу и личные сделки выяснять в личке, либо в новом форуме, этот форум для вопросов по электронной части станции.

    Архив по станции от hominidae с проектом efimsu ->здесь
    Проект Леонида, Leonid0071 "UNO-MAX6675-PC" и его доработки на форуме Амперки -> скачать

    Люби грешников, ненавидь сам грех!
     

    dscOlga
    Дата: Четверг, 30.05.2019, 22:29 | Сообщение # 571        
    Майор
    Группа: Пользователи
    Сообщений: 83
    Статус: Offline

    Доработал немного скетч 2.1.0. Присвоил номер 2.1.1. Вот изменения
    //возможность работы с резистивной клавиатурой
    //параметры хранятся в виде структуры
    //теперь используется CyberLib не патченная, можно и патченную разницы нет
    //пины max6675 используют CyberLib, что повышает быстродействие, но не позволяет быстро их переназначить
    //PID_SAMPLING_TIME увеличено до 250мс, что согласовывает это время со временем замера температуры
    //избавились от фильтра Калмана
    //исправлено много мелких недоработок
    //введена своеобразная защита от отвала термопары 
    По поводу защиты. Теперь при отвале термопары процедура чтения выдаёт вместо nan 255 градусов. Это вызывает 2 момента:
    1. При температуре 255 ПИД видит перегрев и выдаёт на нагреватели 0% мощности, по сути отключает.
    2. При восстановлении работы термопары мах6675 не надо перезапускать или передёргивать питание, работа восстанавливается автоматически.
    Прикрепления: Rework_v2.1.1.ino (55.3 Kb)
     

    Cinema
    Дата: Пятница, 19.07.2019, 14:50 | Сообщение # 572        
    Генерал-майор
    Группа: Проверенные
    Сообщений: 618
    Статус: Offline

    Предлагаю попробовать подбор коэффициентов ПИД, как Леонид рассказывает в видео.
    Основное условие - вывод графиков время-температура на экран ПК:
    

    "Опыт — это то, что получаешь, не получив того, что хотел" © интернет
     

    snmar4enko
    Дата: Понедельник, 29.07.2019, 22:10 | Сообщение # 573        
    Лейтенант
    Группа: Пользователи
    Сообщений: 68
    Статус: Offline

    Привет в7 !

    Много доработок .... много нужно тестить. 
    И все же помехи фазового управления симистором в комбинации с большой нагрузкой наших нагревателей (киловатты) а также разный у всех детектор перехода через ноль - создают больше проблем чем преимуществ (более точная шкала регулирования подводимой к нагревателю мощности).

    Взгляните на когда-то используемый код для схем без детекции нуля ардуинкой (для нижнего нагревателя аналогичный):
    
    Код
    void OutPWR_TOP()
    {   
      reg1 = round(Output1*(pwr_TOP*0.01)) + er1; //pwr- задание выходной мощности в %, er- ошибка округления
      
         if (reg1 < 50)
           {
            out1=LOW;
            
             er1 = reg1 ; // reg- переменная для расчетов
           }
              else 
            {
              out1=HIGH;
              
              er1=reg1-100;
            } 
       digitalWrite(RelayPin1,out1);//пин через который осуществляется дискретное управление


    Вычисленное значение мощности с помощью ПИД нормируется ограничением максимальной мощности  в настройках нашей паяльной станции - далее округляется (мы работаем с целыми числами) и суммируется с предыдущим значением мощности. Все просто - если мощность больше  50% включаем нагреватель,  если меньше - то выключаем. Напомню, что устройства типа SSR-25DA или аналогичный сборки с оптосимистора и мощного симистора включается при высоком уровне на переходе через ноль.  Или не включается если управляющий  уровень низкий.

    Если оптимизировать код используя библиотеку CyberLib , мощность нормировать размером байта  0-255, включать или выключать по старшему биту 0-1, и нужно пробовать как будет вести суммирование с потерей бита переноса для байта чтобы избавится от строки  er1=reg1-100.

    Что мы на самом деле получаем: нагрузка включается или выключается на полупериод сети, то есть 50 герц на 2 полупериода = 100 раз в секунду. В масштабах секунды регулировать мощности от 0 до 100 % в принципе не плохо. Но посмотрим на работу нашей системы (версия 2.1.1) - ПИД считается 20 раз, температура считывается 2 раза в секунду, дисплей обновляется раз в 2 секунды - и заметте при этом графики термопрофилей строятся посекундно. Не много ли таймеров. Предлагаю все привести в секундный период.
    Для тех кто уже подобрал коэффициенты напоминаю что если ПИД будет просчитываться в 20 раз реже (раз в секунду) то и коэффицинты нужно увеличить Ki в 20 раз и уменьшить Kd в 20 раз. Kp оставить без изменений.
     

    dscOlga
    Дата: Вторник, 30.07.2019, 14:06 | Сообщение # 574        
    Майор
    Группа: Пользователи
    Сообщений: 83
    Статус: Offline

    Цитата snmar4enko ()
    Взгляните на когда-то используемый код для схем без детекции нуля ардуинкой

    Этот код это реализация алгоритма Брезенхэма, причём подходит как для схем с детектором нуля так и без него. Вот его более оптимальная реализация, на выходе 0-100%
    
    Код
    void OutPWR_TOP(){
           reg1 = Output1 + er1; //pwr- задание выходной мощности в %,в текущем шаге профиля, er- ошибка округления   
            if (reg1 < 50){
              out1 = LOW;
              er1 = reg1; // reg- переменная для расчетов
              }
            else {
              out1 = HIGH;
              er1 = reg1-100;
            }
           digitalWrite(RelayPin1,out1);//пин через который осуществляется дискретное управление   
           }

    Цитата snmar4enko ()
    Если оптимизировать код используя библиотеку CyberLib , мощность нормировать размером байта
    0-255, включать или выключать по старшему биту 0-1, и нужно пробовать как будет вести суммирование с потерей бита переноса для байта чтобы избавится от строки er1=reg1-100.

    А заачем? Всё и так работает быстро, особенно если избавится от digitalWrite.
    Цитата snmar4enko ()
    ПИД считается 20 раз, температура считывается 2 раза в секунду, дисплей обновляется раз в 2 секунды - и заметте при этом графики термопрофилей строятся посекундно.

    Опять, таки зачем 20 раз в секунду ПИД и только 2 раза температура?
     

    snmar4enko
    Дата: Вторник, 30.07.2019, 20:08 | Сообщение # 575        
    Лейтенант
    Группа: Пользователи
    Сообщений: 68
    Статус: Offline

    Почему?

    смотрим 

    #define SENSOR_SAMPLING_TIME 500 //частота обновления текущей температуры (500 = 2 раза в секунду)
    #define GRAPHICS_SAMPLING_TIME 2000 //скорость движения "звёздочек" при пайке
    #define PID_SAMPLING_TIME 250 //скорость пересчета PID

    Ошибся только в том что ПИД считается 4 раза в секунду.
    И еще есть переменная для мигания звездочек на дисплее - раз в 2 секунды

    //счётчик скорости роста температуры
          if ((currentMillis - previousMillis) > 1000 
    - рост температуры привязан к секунде.

    Добавлено (30.07.2019, 20:17)
    ---------------------------------------------

    Цитата dscOlga ()
    Кодvoid OutPWR_TOP(){
           reg1 = Output1 + er1; //pwr- задание выходной мощности в %,в текущем шаге профиля, er- ошибка округления   
            if (reg1 < 50){
              out1 = LOW;
              er1 = reg1; // reg- переменная для расчетов
              }
            else {
              out1 = HIGH;
              er1 = reg1-100;
            }
           digitalWrite(RelayPin1,out1);//пин через который осуществляется дискретное управление   
           }


    pwr - нет в вашем коде - соответственно никаких ограничений мощности нет
     

    dscOlga
    Дата: Вторник, 30.07.2019, 20:54 | Сообщение # 576        
    Майор
    Группа: Пользователи
    Сообщений: 83
    Статус: Offline

    Цитата snmar4enko ()
    pwr - нет в вашем коде


    pwr это атавизм в комментарии, надо убрать
    Цитата snmar4enko ()
    соответственно никаких ограничений мощности нет


    мощность ограничивается ПИД-ом, вот здесь
    
    Код
    [size=10]byte Pid1(double temp, double ust, byte kP, byte kI, byte kd)
    {
      byte out = 0;
      static float ed = 0;
      e1 = (ust - temp); //ошибка регулирования
      p1 =  (kP * e1) / 10.0; //П составляющая
      integra = (integra < i_min) ? i_min : (integra > i_max) ? i_max : integra + (kI * e1) / 100.0; //И составляющая
      d1 = kd / 100.0 * (e1 - ed); //Д составляющая
      ed = e1;
      out = (p1 + integra + d1 < 0) ? 0 : (p1 + integra + d1 > profile.pwr_TOP) ? profile.pwr_TOP : p1 + integra + d1;
      return out;
    }[/size]


    строка out = (p1 + integra + d1 < 0) ? 0 : (p1 + integra + d1 > profile.pwr_TOP) ? profile.pwr_TOP : p1 + integra + d1;

    Цитата snmar4enko ()
    Ошибся только в том что ПИД считается 4 раза в секунду


    ошибка не в этом, ошибка в том, что ПИД должен считаться ровно столько, сколько измерений температуры сделано. Т.е одно измерение температуры - один расчёт ПИД.
    Цитата snmar4enko ()
    if ((currentMillis - previousMillis) > 1000 - рост температуры привязан к секунде.


    Там не так, там вот так
    Код
    if ((currentMillis - previousMillis) > 1000 / (profile.rampRateStep[currentStep - 1] * 0.1))


    мы не привязаны к секунде, мы привязаны к скорости роста за секунду.
    Цитата snmar4enko ()
    Предлагаю все привести в секундный период.


    Я думаю, что этот интервал великоват, всё таки логичнее привязаться к интервалу 250мс.


    Сообщение отредактировал dscOlga - Вторник, 30.07.2019, 20:55
     

    snmar4enko
    Дата: Среда, 31.07.2019, 18:21 | Сообщение # 577        
    Лейтенант
    Группа: Пользователи
    Сообщений: 68
    Статус: Offline

    Цитата dscOlga ()
    Я думаю, что этот интервал великоват, всё таки логичнее привязаться к интервалу 250мс.

    - для Схем с детекцией  нуля и фазовым управлением  - согласен, но для устройств типа SSR-25DA или аналогичной сборки с оптосимистора и мощного симистора, включающегося при высоком уровне и на переходе через ноль - плохо. Получается только 25 значений мощности, между соседними значениями 4%, а для наших мощных 2 килловатных нижних подогревов где мощность, необходимая для установившегося режима 10-12%. Получается что мощность будет скакать между 8 и 12%. Плохо! Особенно для основного режима пайки - верхний нагреватель регулировать 25 значениями мощности - возможность вылетов тоже велика.

    Общим нужно переписать код с обеднением переменных периодов расчетов, измерений индикаций к  одному. А какой период лучше можно проверить даже экпериментально.
     

    dscOlga
    Дата: Среда, 31.07.2019, 21:35 | Сообщение # 578        
    Майор
    Группа: Пользователи
    Сообщений: 83
    Статус: Offline

    Цитата snmar4enko ()
    для устройств типа SSR-25DA или аналогичной сборки с оптосимистора и мощного симистора, включающегося при высоком уровне и на переходе через ноль - плохо. Получается только 25 значений мощности, между соседними значениями 4%,


    Поясните подробнее, как вы считаете количество значений.


    Сообщение отредактировал dscOlga - Среда, 31.07.2019, 21:35
     

    snmar4enko
    Дата: Четверг, 01.08.2019, 14:00 | Сообщение # 579        
    Лейтенант
    Группа: Пользователи
    Сообщений: 68
    Статус: Offline

    Все просто:
    устройство (силовой ключ) типа SSR-25DA включается или выключается при переходе через ноль сетевого напряжения. Сеть у нас 50 гц, имеет два полупериода, на каждый из которых силовой ключ может включится или выключится. Фактически таких промежутков 100 в секунду. Тоесть период 10милисекунд.

    В нашем предлагаемом цикле 250 микросекунд получаем только 25 таких полупериодов, то есть 25 периодов включения соответствуют 100% мощности. Соответственно один полупериод включает на 4% мощность. 

    Я повторюсь все эти расчеты относятся к ключам типа SSR-25DA и не как не касаются фазового регулирования с детекцией перехода фазы через ноль самой ардуинкой. В фазовом управлении можно регулировать вплоть до 0.1% на деления, качество регулирования не падает, однако и помеха растет - сбоит ардуинка.

    С другой стороны - чем чаще мы считаем ПИД и подаем вычисленную мощность на ключ того или иного нагревателя - тем точней у нас будет температура. Но позвольте, если мы так уж сильно разбросали все параметры системы то о какой правильной работе идет речь ....

    К примеру на одном измерении температуры 2 раза считается ПИД, при этом конечный пользователь паяльной станции видит все изменеия через через раз (так обновляется дисплей, зато при фазовом управлении ключами нагревателей - мощность выставляется 100 раз в секунду.

    Добавлено (01.08.2019, 14:13)
    ---------------------------------------------
    Кстати ограничение мощности можно регулировать в ПИД ограничением максиму выхода или перемножением Выходного значения ПИД на выставленнное ограничение перед регулированием мощности.

    Мы уже так и сяк пробовали.

    Да и можно вообще избавиться от таймеров измерения температуры, расчета ПИД, вывода на экран - пустив все последовательно - и там ардуинка сама подберет период (цикл) - однако он может оказаться еще меньшим чем 250 микросекунд.

     

    dscOlga
    Дата: Пятница, 02.08.2019, 06:09 | Сообщение # 580        
    Майор
    Группа: Пользователи
    Сообщений: 83
    Статус: Offline

    Цитата snmar4enko ()
    В нашем предлагаемом цикле 250 микросекунд получаем только 25 таких полупериодов, то есть 25 периодов включения соответствуют 100% мощности. Соответственно один полупериод включает на 4% мощность.

    Алгоритм Брезентхэма не совсем так работает. Там получается если мы задаём ему мощность, допустим, 40%, он раскидывает равномерно эти 40% импульсов по периоду в 100 импульсов. Поэтому в нашем цикле 250 милисекунд при 40% мощности будет 10 импульсов, т.е. регулировка мощности через 1%.
    Цитата snmar4enko ()
    Но позвольте, если мы так уж сильно разбросали все параметры системы то о какой правильной работе идет речь ....

    А ничего у нас не разбросано, всё идёт точно по таймерам.
    Цитата snmar4enko ()
    К примеру на одном измерении температуры 2 раза считается ПИД, при этом конечный пользователь паяльной станции видит все изменеия через через раз (так обновляется дисплей, зато при фазовом управлении ключами нагревателей - мощность выставляется 100 раз в секунду.

    Не важно, насколько часто пользователь видит температуру, важно как правильно отработает задание ПИД.
    Цитата snmar4enko ()
    Да и можно вообще избавиться от таймеров измерения температуры, расчета ПИД, вывода на экран - пустив все последовательно - и там ардуинка сама подберет период (цикл) - однако он может оказаться еще меньшим чем 250 микросекунд.

    так нельзя делать, главное в ПИД регуляторе - точные временные промежутки пересчёта.
     

    snmar4enko
    Дата: Пятница, 02.08.2019, 09:37 | Сообщение # 581        
    Лейтенант
    Группа: Пользователи
    Сообщений: 68
    Статус: Offline

    Цитата dscOlga ()
    Алгоритм Брезентхэма не совсем так работает. Там получается если мы задаём ему мощность, допустим, 40%, он раскидывает равномерно эти 40% импульсов по периоду в 100 импульсов. Поэтому в нашем цикле 250 милисекунд при 40% мощности будет 10 импульсов, т.е. регулировка мощности через 1%.


    не будет 1% - будет 4%. А пример 40% просто совпал - 10 циклов по 10 микросекунд - как раз кратное 4-м. Мой пример - например установившееся значений 38% мощности - и ардуинка иже не может сообразить - 9 или 10 циклов включить из 25. Получается такая себе вибрация (колебание мощности)

    Цитата dscOlga ()
    так нельзя делать, главное в ПИД регуляторе - точные временные промежутки пересчёта


    а я и не предлагаю, просто сделал вывод о том, что если пустить на самотек - то работа почти не изменится. 

    Я предлагаю  почти все циклы объединить в один и есть два предложения: 1 секунда и 250 микросекунд. Измерять температуру 4 раза в секунду с учетом инерционности наших нагревателей не имеет смысла да и зрение обновленное 4 кадра в секунду изображение не каждый воспримет. Еще предлагаю в управлении нагревателями избавится от  фазового управления, слишком много помех - особенно при малых мощностях.   
    Цитата dscOlga ()
    А ничего у нас не разбросано, всё идёт точно по таймерам.


    согласен что таймеров у нас есть и много.  Но допустим простой анализ - расчет ПИД два раза на одной температуре фактически не повышает точность расчетов а наоборот ведет себя тупо, как бы удвоили коэффициенты ПИД.  Особенно грубая регулировка мощности через пропорциональную составляющую.
     

    dscOlga
    Дата: Пятница, 02.08.2019, 14:51 | Сообщение # 582        
    Майор
    Группа: Пользователи
    Сообщений: 83
    Статус: Offline

    Цитата snmar4enko ()
    не будет 1% - будет 4%. А пример 40% просто совпал - 10 циклов по 10 микросекунд - как раз кратное 4-м. Мой пример - например установившееся значений 38% мощности - и ардуинка иже не может сообразить - 9 или 10 циклов включить из 25. Получается такая себе вибрация (колебание мощности)


    Будет именно 1%, причём достаточно точно. Вы не до конца поняли работу алгоритма Брезентхэма. В вашем примере при мощности 38% в первые 250мс пройдёт 9 импульсов(9 полупериодов работы) а в следующие 250мс пройдёт 10 импульсов. Итого (9+10)*2 = 38 импульсов за 1 сек или за 100 полупериодов. Итоговая мощность 38%. Чтобы не быть голословным вот вам осциллограмма моделирования

    я выделил промежуток 500мс - это 2 по 250мс. Синяя осциллограмма - сигнал с детектора нуля, жёлтая - выход на управление симисторами. В выделенный фрагмент уложилось 19 импульсов, 9 в первой части(250мс) и 10 во второй(250мс).
    Цитата snmar4enko ()
    расчет ПИД два раза на одной температуре фактически не повышает точность расчетов а наоборот ведет себя тупо, как бы удвоили коэффициенты ПИД.


    Многократный расчёт ПИД при неизменной температуре вообще не повышает точность, а просто наращивает интегральную составляющую(по сути увеличивает коэффициент при интегральной составляющей), что ведёт к необоснованному её росту и как правило перерегулированию. На пропорциональную и дифференциальную составляющую не влияет. Я всегда утверждал и сейчас говорю, что должна работать формула - "одно чтение температуры - один расчёт ПИД" остальное подгоняем коэффициентами и иногда дополнительной математикой.
    Цитата snmar4enko ()
    да и зрение обновленное 4 кадра в секунду изображение не каждый воспримет.


    Выводить надо не чаще 1 раза за секунду, если всё настроено правильно проблем не будет.
    Цитата snmar4enko ()
    Еще предлагаю в управлении нагревателями избавится от фазового управления, слишком много помех - особенно при малых мощностях.


    Как не странно, но есть ещё любители фазового управления, наверное надо и для них что нибудь оставить. Я думаю надо сделать универсальный вариант, чтобы так сказать всем было по вкусу и желанию.
    Прикрепления: 7136199.jpg (139.4 Kb)


    Сообщение отредактировал dscOlga - Пятница, 02.08.2019, 14:52
     

    Cinema
    Дата: Пятница, 02.08.2019, 19:32 | Сообщение # 583        
    Генерал-майор
    Группа: Проверенные
    Сообщений: 618
    Статус: Offline

    snmar4enko, dscOlga С интересом читаю вашу переписку smile
    И, кстати, очень даже согласен с dscOlga в вопросе сохранения ветки с фазовым регулированием (ФИУ).
    snmar4enko, ваше уникальное решение регулировать с разделением на четные и нечетные полупериоды работает: люди сделали термостол на ~4,3кВт и верх на ~1,3кВт, сделали красиво, с сервоприводами, и переделывать не нашли моральных сил. В результате конструкция пылилась несколько лет. Теперь она работает постоянно, да, вылезают косяки скетча, ведь у них версия 2.0.9 ещё, но они как-то умудряются на ней работать... А что до помех - так работают же ведь каким-то образом!
    Да и mon давно снял бы шляпу и покаялся, если бы его контроллер с ФИУ сбоил от помех... smile
    То, что применяемые нами микроконтроллеры не относятся к промышленным, специально предназначенным для эксплуатации в условиях сильных помех, это, конечно, минус, но вот на днях снова всплыла тема правильности разводки силовых и сигнальных цепей в теме 4uvak на Паяльнике, где он дал очень полезную ссылку про это самое дело:
    

    "Опыт — это то, что получаешь, не получив того, что хотел" © интернет
     

    snmar4enko
    Дата: Суббота, 03.08.2019, 08:21 | Сообщение # 584        
    Лейтенант
    Группа: Пользователи
    Сообщений: 68
    Статус: Offline

    Цитата Cinema ()
    Как не странно, но есть ещё любители фазового управления, наверное надо и для них что нибудь оставить. Я думаю надо сделать универсальный вариант, чтобы так сказать всем было по вкусу и желанию.

    А что мешает? я когда писал код - вел две ветки, если память не изменяет ветка версии 1.4.* для SSR-25DA и ветка 2.0.* для фазовогоуправления.
    Плохо,что в ветке 1.4.* Алгоритм Брезентхэма практически искоренен, также нет библиотеки CyberLib .... Да и много кода переписано ..... теперь и не вспомниш что и когда менял ....
     

    valentintatchin
    Дата: Четверг, 03.10.2019, 11:33 | Сообщение # 585        
    Рядовой
    Группа: Пользователи
    Сообщений: 19
    Статус: Offline

    Добрый день.
    У меня мощность верхнего и нижнего нагревателя ограничивается 50%, выше не поднимается, хотя в профиле указываю 100%. прошивка  Rework_v2.1.1
    С чем это может быть связано?
     

    Поиск: