|
Как сделать вычисление значения температуры по градуировочной таблице термопары? |
|
|
11 страниц
1 2 3 > »
|
 |
Ответов
(1 - 99)
|
Feb 25 2009, 11:15
|
Гуру
     
Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883

|
Цитата(Ivan Kuznetzov @ Feb 25 2009, 13:37)  Как сделать вычисление значения температуры по градуировочной таблице термопары?
Пишу прогу на сях. К примеру, измеряем напряжение с термопары, усиливаем его (с известным Ку) и подаем на вход ADC0 атмеги - там делим на Ку и получаем милливольты; есть также градуировочная таблица для термопары вида:
float gradtbl[131]={0 , 0.40 , 0.80 , 1.20 ...... и т.д. 131 значение
как сделать пересчет значения миливольт в градусы? Переделайте в микровольты (или десятки микровольт) - будут целые. Если по таблице, то интерполяция - находите интервал, в который попадает Ваше число X - (N-1,N). T=N-1 + (X-f(N-1))/(f(N)-f(N-1)) Можно многочленом сразу. Не забудьте про температуру опорного спая. Только при чем тут АВР и С?
|
|
|
|
|
Feb 25 2009, 11:22
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(Ivan Kuznetzov @ Feb 25 2009, 14:37)  Пишу прогу на сях.  На тех же сях берете и составляете другую "прогу", но уже для компа, в которой все вышесказанное, только не Цитата Переделайте в микровольты (или десятки микровольт) - будут целые. - это слишком общО - сразу пересчет в ожидаемые реальные показания (N=1024*U/Uref) выводите хоть куда - хоть на экран, и потом забираете данные командной строкой типа create.exe >>table.inc
|
|
|
|
|
Feb 25 2009, 12:26
|

Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581

|
Как вариант: Задаем массив, разбив участки зависимости на прямые (относительно) //условно: Код table_termo[]={0/*значение для 0мкв*/,10/*значение температуры для 100мкв*/,20,30,...};[code] Расстояние между индексами 100мкв, например, по таблице Заводим переменную для измеренного напряжения на термопаре u_tmp_mkv Переменная температуры пусть tmp_table Тогда Код tmp_table=(table_termo[u_tmp_mkv/100+1]-table_termo[u_tmp_mkv/100])*(u_tmp_mkv%10+10*u_tmp_mkv%100)/100+table_termo[u_tmp_mkv/100]; Это примерно, но принцип понятен, думаю...
Сообщение отредактировал Goodefine - Feb 25 2009, 12:27
--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
|
|
|
|
|
Feb 25 2009, 12:34
|

Местный
  
Группа: Свой
Сообщений: 307
Регистрация: 6-02-08
Из: Россия, Екатеринбург
Пользователь №: 34 798

|
Цитата(Goodefine @ Feb 25 2009, 17:26)  Как вариант: Задаем массив, разбив участки зависимости на прямые (относительно) //условно: Код table_termo[]={0/*значение для 0мкв*/,10/*значение температуры для 100мкв*/,20,30,...};[code] Расстояние между индексами 100мкв, например, по таблице Заводим переменную для измеренного напряжения на термопаре u_tmp_mkv Переменная температуры пусть tmp_table Тогда Код tmp_table=(table_termo[u_tmp_mkv/100+1]-table_termo[u_tmp_mkv/100])*(u_tmp_mkv%10+10*u_tmp_mkv%100)/100+table_termo[u_tmp_mkv/100]; Это примерно, но принцип понятен, думаю... последняя формула точно так будет выглядеть или это пример?
--------------------
Разработчик
|
|
|
|
|
Feb 25 2009, 12:35
|

Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581

|
Цитата Куда удобнее расстояние делать в 1 попугай АЦП. Нам-то, суровым авр-щикам crying.gif Зато так удобнее передрать зависимость ЭДС от температуры из паспорта термопары. Не принципиально, в общем... Но потом Ваш вариант, безусловно, приятней  Цитата последняя формула точно так будет выглядеть или это пример? Смысл в том что интерполируется число между двумя значениями из таблицы, определенными измеренным напряжением в мкв (загрубленным в "расстояние между значениями по таблице" раз). На практике, конечно, надо поотлаживать этот кусок (остатки, правильный порядок и т.д.)...
Сообщение отредактировал Goodefine - Feb 25 2009, 12:43
--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
|
|
|
|
|
Feb 25 2009, 12:46
|

Местный
  
Группа: Свой
Сообщений: 307
Регистрация: 6-02-08
Из: Россия, Екатеринбург
Пользователь №: 34 798

|
Цитата(Goodefine @ Feb 25 2009, 17:35)  Зато так удобнее передрать зависимость ЭДС от температуры из паспорта термопары. Не принципиально, в общем... таблица обычная - тоесть указывается значение ЭДС через каждые 10 градусов - и заведена в массив: второй массив это числа от 0 до 1300 с шагом 10 Код float gradtbl[131]={0 , 0.40 , 0.80 , 1.20 , 1.61 , 2.02 , 2.43 , 2.85 , 3.26 , 3.68, 4.10 , 4.51 , 4.92 , 5.33 , 5.73 , 6.13 , 6.53 , 6.93 , 7.33 , 7.73, 8.13 , 8.53 , 8.93 , 9.34 , 9.74 , 10.15 , 10.56 , 10.97 , 11.38 , 11.80, 12.21 , 12.62 , 13.04 , 13.45 , 13.87 , 14.30 , 14.72 , 15.14 , 15.56 , 15.99, 16.40 , 16.83 , 17.25 , 17.67 , 18.09 , 18.51 , 18.94 , 19.37 , 19.79 , 20.22, 20.65 , 21.08 , 21.50 , 21.93 , 22.35 , 22.78 , 23.21 , 23.63 , 24.06 , 24.49, 24.91 , 25.33 , 25.76 , 26.19 , 26.61 , 27.04 , 27.46 , 27.88 , 28.30 , 28.73, 29.15 , 29.57 , 29.99 , 30.41 , 30.83 , 31.24 , 31.66 , 32.08 , 32.19 , 32.90, 33.32 , 33.72 , 34.13 , 34.55 , 34.95 , 35.36 , 35.76 , 36.17 , 36.57 , 36.97, 37.37 , 37.77 , 38.17 , 38.57 , 38.97 , 39.36 , 39.76 , 40.15 , 40.54 , 40.93, 41.32 , 41.71 , 42.09 , 42.48 , 42.88 , 43.26 , 43.64 , 44.02 , 44.40 , 44.78, 45.16 , 45.54 , 45.91 , 46.29 , 46.66 , 47.03 , 47.40 , 47.77 , 48.14 , 48.50, 48.87 , 49.23 , 49.59 , 49.95 , 50.31 , 50.67 , 51.02 , 51.38 , 51.73 , 52.08, 52.43};
float tempm[131];
for (i = 0; i < 131; i++) { tempm[i] = i; tempm[i] *= 10; } и собсссно сам цикл: Код while (1) { if (analogreg==1) { mvolt = read_adc(0) / 25;
for (i = 1; i < 132; i++) { if (gradtbl[i] > mvolt) {
themp = tempm[i - 1] + (( mvolt - gradtbl[i - 1] ) / ( gradtbl[i] - gradtbl[i - 1] )) * 10; } } { Дак вот в Баскоме все работало четко - а на Си (CVAVR) у меня все тормозит и когда на входе ADC ноль то температуру кажет " - 198" градусов - в чем тут могут быть грабли?
Сообщение отредактировал Ivan Kuznetzov - Feb 25 2009, 12:47
--------------------
Разработчик
|
|
|
|
|
Feb 25 2009, 14:02
|

Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581

|
Если по Вашему (с флоат), то проще примерно так: Код float gradtbl[131]={/*...*/}; //... uchar index1, index2; float u_tmpr; //переведенное в флоат-миливольты измеренное напряжение float tmpr_value; //переменная для температуры
for(i=0;i<131;i++) { if(gradtbl[i]>=u_tmpr){index1=i; break;} }
tmpr_value= (gradtbl[index1]-gradtbl[index1-1])/100 //промежуточное
for(i=0;i<100;i++) { if(gradtbl[index1-1]+tmpr_value*i>=u_tmpr){index2=i; break;} }
tmpr_value=10*(index1-1) + index2/10; //окончательное значение температуры с десятыми Можно, конечно, и проверку граничных условий добавить...
Сообщение отредактировал Goodefine - Feb 25 2009, 14:23
--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
|
|
|
|
|
Feb 26 2009, 04:59
|

Местный
  
Группа: Свой
Сообщений: 307
Регистрация: 6-02-08
Из: Россия, Екатеринбург
Пользователь №: 34 798

|
Цитата(demiurg_spb @ Feb 26 2009, 03:17)  Ну Вы маньяки. Нужна всего одна целочисленная таблица с шагом в 10 гр.Цельсия, а в таблице прямо коды АЦП. Получили код с АЦП, пробежались по таблице, тем самым нашли в каком диапазоне температур оказались, а дальше линейная интерполяция. Единственное о чём Вам надо ещё задуматься так это о компенсации ЭДС ХС. У меня так сделано - работает превосходно. а можно Ваш исходник посмотреть, пожалуйста?
--------------------
Разработчик
|
|
|
|
|
Feb 26 2009, 06:34
|
Участник

Группа: Участник
Сообщений: 29
Регистрация: 31-05-06
Пользователь №: 17 639

|
Цитата(Ivan Kuznetzov @ Feb 25 2009, 13:37)  float gradtbl[131]={0 , 0.40 , 0.80 , 1.20 ...... и т.д. 131 значение ... как сделать пересчет значения миливольт в градусы? Для ТХА, ТХК 20..200 град/0.5 хватило полинома второй степени. ХС на другом входе АЦП.
|
|
|
|
|
Feb 26 2009, 06:37
|
Участник

Группа: Новичок
Сообщений: 24
Регистрация: 18-09-08
Из: Киев
Пользователь №: 40 317

|
По поводу компенсации: я вот думаю, можно ли сразу перевести ЭДС термопары в градусы и затем к ним прибавить температуру окружающей среды (окружающая среда -30...+80 градусов Цельсия максимум, т.е. на улице). Или же нужно сначала все в микровольты переводить, там делать компенсацию и лиш затем переводить в градусы (как в учебниках)? Точности в пару градусов достаточно.
Измеряю температуру 3мя каналами AD7792, темерературу холодного спая - внутреним датчиком AD7792 (вся конструкция в металлической коробке, куда приходят концы термопар)
Сообщение отредактировал Сергей К - Feb 26 2009, 06:54
|
|
|
|
|
Feb 26 2009, 07:30
|

Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581

|
Цитата ...но десятых долей нету почему-то... Возможно, теряется точность. Попробуйте чуть иначе: Код float gradtbl[131]={/*...*/}; //... uchar index; float u_tmpr; //переведенное в флоат-милливольты измеренное напряжение float tmpr_value; //переменная для температуры //с одним циклом: for(i=0;i<131;i++) { if(gradtbl[i]>=u_tmpr){index=i; break;} }
//окончательное значение tmpr_value=10*(index-1) +( u_tmpr - gradtbl[index-1])*10/(gradtbl[index]-gradtbl[index-1]); Кстати, Ваш код вывода на дисплей можно увидеть?
Сообщение отредактировал Goodefine - Feb 26 2009, 07:35
--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
|
|
|
|
|
Feb 26 2009, 08:19
|

Местный
  
Группа: Свой
Сообщений: 307
Регистрация: 6-02-08
Из: Россия, Екатеринбург
Пользователь №: 34 798

|
GoodefineОтлично все заработало! Спасибо! код для лсиди выложу - он у меня самописный - кодевижновский меня не устраивает в моем коде: 1) 4-х проводный интерфейс 2)можно все ноги дисплея переназначать 3) на RW я забил и посадил его на землю - нафига мне с дисплея читать??  ...только после 130 градусов - остаток всегда .75вот мучает меня вопрос - а во флаше хранить таблицу можно? а то память она жрет.... если делаю вот так - то не работает: Код flash float gradtbl[131]={0 , 0.40 , 0.80 , 1.20 , 1.61 , 2.02 , 2.43 , 2.85 , 3.26 , 3.68,
Сообщение отредактировал Ivan Kuznetzov - Feb 26 2009, 08:20
--------------------
Разработчик
|
|
|
|
|
Feb 26 2009, 08:51
|
Гуру
     
Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883

|
Цитата(Ivan Kuznetzov @ Feb 26 2009, 11:19)  GoodefineОтлично все заработало! Спасибо! ...только после 130 градусов - остаток всегда .75вот мучает меня вопрос - а во флаше хранить таблицу можно? а то память она жрет.... если делаю вот так - то не работает: Код flash float gradtbl[131]={0 , 0.40 , 0.80 , 1.20 , 1.61 , 2.02 , 2.43 , 2.85 , 3.26 , 3.68, По Вашей таблице видно, что у Вас диапазон 1300 градусов, а в таблице числа в милливольтах. Разрядность Вашего АЦП (градуировка близка к линейной) позволяет разрешить примерно 1 градус (еще точнее - 1.3). Таблица через 10 градусов. При таких обстоятельствах можно (или нужно) а) уменьшить таблицу в два - три - четыре... раза. Может быть, неравномерно - постройте график - там, где отклонение от прямой будет меньше 0.5 градуса, нет смысла дробить интервал. б) в таблицу вместо милливольтов записать целые числа - соответствующие коды АЦП, в другую - соответствующую температуру. Или полином.
|
|
|
|
|
Feb 26 2009, 09:27
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(Tanya @ Feb 26 2009, 11:51)  По Вашей таблице видно, что у Вас диапазон 1300 градусов, а в таблице числа в милливольтах. Разрядность Вашего АЦП (градуировка близка к линейной) позволяет разрешить примерно 1 градус (еще точнее - 1.3). Таблица через 10 градусов. При таких обстоятельствах можно (или нужно) а) уменьшить таблицу в два - три - четыре... раза. Может быть, неравномерно - постройте график - там, где отклонение от прямой будет меньше 0.5 градуса, нет смысла дробить интервал. б) в таблицу вместо милливольтов записать целые числа - соответствующие коды АЦП, в другую - соответствующую температуру. Или полином. Зачем Вы так изощренно издеваетесь над программистами?  Любой контроллер или процессор и сам должен все сделать. Я предполагаю, что автор использует АЦП АВР с внутренней опорой (которая по даташиту имеет точность +-10%) и вряд ли эту опору калибрует. Исходя из точности опоры я предложил кривую термопары аппроксимировать прямой (парой, тройкой,... - опять же исходя из требуемой и достижимой точности) и забить на всякие плавучие таблицы. Но, похоже, для конкретных программистов точность - это сколько знаков после запятой можно вывести на индикатор.
|
|
|
|
|
Feb 26 2009, 09:33
|

Местный
  
Группа: Свой
Сообщений: 307
Регистрация: 6-02-08
Из: Россия, Екатеринбург
Пользователь №: 34 798

|
Цитата(xemul @ Feb 26 2009, 14:27)  Зачем Вы так изощренно издеваетесь над программистами?  Любой контроллер или процессор и сам должен все сделать. Я предполагаю, что автор использует АЦП АВР с внутренней опорой (которая по даташиту имеет точность +-10%) и вряд ли эту опору калибрует. Исходя из точности опоры я предложил кривую термопары аппроксимировать прямой и забить на всякие плавучие таблицы. Но, похоже, для конкретных программистов точность - это сколько знаков после запятой можно вывести на индикатор. совершенно верно! использую внутренний опорный источник МК на 2.5 вольт
--------------------
Разработчик
|
|
|
|
|
Feb 26 2009, 09:58
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Цитата(Ivan Kuznetzov @ Feb 26 2009, 12:33)  совершенно верно! использую внутренний опорный источник МК на 2.5 вольт Тогда просто аппроксимируйте кривую термопары в требуемом температурном диапазоне прямой (по методу наименьших квадратов или любому другому известному Вам). На выходе получите простую функцию T = a*Nadc + b. Все расчеты легко можно будет уложить в 2-хбайтовую целочисленную арифметику. Ну а дальше (по индукции, и если нужно повысить точность аппроксимации) можно выполнить аппроксимацию двумя прямыми (тремя,...), для каждой рассчитать a и b. Или, если таки по таблице, то можно выполнять интерполяцию не по 2 точкам, а по 3. Это позволит сократить количество точек в таблице при несущественном увеличении целочисленной арифметики, но потребует некоторых предварительных расчетов, н-р, в ёкселе (чтобы не сократить число точек сверх меры, когда погрешность интерполяции станет значимой). Погуглите методы аппроксимации и интерполяции. Кста, попалось: http://do.rksi.ru/library/courses/chm/Обратите внимание на раздел "Введение. Приближенные числа и действия над ними. Оценка точности вычислений". Это базис, который позволит в дальнейшем не рисовать на индикаторе 5 десятичных разрядов при точности измерения 10%.
|
|
|
|
|
Feb 26 2009, 10:56
|

Местный
  
Группа: Свой
Сообщений: 211
Регистрация: 6-08-07
Из: Приднестровье, Тирасполь
Пользователь №: 29 581

|
Цитата ...диапазон 1300 градусов... ...АЦП (градуировка близка к линейной) позволяет разрешить примерно 1 градус... АЦП это дело наживное. Если мало, всегда добавить внешний можно. Кроме того, никто не говорит, что нужно измерять с одинаковой точностью на всем диапазоне. Флоат, конечно, совершенно необязательно... Цитата ...только после 130 градусов - остаток всегда .75 Прямо всегда? Цитата Но, похоже, для конкретных программистов точность - это сколько знаков после запятой можно вывести на индикатор. Список конкретных программистов мона огласить?
--------------------
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
|
|
|
|
|
Feb 26 2009, 11:07
|

Местный
  
Группа: Свой
Сообщений: 307
Регистрация: 6-02-08
Из: Россия, Екатеринбург
Пользователь №: 34 798

|
хух! в общем все! получился ПИД регулятор - температуру теперь нормально кажет - с десятыми теперь хочу попробывать какой-нибудь алгоритм авто-настройки ПИД коэффициентов... может есть у кого, поделитесь пожалуйста? Вот схемка:
Сообщение отредактировал Ivan Kuznetzov - Feb 26 2009, 11:08
Эскизы прикрепленных изображений
--------------------
Разработчик
|
|
|
|
|
Feb 26 2009, 12:39
|

Местный
  
Группа: Свой
Сообщений: 307
Регистрация: 6-02-08
Из: Россия, Екатеринбург
Пользователь №: 34 798

|
Цитата(Tanya @ Feb 26 2009, 16:45)  Десятые "кажет" - это кажимость. Надо увеличить разрядность вычислений и применить усреднение - будет во много раз лучше. Вы это очень зря поставили такой операционник. Его смещение нуля (2 мв) соответствует 50 градусам. Температурный дрейф не нормирован. Навевает. Схема, простите меня, не выдерживает никакой критики... Входы при нуле, выход... Нет слов. Нарисована, однако, отлично. Это тестовый операционник - в идеале поставлю какую-нибудь "инструменталку" может посоветуете что-нибудь? или схемку подкинете какую-нибудь? а вот насчет усреднения - это интересно! как это сделать?
--------------------
Разработчик
|
|
|
|
|
Feb 26 2009, 14:34
|
Гуру
     
Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883

|
Цитата(Ivan Kuznetzov @ Feb 26 2009, 15:39)  Это тестовый операционник - в идеале поставлю какую-нибудь "инструменталку" может посоветуете что-нибудь? или схемку подкинете какую-нибудь?
а вот насчет усреднения - это интересно! как это сделать? Усреднение - это известная мания программистов. Делается, естественно, программно. Очень интересное, полезное, увлекательное и плодотворное занятие для ума. Можно придумать бесконечное число способов усреднения, а потом бесконечно долго выбирать наилучший. Учтите - для такой сложной математики С слабоват. Только ассемблер. И для тестов не используйте этот Ваш операционник... Возьмите сдвоенный ОУ типа OP07 OP(A)X27 и типовую схему для термопар из даташита на OPA4277 op07 или еще откуда-нибудь. Сами не изобретайте велосипедов. Это только совет. Или аутозеро какое-нибудь. И не придумывайте автонастраивающийся ПИД. Уже придумано. И вредно. И Вам, и ни в чем не повинным пользователям такого продукта. Прикрутите три потенциометра к свободным входам АЦП - будете задавать коэффициенты. Это тоже только советы.
|
|
|
|
|
Feb 26 2009, 15:04
|
Гуру
     
Группа: Участник
Сообщений: 3 834
Регистрация: 14-06-06
Из: Moscow, Russia
Пользователь №: 18 047

|
Цитата(xemul @ Feb 26 2009, 15:07)  "Они не ведают, что творят." На всякий случай: в даташите на АВР рекомендуется, чтобы сопротивление источника сигнала для АЦП не превышало скольки-то там кОм. На данной кажимости это уже не скажется, но, будете смеяться, это ограничение Атмел придумал, исходя из точностных характеристик. На всякий случай - входное сопротивление ADC по даташиту - 100 MOhm. А требование к импедансу источника - исходя из наличия на входе ADC переключаемого конденсатора. Ну так автор совершенно правильно поставил солидный конденсатор на входе, правда, номинал резистора все ж великоват, этак на порядок снизить бы стоит. А вот операционник - да, даже для экспериментов не подходит.
Сообщение отредактировал rx3apf - Feb 26 2009, 15:05
|
|
|
|
|
Feb 26 2009, 19:18
|
Гуру
     
Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883

|
Цитата(haker_fox @ Feb 26 2009, 18:26)  Ой, а зачем такая экзотика?  Я понимаю, что Вы дали только совет, но там же МК. Проще клавиатурку прикрутить, или через UART... Попробуйте сами оба варианта. Лучше на "быстром объекте". Экранчик-то уже есть. Все видно. А три резистора (или два) быстрее и нагляднее. Цитата(rx3apf @ Feb 26 2009, 18:04)  Ну так автор совершенно правильно поставил солидный конденсатор на входе, правда, номинал резистора все ж великоват, этак на порядок снизить бы стоит. И получил большую постоянную времени. Кажется многим, что печка медленная. Не нужно им диференциальную компоненту. Но это только кажется....
|
|
|
|
|
Feb 27 2009, 18:14
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(Tanya @ Feb 26 2009, 22:40)  А для "быстрых" без этой компоненты лучше? Если да, то чем? Печка, это такой объект регулирования, который чистую задержку имеет. Эта задержка от взаимного положения нагревателя и датчика зависит. Если датчик достаточно далёк от нагревателя, то попробуйте в холодной печке на 100% нагреватель включить. Температура как минимум 10 первых секунд не будет изменятся вообще. А на больших печах и минуты. Не будет всё это время никакого сигнала на выходе у дифферециатора. Зато потом появится, когда он уже не нужен и м.б. даже вреден будет. Поэтому практики и считают, что дифферециатор в печах не нужен. Но это они ошибаются. Просто при управлении печкой в идеале нужно эту чистую задержку учитывать. Для этого приходится всякие скользящие средние считать, а реально никто этого не делает. У большинства просто ПИД и всё. По такой схеме качество регулирования ограничено возникновением автоколебаний в малом. В большом-то всё конечно устойчиво. Тут можно много писать, но не знаю интересно ли кому-нибудь это будет?
|
|
|
|
|
Feb 27 2009, 18:44
|
Гуру
     
Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883

|
Цитата(galjoen @ Feb 27 2009, 21:14)  Печка, это такой объект регулирования, который чистую задержку имеет. Эта задержка от взаимного положения нагревателя и датчика зависит. Если датчик достаточно далёк от нагревателя, то попробуйте в холодной печке на 100% нагреватель включить. Температура как минимум 10 первых секунд не будет изменятся вообще. А на больших печах и минуты. Не будет всё это время никакого сигнала на выходе у дифферециатора. Зато потом появится, когда он уже не нужен и м.б. даже вреден будет. Поэтому практики и считают, что дифферециатор в печах не нужен. Но это они ошибаются. Просто при управлении печкой в идеале нужно эту чистую задержку учитывать. Для этого приходится всякие скользящие средние считать, а реально никто этого не делает. У большинства просто ПИД и всё. По такой схеме качество регулирования ограничено возникновением автоколебаний в малом. В большом-то всё конечно устойчиво. Тут можно много писать, но не знаю интересно ли кому-нибудь это будет? Нет у нормальных печек "чистой задержки". Если считать, что скорость звука (фононов) бесконечна. В таком приближении, как только возник градиент температуры, незамедлительно возникает тепловой поток со всеми вытекающими - ненулевой производной температуры во времени. Модель печки - много-много RC-цепочек. С одной стороны генератор - с другой вольтметр. Чистая задержка может быть, к примеру, если вы греете воду, а она перекачивается насосом в то место, где стоит датчик. Чисто теоретически - и там нету.
|
|
|
|
|
Feb 27 2009, 19:21
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(Tanya @ Feb 27 2009, 21:44)  Модель печки - много-много RC-цепочек. А если много-много - это бесконечность, то производная будет нулевая. И задержка тем больше, чем больше теплоёмкость и меньше теплопроводность. Конечно это не чистая задержка. Но можно всё это представить как чистую задержку + одну RC цепочку. И это будет гораздо лучше, чем одна (или в лучшем случае несколько) RC цепочка без задержки, как представляют печку сейчас. А насчёт того, что тепло распостраняется со скоростью звука я конечно согласен, но вот к практике это отношения не имеет. Вот запах - он тоже теоретически со скоростью звука движется. А на практике?
|
|
|
|
|
Feb 27 2009, 19:54
|
Гуру
     
Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883

|
Цитата(galjoen @ Feb 27 2009, 22:21)  А если много-много - это бесконечность, то производная будет нулевая. И задержка тем больше, чем больше теплоёмкость и меньше теплопроводность. Конечно это не чистая задержка. Но можно всё это представить как чистую задержку + одну RC цепочку. И это будет гораздо лучше, чем одна (или в лучшем случае несколько) RC цепочка без задержки, как представляют печку сейчас. А насчёт того, что тепло распостраняется со скоростью звука я конечно согласен, но вот к практике это отношения не имеет. Вот запах - он тоже теоретически со скоростью звука движется. А на практике? Учтите, что при дроблении цепочек нужно дробить и R и C. И производная не будет нулевая... в некотором смысле... А про тепло и запах - Вы абсолютно правы - уравнения диффузии и теплопроводности едины и неотличимы. Только запах, в принципе, несколько быстрее, кажется.
|
|
|
|
|
Feb 27 2009, 20:11
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(Tanya @ Feb 27 2009, 22:54)  Учтите, что при дроблении цепочек нужно дробить и R и C. И производная не будет нулевая... в некотором смысле... Неопределённость типа бесконечность делить на бесконечность. Но если посчитать предел, то там вроде всётаки ноль получается. Хотя спорить не буду, т.к. очень хорошо забыл всё это и вспоминать желания нет. Тем более, что к практике это отношения не имеет.
|
|
|
|
|
Feb 28 2009, 12:41
|

Группа: Участник
Сообщений: 7
Регистрация: 8-11-08
Из: Киев
Пользователь №: 41 471

|
По поводу регуляторов (для информации): http://my.elvisti.com/shov/tune1.htmlА температуру из напряжения термопары я обычно по полиному считал. Мне кажется так проще. Главное ЭДС холодного спая не забывать прибавлять.
|
|
|
|
|
Feb 28 2009, 14:29
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(Tanya @ Feb 28 2009, 16:32)  ... И создает иллюзии. ... +1 На мой взгляд это самое плохое в данном приложении ПИД регулятора. На самом-то деле для печки он плохо подходит. А его используют и ещё гордятся - у меня ПИД...
|
|
|
|
|
Mar 3 2009, 05:09
|

Местный
  
Группа: Свой
Сообщений: 307
Регистрация: 6-02-08
Из: Россия, Екатеринбург
Пользователь №: 34 798

|
Цитата(galjoen @ Feb 28 2009, 19:29)  +1 На мой взгляд это самое плохое в данном приложении ПИД регулятора. На самом-то деле для печки он плохо подходит. А его используют и ещё гордятся - у меня ПИД... а какой ПИД алгоритм тогда лучше использовать?
--------------------
Разработчик
|
|
|
|
|
Mar 3 2009, 10:21
|

Местный
  
Группа: Свой
Сообщений: 307
Регистрация: 6-02-08
Из: Россия, Екатеринбург
Пользователь №: 34 798

|
Цитата(Tanya @ Mar 3 2009, 15:01)  ПИД - не алгоритм, а закон управления. Может быть реализован аналоговым способом, а может жить в контроллере. А может и там, и там. ну если он живет в контроллере (а у меня так) то это уже алгоритм, привожу его ниже: Код float themp; //входная температура, регулируемый параметр, размерность - градусы long thempSet; //уставка температуры, размерность - градусы float errThemp[3]; //массив ошибок регулятора
#define zoneProp 1 //зона пропорциональности, размерность - градусы #define tauInt 4 //постоянная интегрирования, размерность - секунды #define tauDiff 1 //постоянная дифференцирования, размерность - секунды #define tauQuant 0.05 //период квантования (реальный!!! период запуска функции регулятора), размерность - секунды #define tauDiffFilter 5 //как бы кол-во усредняемых отсчётов Д-составляющей, //не стоит увлекаться и делать это число слишком большим. #define tauOutFilter 5 //как бы кол-во усредняемых отсчётов полного выходного сигнала, аналогично.
float OutPID; //выходное значение ПИД регулятора float KoeffNormOut; //нормализовочный коэффициент float Differential=0; float Integral; float tmpReal;
//******************************************************************************** *************** // ПИД алгоритм //******************************************************************************** *************** errThemp[2] = errThemp[1]; errThemp[1] = errThemp[0]; //******************************************************************* // Нормированная к отношению MaxOut/zoneProp ошибка регулирования для прямого регулятора. // т.е. увеличивается температура - увеличивается выходной сигнал. // режим - охлаждение нагревателя, обогрев. errThemp[0] = (themp - thempSet) * KoeffNormOut; // ошибка для обратного регулятора. // режим - нагрев охладителя, охлаждение. // errThemp[0] = (thempSet - themp) * KoeffNormOut; // вычисление и простейшая фильтрация Д-составляющей с предварительным усреднением по двум отсчётам Differential += (((errThemp[0] - errThemp[2]) * tauDiff * 0.5) - Differential) / tauDiffFilter;
// без предварительного усреднения // Differential += (((errThemp[0] - errThemp[1]) * tauDiff) - Differential) / tauDiffFilter; // вычисление И-составляющей методом трапеций с предварительным усреднением по двум отсчётам Integral += (((errThemp[0] + 2*errThemp[1] + errThemp[2]) * tauQuant * 0.25) / tauInt);
// без предварительного усреднения // Integral += (((errThemp[0] + errThemp[1]) * tauQuant * 0.5) / tauInt); // Ограничитель И-составляющей if(Integral > (float)MaxOut) Integral = (float)MaxOut; else if(Integral < (float)MinOut) Integral = (float)MinOut; // Полный сигнал tmpReal = errThemp[0] + Integral + Differential / tauQuant; // Ограничитель полного входного сигнала if(tmpReal > (float)MaxOut) tmpReal = (float)MaxOut; else if(tmpReal < (float)MinOut) tmpReal = (float)MinOut; OutPID += (tmpReal - OutPID) / tauOutFilter; // фильтрация полного выходного сигнала //******************************************************************************** *************** // Конец ПИД алгоритма //******************************************************************************** ***************
--------------------
Разработчик
|
|
|
|
|
Mar 3 2009, 11:21
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(Tanya @ Mar 3 2009, 13:39)  Я бы (почти) все в целых. Частоту выборки (вычислений) привязала бы к сетевой. Тогда сетевая наводка убирается - ослабляется. А константы надо подбирать экспериментально. Непонятно, что потом - как и чем управляет этот ПИД. Согласен, что лучше привязаться к сети, но можно хотя бы кратно 10 милисекундам выборку сделать. 2 Ivan Kuznetzov А вообще чтобы печкой эффективно управлять, по моему мнению, нужно скользящие средние считать на подводимую мощность и на температуру. Время, за которое эти скользящие средние считаются, примерно равно удвоенной задержке вносимой печкой д.б. Эту задержку определить можно как время через которое, после включения нагревателя на 100%, температура реально подниматься начнёт. Я в своё время т.о. решил задачу о том сколько тепла в объект уходило. Т.е. вычитал из всего тепла, тепло ушедшее на нагрев самого нагревателя и в окружающую среду. Даже более того, т.о. можно узнать кое-что о нагреваемом объекте. Его теплоёмкость и теплопроводность. Но это всё оффтоп. По теме. Регулировать то температуру по такой схеме значительно сложнее (программно), чем это делает стандартный ПИД. Хотя качество регулирования конечно лучше получается. А м.б. у вас интерес из-за усложнения уже пропал? Если нет - задавайте вопросы.
|
|
|
|
|
Mar 3 2009, 11:52
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(Tanya @ Mar 3 2009, 14:35)  Сложнее... проще... Это относительно. Надо учитывать "мгновенную" электрическую мощность, подавая ее в контур обратной связи. Тогда управление становится "натуральным" - по мощности... или интегралу мощности - энергии. Точность, естественно, увеличивается. А если еще внешнюю температуру учитывать... Конечно "натуральное" управление лучше. Установившаяся температура превышает тем-ру окружающей среды пропорционально подведённой мощности. Только вот есть закавыка. Чтобы динамику сделать - приходится печку дифференциальными уравнениями описываить. И решать их в реалтайме. Вот об этом усложнении я говорил.
|
|
|
|
|
Mar 3 2009, 12:22
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(Tanya @ Mar 3 2009, 15:06)  Ну... Вы усложняете. Пид работает (должен) только в стационарном... .... Для того, чтобы съэкономить электроэнергию и повысить производительность желательно (если техпроцесс позволяет) объекты в печи лишнее время не держать. Т.е. нагрелся он там до нужной т-ры - следующий пошёл. В таких условиях у печи фактически не будет стационарного режима. А насчёт увеличения кол-ва датчиков я согласен. Ещё очень полезно 2 датчика недалеко друг от поставить чтобы тепловой поток можно мерять было. Нужно только место установки правильно подобрать.
|
|
|
|
|
Mar 7 2009, 16:25
|

Местный
  
Группа: Свой
Сообщений: 307
Регистрация: 6-02-08
Из: Россия, Екатеринбург
Пользователь №: 34 798

|
Цитата(Tanya @ Mar 3 2009, 17:06)  Ну... Вы усложняете. Пид работает (должен) только в стационарном или квазистационарном режиме (когда задатчик медленно меняется). Иначе - это управление "по модели", о чем Вы и пишите. А если дверцу открывать и содержимое менять... Так это другая задача. Можно еще несколько усложнить (но улучшить) - несколько датчиков - у нагревателя и в центре печи... Управление по "модели" я тоже хочу реализовать, а именно: регулятор будет иметь связь с кампой по USB, в кампе будет прога на ЛабВью в которой пользователь чертит график требуемой температуры (ну или набор значений SETPOINT) - а ПИД регулятор будет работать по этому графику... Цитата(Tanya @ Mar 3 2009, 15:39)  Я бы (почти) все в целых. Частоту выборки (вычислений) привязала бы к сетевой. Тогда сетевая наводка убирается - ослабляется. А константы надо подбирать экспериментально. Непонятно, что потом - как и чем управляет этот ПИД. Для настройки П И Д и других констант у меня предусмотрена отдельная менюшка, в которой каждый коэффициент в процессе работы можно натыкать кнопочками, а затем сохранить в EEPROM
--------------------
Разработчик
|
|
|
|
|
Mar 7 2009, 17:28
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 24-11-07
Пользователь №: 32 645

|
а как насчет такой микросхемы как DS75? В связке с каким нибудь ацп(лучше 16 бит) получаем очень даже неплохие характеристики. Да и интерфейс легок, и2ц как никак
|
|
|
|
|
Mar 8 2009, 18:11
|

Местный
  
Группа: Свой
Сообщений: 307
Регистрация: 6-02-08
Из: Россия, Екатеринбург
Пользователь №: 34 798

|
Цитата(ведущий_специалист @ Mar 7 2009, 22:28)  а как насчет такой микросхемы как DS75? В связке с каким нибудь ацп(лучше 16 бит) получаем очень даже неплохие характеристики. Да и интерфейс легок, и2ц как никак вот это неплохой вариант! тем более существующий LM358 нужен был лишь для тестов... Уважаемые Форумчане! если у кого завалялся алгоритм авто-настройки ПИД регулятора - поделитесь пожалуйста... охота все-таки попробывать на реальной печке - что он покажет - какие коэффициенты выдаст?
--------------------
Разработчик
|
|
|
|
|
Mar 9 2009, 08:23
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 24-11-07
Пользователь №: 32 645

|
ds75 нужна для компенсации по температуре в месте соединения термопары и прибора. а ацп шку все таки ставь 16 битную
|
|
|
|
|
Apr 15 2009, 12:30
|
Участник

Группа: Новичок
Сообщений: 21
Регистрация: 10-04-09
Пользователь №: 47 456

|
А нет ли исходников на ассемблере с градуровочными характеристиками?
|
|
|
|
|
Apr 17 2009, 18:25
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 17-04-09
Из: UA
Пользователь №: 47 867

|
Цитата(galjoen @ Mar 3 2009, 14:52)  Конечно "натуральное" управление лучше. Установившаяся температура превышает тем-ру окружающей среды пропорционально подведённой мощности. Только вот есть закавыка. Чтобы динамику сделать - приходится печку дифференциальными уравнениями описываить. И решать их в реалтайме. Вот об этом усложнении я говорил. Читал, что управление на принципах нечеткой логики творит чудеса, заменяя кучу дифуравнений. Пытался перевести управление муфельной печкой на "фаззи", но не одолел. Вам не приходилось этим заниматься, или слухи о чудесах преувеличены?
|
|
|
|
|
Apr 21 2009, 09:36
|
Гуру
     
Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883

|
Цитата(Ivan Kuznetzov @ Apr 21 2009, 13:18)  3) переход через 0 ловлю внутренним компаратором меги 4) мощность нагревателя регулирую либо кнопочками +/-. либо по закону ПИД исходя из заданной температуры и измерянной 5) 3 ПИД коэффициента (пока нашел опытным путем для моей печки) 6) Два режима управления симистором фазоимпульсный и по Брезенхему Осталось присобачить нормальный АЦП вместо меговского и датчик холодного спая.
Кто что использует в качестве АЦП для измерения термопарой? Выбросьте фазовое управление, если у Вас печка весит больше килограмма. Если будете учитывать поданную мощность, будет лучше. Ацп лучше интегрирующий за N периодов сети. А что, у Вашего контроллера плохой АЦП? Вам какая точность-то нужна?
|
|
|
|
|
Apr 21 2009, 16:32
|
Знающий
   
Группа: Свой
Сообщений: 841
Регистрация: 10-05-07
Из: Чебоксары (Россия)
Пользователь №: 27 640

|
Цитата(akken @ Apr 17 2009, 22:25)  Читал, что управление на принципах нечеткой логики творит чудеса, заменяя кучу дифуравнений. Пытался перевести управление муфельной печкой на "фаззи", но не одолел. Вам не приходилось этим заниматься, или слухи о чудесах преувеличены? Нечёткой логикой не занимался. Но весь мой опыт подсказывает, что чудес не бывает. В случае с печкой времени для рассчётов вполне достаточно. Да и не сильно сложные эти рассчёты - в основном вычисление скользящего среднего (ползучка) и помножение/сложение. А вот с ОЗУ может возникнуть проблемма (на АВР). Т.к. приходится организовывать достаточно большие кольцевые буфера. Как минимум для замеренной температуры и подведённой мощности. А реально - ещё пару таких-же буферов для внутренних переменных (чтоб каждый раз не считать).
|
|
|
|
|
Apr 22 2009, 08:50
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 17-04-09
Из: UA
Пользователь №: 47 867

|
Цитата(galjoen @ Apr 22 2009, 00:10)  Как это ни смешно, но попробовав, я пришёл к выводу, что печка оказывается весьма сложный в управлении объект  . Во всяком случае гораздо сложнее следящего электропривода. Особенно, если поставлена задача регулировать +/- 1 градус в диапазоне 50-900*С с 2,5 квт нагревателем. При заданной температуре 50*С малейшая погрешность при определении первой порции энергии забрасывала печку в аут на пол дня. Промышленный "Овен" в режиме ПИД начинал приемлемо регулировать только с 250*. Так что насчет сложности согласен на все 200%.
|
|
|
|
|
Apr 22 2009, 10:44
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 17-04-09
Из: UA
Пользователь №: 47 867

|
Цитата(Oldring @ Apr 22 2009, 12:40)  Про квадратичную зависимость мощности от напряжения, наверное, забыли? И про сильно ограниченную скорость изменения температуры, вызванную ограничением мощности нагревателя, как сверху, так и снизу?  Квадратичная зависимость меня не касалась, так как стоял контактор и стеклянный стержень в качестве измерителя-переключателя. Нужно было заменить только стержень на электронику, в качестве которой принесли стандартный регулятор известной фирмы с "академическим" ПИД алгоритмом. Вот эта комбинация и упала ниже плинтуса при попытке дежать +50* при темп. воздуха +28* Цитата(Tanya @ Apr 22 2009, 12:43)  Ужас какой! Теперь боюсь духовку включать. Там примерно такая мощность. Вот такая моя нечеткая логика. А печка, действительно, сложнее привода - пространственный объект - степеней свободы больше, уравнения с косыми производными... 1. а у Вас настоящий термометр в духовке, или стрелочка на "спиральке"? 2. а 50*С пробовали установить поддерживать +/- 1?
|
|
|
|
|
Apr 22 2009, 11:46
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 17-04-09
Из: UA
Пользователь №: 47 867

|
Цитата(Oldring @ Apr 22 2009, 13:51)  Удивительного в этом ничего нет. Наверняка этот регулятор не рассчитан на такие жесткие условия регулирования - на уровне менее 2.5% от максимальной мощности  Нельзя вычитать из заводской инструкции ничего похожего на ограничение минимальной мощности, только есть об "использование усовершенствованной математической модели ПИД#регулятора" . Поэтому все претензии были ко мне. Цитата(Tanya @ Apr 22 2009, 13:53)  Печка немецкая. Держит 40 градусов - тесто подходит, не варится... Температуру цифрами показывает. Все нормально там, только не знаю, какой термометр. А с платиновым термометром и "академическим" ПИД алгоритмом можно держать 50 градусов... до микроградусов при наружной тоже около 30. Не пробовали проверить температуру "независимым" термометром?А то ведь встроенный знает, сколько должно быть Согласен, что держать 0,1* можно на 40, а что будет на 900*, если оставить те же настройки.
Сообщение отредактировал akken - Apr 22 2009, 11:50
|
|
|
|
|
Apr 22 2009, 11:56
|

Гуру
     
Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874

|
Цитата(akken @ Apr 22 2009, 15:46)  Нельзя вычитать из заводской инструкции ничего похожего на ограничение минимальной мощности, только есть об "использование усовершенствованной математической модели ПИД#регулятора" . Поэтому все претензии были ко мне. Ну, методы назначение козлов отпущения - это отдельная технология, не связанная с методами регулированием печек.  В конце концов, не заказчик же твой виноват, который принял самостоятельное решение поставить стандартный регулятор, не подумав заранее о такой недостойной его вещи, как "диапазон регулирования" и вообще о применимости конкретного регулятора к конкретной задаче. Взялся-то сам зачем за его настройку не прикинув заранее физику? Цитата(akken @ Apr 22 2009, 15:46)  Согласен, что держать 0,1* можно на 40, а что будет на 900*, если оставить те же настройки. Не думаю, что там можно выставить 900
--------------------
Пишите в личку.
|
|
|
|
|
Apr 22 2009, 12:12
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 17-04-09
Из: UA
Пользователь №: 47 867

|
[quote name='Oldring' date='Apr 22 2009, 14:56' post='582395']
Взялся-то сам зачем за его настройку не прикинув заранее физику?
Начальнык показал каталог фирмы на глянцевой бумаге и попросил не умничать. Через 2 дня начали делать самодельный.
|
|
|
|
|
Apr 22 2009, 13:06
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 17-04-09
Из: UA
Пользователь №: 47 867

|
Цитата(Oldring @ Apr 22 2009, 15:18)  Два дня на осознание ошибки - это не много.  Тяжело бороться со стойким предрассудком, что отрицательная ОС решает все вопросы Стоит только на 20 секунд открыть дверцу в печке при 300* и настроенный идеально ПИД регулятор превращается в исчадие ада
|
|
|
|
|
Apr 22 2009, 13:12
|

Гуру
     
Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874

|
Цитата(Tanya @ Apr 22 2009, 16:56)  Стенок наружных три - как у всякого цилиндра. ... А внутри матрешка, да. Примерно тройная. Да уж, про то, что стенок на самом деле девять - я не догадался Цитата(akken @ Apr 22 2009, 17:06)  Стоит только на 20 секунд открыть дверцу в печке при 300* и настроенный идеально ПИД регулятор превращается в исчадие ада  Ну а датчик температуры что меряет? Температуру воздуха в печке или температуру стенок печки? Если воздуха - тогда понятно почему "исчадие ада". Оторвите датчик температуры - и ни один регулятор ничего стабиллизировать не сможет. PS Да, тяжело обычно бороться с заблуждением, что любую проблему можно решить на коленке за один человеко-день методом тыка.
--------------------
Пишите в личку.
|
|
|
|
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|