Друзья сайта |
Форум поддержки программ "Tiny Tools" (CPLD/USB-S/USB-F/USB-SPI EJTAG Tiny Tools)
Электроника на KitPost
|
Наш опрос |
Оцените мой сайт
Всего ответов: 86
|
|
Инфракрасная паяльная станция своими руками на ARDUINO
| |
Alexandr_ | Дата: Среда, 08.02.2017, 19:55 | Сообщение # 1 |
Генералиссимус
Группа: Администраторы
Сообщений: 814
Статус: Offline
| Форумчане, куплю-продажу и личные сделки выяснять в личке, либо в новом форуме, этот форум для вопросов по электронной части станции.
Архив по станции от hominidae с проектом efimsu ->здесь Проект Леонида, Leonid0071 "UNO-MAX6675-PC" и его доработки на форуме Амперки -> скачать
Люби грешников, ненавидь сам грех!
|
|
|
Пользователи поблагодарившие Alexandr_ за этот пост: |
|
|
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 не надо перезапускать или передёргивать питание, работа восстанавливается автоматически.
|
|
|
Пользователи поблагодарившие dscOlga за этот пост: |
|
|
Cinema | Дата: Пятница, 19.07.2019, 14:50 | Сообщение # 572 |
Генерал-майор
Группа: Проверенные
Сообщений: 618
Статус: Offline
| Предлагаю попробовать подбор коэффициентов ПИД, как Леонид рассказывает в видео. Основное условие - вывод графиков время-температура на экран ПК:
"Опыт — это то, что получаешь, не получив того, что хотел" © интернет
|
|
|
Пользователи поблагодарившие Cinema за этот пост: |
|
|
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 оставить без изменений.
|
|
|
Пользователи поблагодарившие snmar4enko за этот пост: |
|
|
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 раза температура?
|
|
|
Пользователи поблагодарившие dscOlga за этот пост: |
|
|
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 - нет в вашем коде - соответственно никаких ограничений мощности нет
|
|
|
Пользователи поблагодарившие snmar4enko за этот пост: |
|
|
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 |
|
|
Пользователи поблагодарившие dscOlga за этот пост: |
|
|
snmar4enko | Дата: Среда, 31.07.2019, 18:21 | Сообщение # 577 |
Лейтенант
Группа: Пользователи
Сообщений: 68
Статус: Offline
| Цитата dscOlga ( ) Я думаю, что этот интервал великоват, всё таки логичнее привязаться к интервалу 250мс. - для Схем с детекцией нуля и фазовым управлением - согласен, но для устройств типа SSR-25DA или аналогичной сборки с оптосимистора и мощного симистора, включающегося при высоком уровне и на переходе через ноль - плохо. Получается только 25 значений мощности, между соседними значениями 4%, а для наших мощных 2 килловатных нижних подогревов где мощность, необходимая для установившегося режима 10-12%. Получается что мощность будет скакать между 8 и 12%. Плохо! Особенно для основного режима пайки - верхний нагреватель регулировать 25 значениями мощности - возможность вылетов тоже велика.
Общим нужно переписать код с обеднением переменных периодов расчетов, измерений индикаций к одному. А какой период лучше можно проверить даже экпериментально.
|
|
|
Пользователи поблагодарившие snmar4enko за этот пост: |
|
|
dscOlga | Дата: Среда, 31.07.2019, 21:35 | Сообщение # 578 |
Майор
Группа: Пользователи
Сообщений: 83
Статус: Offline
| Цитата snmar4enko ( ) для устройств типа SSR-25DA или аналогичной сборки с оптосимистора и мощного симистора, включающегося при высоком уровне и на переходе через ноль - плохо. Получается только 25 значений мощности, между соседними значениями 4%,
Поясните подробнее, как вы считаете количество значений.
Сообщение отредактировал dscOlga - Среда, 31.07.2019, 21:35 |
|
|
Пользователи поблагодарившие dscOlga за этот пост: |
|
|
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 микросекунд.
|
|
|
Пользователи поблагодарившие snmar4enko за этот пост: |
|
|
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 микросекунд. так нельзя делать, главное в ПИД регуляторе - точные временные промежутки пересчёта.
|
|
|
Пользователи поблагодарившие dscOlga за этот пост: |
|
|
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 ( ) А ничего у нас не разбросано, всё идёт точно по таймерам.
согласен что таймеров у нас есть и много. Но допустим простой анализ - расчет ПИД два раза на одной температуре фактически не повышает точность расчетов а наоборот ведет себя тупо, как бы удвоили коэффициенты ПИД. Особенно грубая регулировка мощности через пропорциональную составляющую.
|
|
|
Пользователи поблагодарившие snmar4enko за этот пост: |
|
|
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 ( ) Еще предлагаю в управлении нагревателями избавится от фазового управления, слишком много помех - особенно при малых мощностях.
Как не странно, но есть ещё любители фазового управления, наверное надо и для них что нибудь оставить. Я думаю надо сделать универсальный вариант, чтобы так сказать всем было по вкусу и желанию.
Сообщение отредактировал dscOlga - Пятница, 02.08.2019, 14:52 |
|
|
Пользователи поблагодарившие dscOlga за этот пост: |
|
|
Cinema | Дата: Пятница, 02.08.2019, 19:32 | Сообщение # 583 |
Генерал-майор
Группа: Проверенные
Сообщений: 618
Статус: Offline
| snmar4enko, dscOlga С интересом читаю вашу переписку И, кстати, очень даже согласен с dscOlga в вопросе сохранения ветки с фазовым регулированием (ФИУ). snmar4enko, ваше уникальное решение регулировать с разделением на четные и нечетные полупериоды работает: люди сделали термостол на ~4,3кВт и верх на ~1,3кВт, сделали красиво, с сервоприводами, и переделывать не нашли моральных сил. В результате конструкция пылилась несколько лет. Теперь она работает постоянно, да, вылезают косяки скетча, ведь у них версия 2.0.9 ещё, но они как-то умудряются на ней работать... А что до помех - так работают же ведь каким-то образом! Да и mon давно снял бы шляпу и покаялся, если бы его контроллер с ФИУ сбоил от помех... То, что применяемые нами микроконтроллеры не относятся к промышленным, специально предназначенным для эксплуатации в условиях сильных помех, это, конечно, минус, но вот на днях снова всплыла тема правильности разводки силовых и сигнальных цепей в теме 4uvak на Паяльнике, где он дал очень полезную ссылку про это самое дело:
"Опыт — это то, что получаешь, не получив того, что хотел" © интернет
|
|
|
Пользователи поблагодарившие Cinema за этот пост: |
|
|
snmar4enko | Дата: Суббота, 03.08.2019, 08:21 | Сообщение # 584 |
Лейтенант
Группа: Пользователи
Сообщений: 68
Статус: Offline
| Цитата Cinema ( ) Как не странно, но есть ещё любители фазового управления, наверное надо и для них что нибудь оставить. Я думаю надо сделать универсальный вариант, чтобы так сказать всем было по вкусу и желанию. А что мешает? я когда писал код - вел две ветки, если память не изменяет ветка версии 1.4.* для SSR-25DA и ветка 2.0.* для фазовогоуправления. Плохо,что в ветке 1.4.* Алгоритм Брезентхэма практически искоренен, также нет библиотеки CyberLib .... Да и много кода переписано ..... теперь и не вспомниш что и когда менял ....
|
|
|
Пользователи поблагодарившие snmar4enko за этот пост: |
|
|
valentintatchin | Дата: Четверг, 03.10.2019, 11:33 | Сообщение # 585 |
Рядовой
Группа: Пользователи
Сообщений: 19
Статус: Offline
| Добрый день. У меня мощность верхнего и нижнего нагревателя ограничивается 50%, выше не поднимается, хотя в профиле указываю 100%. прошивка Rework_v2.1.1 С чем это может быть связано?
|
|
|
Пользователи поблагодарившие valentintatchin за этот пост: |
|
|
|