Чтож. Перейдем ко второй стадии. Разберемся с самыми простейшими в реализации вариантами получения температуры, разберемся как ее удерживать. 1 - Термодатчик а-ля DS18B20 : отметается сразу. Не замеряет выше 120 2 - Платиновый терморезистор. Хорошая точность, простая реализация в коде всего одним аналоговым чтением. Собираем мостовую схему или простой резистивный делитель напряжения потипу Замеряя выходное напряжение и зная точное сопротивление R1 , можно по формуле Uвых = Uвх*(R2 / R1 + R2) высчитать значение R2 (терморезистор меняет свое сопротивление в зависимости от температуры , что очевидно). Для терморезисторов производители дают таблицы из пар сопротивление-температура, соотносим одно с другим и получаем желаемый ответ. По такому же принципу (резистивные делители и мостовые схемы) построены многочисленные тестеры полупроводниковых компонентов. Я возможно остановился бы на терморезисторах, если нашел в местной продаже за адекватную сумму 3 - Термопара. Принцип работы у нее довольно прост : специально подобранные сплавы в составе проводов. При нагреве возникает эффект Зеебека - термопара становится очень дохлой батарейкой, выдающей несколько микровольт на каждый градус температуры. Наше дело уловить это напряжение и усилить в более понимаемые микроконтроллером (0-5в) и определить температуру по напряжению. И тут опять таки есть несколько путей : усилитель на операционнике (напр LM35 либо специализированные микросхемы (MAX6675,MAX31855). Операционный усилитель : нужда в правильной настройке, общая низкая точность, необходимость в кучке резисторов и кондеров. Зато подключается всего к одному аналоговому выходу и может работать с любым типом термопар, если изменить коэф. усиления. Первая подопытная плата пошла у меня пузырями и чипы на бессвинце слезли без верха, хотя по показаниям на плате было всего порядка 160. После таких дел я операционники забросил подальше. Операционник с обвязкой обойдется рублей в 30 максимум + термопару можно отодрать от тестера. Вполне рабочая схема Спец. микросхема : компенсация нагрева самой термопары, точность 0.25 градуса, готовность к работе "из коробки" - никаких настроек, минимум обвязки. Однако и занимают уже 3 ноги ибо работает по серийному протоколу, да и библиотечка под это дело нужна. Продаются в районе 350р за плату с проводом термопары. Вполне вменяемо. Что использовать - дело за вами. Я сам никуда с 6675 не слезу
Теперь про удержание. Ходить вокруг да около - не вижу смысла, поковыряем ПИД алгоритм. И нет, это не первые три буквы обзывательства. Почему именно он : - Позволяет точно подстроиться под тип нагревателей, можно учесть инерционность. - Как бы ни казалось относительно прост в реализации. - Хорошо подходит для цикличных регулировок. В моем случае я пересчитываю все 2 раза в секунду. Овер-точность нам не нужна и многократный запуск массового умножения сильно жрет процессорное время. Алгоритм позволяет учесть 3 вида составляющих : - Мгновенная ошибка регулирования : Пропорциональная составляющая (Tжелаемая-Тсейчас) - Накопленная ошибка регулирования : Интегральная составляющая (Площадь графика ошибки) - Будущая ошибка регулирования : Дифференциальная составляющая (2 последние точки показывают тенденцию роста функции) Зачем так много, когда можно просто ориентироваться на текущее отклонение и включать - выключать нагрев? Ответ : неустойчивость, перерегулирование. Правильно настроенный ПИД регулятор практически не осциллирует вокруг желаемой температуры и достигает ее гораздо быстрее. Эту штуку придумали умные дяди, я думаю нет смысла сомневаться в ее эффективности Приступим к реализации. Тут нам понадобится немножко вычислительной математики, а точнее всего 2 метода. Один для численного интегрирования, один для численного дифференциирования. И того, для алгоритма нам нужно : - Определенный постоянный промежуток между подсчетами нового результата. У меня это 0.5с. - Ошибка в температурах в данный момент времент. Это просто как A-B. - Интеграл всех ошибок, возникших с момента старта. Что вообще есть интеграл? На самом деле в геометрическом смысле он трактуется как площадь графика. Не сложно ведь найти площать прямоугольника, зная его стороны? И метод уже такой есть - https://ru.wikipedia.org/wiki/Метод_прямоугольников. Площать каждого такого кусочка получается 0.5*ошибка. Не слишком точно, но нам и не в космос лететь Находим площадь, суммируем. Вот и все интегрирование. - Дифференциал по последним двум точкам. Тут нужно взять численную производную, что еще проще интеграла. А что есть производная? А это мера определения силы увеличения наклона графика. Всего то что сделать нужно - из последней ошибки вычесть предпоследнюю и поделить на время шага. Изи. Таким образом у нас есть все необходимые слагаемые для определения результирующего воздействия. Каждому мы присвоим вес - заданный множитель и сольем воедино. Мощность ламп = Kp*[Мгновенная ошибка]+Ki*[Площадь графика ошибки]+Kd*[Численная производная];
Теория разжевана, напишем бич-реализацию в 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); } } Следующее псто - отдам размеры железок и посчитаю стоимость.
А блюпуп туды при делать моно!!! Балдею конечно! А так может просто REX-C100 как самый простой вариант
привет подскажите можно ли прекрутить к этой станции https://ru.aliexpress.com/item/AC-2..._9&btsid=b3402f48-18ed-4e89-bb7a-90361bb11b36 вот эту штуку https://ru.aliexpress.com/item/STM3...087&tpp=1&detailNewVersion=&categoryId=144003
@Russel, Можно, если купить еще блок питания на 24 В или доработать тот, что в feita 936 стоит. В общем дорогой корпус получается.
В твоей станции стоит трансформатор. С этого трансформатора (если после него нет выпрямителя) выходит 24 Вольта переменки. Для этой платы, которую ты хочешь поставить нужны 24 Вольта постоянки, для этого ставится диодный мост (выпрямитель) и конденсатор в качестве фильтра.