Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как сделать вычисление значения температуры по градуировочной таблице термопары?
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
Страницы: 1, 2, 3, 4
Ivan Kuznetzov
Как сделать вычисление значения температуры по градуировочной таблице термопары?

Пишу прогу на сях.
К примеру, измеряем напряжение с термопары, усиливаем его (с известным Ку) и подаем на вход ADC0 атмеги - там делим на Ку и получаем милливольты;
есть также градуировочная таблица для термопары вида:

float gradtbl[131]={0 , 0.40 , 0.80 , 1.20 ...... и т.д. 131 значение


как сделать пересчет значения миливольт в градусы?
Petka
Цитата(Ivan Kuznetzov @ Feb 25 2009, 13:37) *
Как сделать вычисление значения температуры по градуировочной таблице термопары?

Пишу прогу на сях.
К примеру, измеряем напряжение с термопары, усиливаем его (с известным Ку) и подаем на вход ADC0 атмеги - там делим на Ку и получаем милливольты;
есть также градуировочная таблица для термопары вида:

float gradtbl[131]={0 , 0.40 , 0.80 , 1.20 ...... и т.д. 131 значение


как сделать пересчет значения миливольт в градусы?

какой тип термопары?
Tanya
Цитата(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))
Можно многочленом сразу.
Не забудьте про температуру опорного спая.
Только при чем тут АВР и С?
MrYuran
Цитата(Tanya @ Feb 25 2009, 14:15) *
Только при чем тут АВР и С?

Ну как же! rolleyes.gif
Датчик-то к АВР подключается, а программа на си...
_Pasha
Цитата(Ivan Kuznetzov @ Feb 25 2009, 14:37) *
Пишу прогу на сях.

smile.gif На тех же сях берете и составляете другую "прогу", но уже для компа, в которой все вышесказанное, только не 
Цитата
Переделайте в микровольты (или десятки микровольт) - будут целые.
- это слишком общО - сразу пересчет в ожидаемые реальные показания (N=1024*U/Uref) выводите хоть куда - хоть на экран, и потом забираете данные командной строкой типа create.exe >>table.inc
xemul
Начните лучше с требуемых точностных характеристик. Может статься, что с учетом используемой элементной базы будет достаточно аппроксимировать характеристику термопары одной прямой (или парой прямых) без ущерба для точности прибора.
Без плавучки, имхо, в этой задаче можно легко обойтись. Nadc = Nadc_max*(Kу*Uт)/Uref. Вот и посчитайте на бумажке зависимость Nadc(T).
Goodefine
Как вариант:
Задаем массив, разбив участки зависимости на прямые (относительно)
//условно:
Код
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];

Это примерно, но принцип понятен, думаю...
_Pasha
Цитата(Goodefine @ Feb 25 2009, 16:26) *
Расстояние между индексами 100мкв, например, по таблице

Куда удобнее расстояние делать в 1 попугай АЦП. Нам-то, суровым авр-щикам crying.gif
Ivan Kuznetzov
Цитата(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];

Это примерно, но принцип понятен, думаю...

последняя формула точно так будет выглядеть или это пример?
Goodefine
Цитата
Куда удобнее расстояние делать в 1 попугай АЦП. Нам-то, суровым авр-щикам crying.gif
Зато так удобнее передрать зависимость ЭДС от температуры из паспорта термопары. Не принципиально, в общем... Но потом Ваш вариант, безусловно, приятней smile.gif
Цитата
последняя формула точно так будет выглядеть или это пример?

Смысл в том что интерполируется число между двумя значениями из таблицы, определенными измеренным напряжением в мкв (загрубленным в "расстояние между значениями по таблице" раз). На практике, конечно, надо поотлаживать этот кусок (остатки, правильный порядок и т.д.)...
Ivan Kuznetzov
Цитата(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" градусов - в чем тут могут быть грабли?
crying.gif
_Pasha
Цитата(Ivan Kuznetzov @ Feb 25 2009, 16:46) *
когда на входе ADC ноль то температуру кажет " - 198" градусов - в чем тут могут быть грабли?
crying.gif

И зачем так плакать? Добавили дополнительную проверку на ноль - и делов-то. У Вас индекс ссылается куда? gradtbl[i - 1].. не надо матюков -  и так видно smile.gif
Goodefine
Зачем здесь флоат не понятно. Видно (из табл), что больше 52430 мкв Вам не понадобится. Т.е. инта для переменной напряжения хватит. Далее, обычно вместе с таблицей указывается полином зависимости. В том же экселе по нему можно найти ряд температур с шагом, скажем 1000 мкв. В этом случае температурный массив будет состоять где-то из 53 значений типа инт (если домножить на 10 - чтоб с десятыми и без флоат). Потом похожим (только учесть что шаг 1000 мкв) способом легко и относительно быстро найти искомую температуру с точностью до десятых, взяв остаток от которой найдем сами десятые в НЕ флоат...
Ivan Kuznetzov
Цитата(_Pasha @ Feb 25 2009, 17:53) *
И зачем так плакать? Добавили дополнительную проверку на ноль - и делов-то. У Вас индекс ссылается куда? gradtbl[i - 1].. не надо матюков -  и так видно smile.gif

я так и не понял где ошибка-то?
_Pasha
Цитата(Ivan Kuznetzov @ Feb 25 2009, 17:12) *
я так и не понял где ошибка-то?


Код
themp = 0;

for (i = 1; i < 132; i++)



дальше по тексту. А привиделось нечто другое...
Goodefine
Если по Вашему (с флоат), то проще примерно так:
Код
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; //окончательное значение температуры с десятыми


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


а можно Ваш исходник посмотреть, пожалуйста?
demiurg_spb
Цитата(Ivan Kuznetzov @ Feb 26 2009, 07:59) *
а можно Ваш исходник посмотреть, пожалуйста?
Нет. Это уж как-нибудь самиsmile.gif
AlexU
Цитата(Ivan Kuznetzov @ Feb 25 2009, 13:37) *
float gradtbl[131]={0 , 0.40 , 0.80 , 1.20 ...... и т.д. 131 значение
...
как сделать пересчет значения миливольт в градусы?


Для ТХА, ТХК 20..200 град/0.5 хватило полинома второй степени. ХС на другом входе АЦП.
Сергей К
По поводу компенсации: я вот думаю, можно ли сразу перевести ЭДС термопары в градусы и затем к ним прибавить температуру окружающей среды (окружающая среда -30...+80 градусов Цельсия максимум, т.е. на улице).
Или же нужно сначала все в микровольты переводить, там делать компенсацию и лиш затем переводить в градусы (как в учебниках)? Точности в пару градусов достаточно.

Измеряю температуру 3мя каналами AD7792, темерературу холодного спая - внутреним датчиком AD7792 (вся конструкция в металлической коробке, куда приходят концы термопар)
Ivan Kuznetzov
Goodefine

По Вашему примеру все работает хорошо - но десятых долей нету почему-то...

В общем сейчас у меня следящий ПИД регулятор на симистор работает
Печка сопротивления + ХА термопара в ней
девайс держит температуру +/- 2 градус....
только десятые доли не показывает - а хотелось бы....

О девайсе вкратце:
1) атмега32, дисплей 20х4
2) полная развязка от сети (по питанию - транс, по управлению симистором - оптрон)
3) переход через 0 ловлю внутренним компаратором меги
4) мощность нагревателя регулирую либо кнопочками +/-. либо по закону ПИД исходя из заданной температуры и измерянной
5) ПИД коэффициенты еще толком не настраивал, есть зона пропорциональности ит.д.
6) Два режима управления симистором фазоимпульсный и по Брезенхему
7) есть возможность встречно-параллельного включения двух тиристоров и управление ими с разных ног меги через развязывающие трансики
Если проект получится - выложу все как есть
Goodefine
Цитата
...но десятых долей нету почему-то...

Возможно, теряется точность. Попробуйте чуть иначе:
Код
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]);

Кстати, Ваш код вывода на дисплей можно увидеть?
Ivan Kuznetzov
Goodefine

Отлично все заработало! Спасибо!

код для лсиди выложу - он у меня самописный - кодевижновский меня не устраивает

в моем коде:
1) 4-х проводный интерфейс
2)можно все ноги дисплея переназначать
3) на RW я забил и посадил его на землю - нафига мне с дисплея читать?? biggrin.gif

...только после 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,
Tanya
Цитата(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 градуса, нет смысла дробить интервал.
б) в таблицу вместо милливольтов записать целые числа - соответствующие коды АЦП, в другую - соответствующую температуру.
Или полином.
xemul
Цитата(Tanya @ Feb 26 2009, 11:51) *
По Вашей таблице видно, что у Вас диапазон 1300 градусов, а в таблице числа в милливольтах.
Разрядность Вашего АЦП (градуировка близка к линейной) позволяет разрешить примерно 1 градус (еще точнее - 1.3). Таблица через 10 градусов. При таких обстоятельствах можно (или нужно)
а) уменьшить таблицу в два - три - четыре... раза. Может быть, неравномерно - постройте график - там, где отклонение от прямой будет меньше 0.5 градуса, нет смысла дробить интервал.
б) в таблицу вместо милливольтов записать целые числа - соответствующие коды АЦП, в другую - соответствующую температуру.
Или полином.

Зачем Вы так изощренно издеваетесь над программистами?smile.gif Любой контроллер или процессор и сам должен все сделать.
Я предполагаю, что автор использует АЦП АВР с внутренней опорой (которая по даташиту имеет точность +-10%) и вряд ли эту опору калибрует. Исходя из точности опоры я предложил кривую термопары аппроксимировать прямой (парой, тройкой,... - опять же исходя из требуемой и достижимой точности) и забить на всякие плавучие таблицы.
Но, похоже, для конкретных программистов точность - это сколько знаков после запятой можно вывести на индикатор.
Ivan Kuznetzov
Цитата(xemul @ Feb 26 2009, 14:27) *
Зачем Вы так изощренно издеваетесь над программистами?smile.gif Любой контроллер или процессор и сам должен все сделать.
Я предполагаю, что автор использует АЦП АВР с внутренней опорой (которая по даташиту имеет точность +-10%) и вряд ли эту опору калибрует. Исходя из точности опоры я предложил кривую термопары аппроксимировать прямой и забить на всякие плавучие таблицы.
Но, похоже, для конкретных программистов точность - это сколько знаков после запятой можно вывести на индикатор.

совершенно верно! использую внутренний опорный источник МК на 2.5 вольт
xemul
Цитата(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%.
Goodefine
Цитата
...диапазон 1300 градусов...
...АЦП (градуировка близка к линейной) позволяет разрешить примерно 1 градус...

АЦП это дело наживное. Если мало, всегда добавить внешний можно. Кроме того, никто не говорит, что нужно измерять с одинаковой точностью на всем диапазоне. Флоат, конечно, совершенно необязательно...
Цитата
...только после 130 градусов - остаток всегда .75

Прямо всегда?
Цитата
Но, похоже, для конкретных программистов точность - это сколько знаков после запятой можно вывести на индикатор.

Список конкретных программистов мона огласить?
Ivan Kuznetzov
хух! в общем все! получился ПИД регулятор - температуру теперь нормально кажет - с десятыми
теперь хочу попробывать какой-нибудь алгоритм авто-настройки ПИД коэффициентов...
может есть у кого, поделитесь пожалуйста?

Вот схемка:
xemul
Цитата(Goodefine @ Feb 26 2009, 13:56) *
Список конкретных программистов мона огласить?

Никаких персоналий. Имелось в виду "чиста канкретных", пишуших идеальные программы, работающие в идеальных коробочках и в идельном мире.
Tanya
Цитата(Ivan Kuznetzov @ Feb 26 2009, 14:07) *
хух! в общем все! получился ПИД регулятор - температуру теперь нормально кажет - с десятыми
теперь хочу попробывать какой-нибудь алгоритм авто-настройки ПИД коэффициентов...
может есть у кого, поделитесь пожалуйста?

Вот схемка:

Десятые "кажет" - это кажимость. Надо увеличить разрядность вычислений и применить усреднение - будет во много раз лучше.
Вы это очень зря поставили такой операционник. Его смещение нуля (2 мв) соответствует 50 градусам. Температурный дрейф не нормирован. Навевает. Схема, простите меня, не выдерживает никакой критики... Входы при нуле, выход... Нет слов. Нарисована, однако, отлично.
xemul
"Они не ведают, что творят."
На всякий случай: в даташите на АВР рекомендуется, чтобы сопротивление источника сигнала для АЦП не превышало скольки-то там кОм. На данной кажимости это уже не скажется, но, будете смеяться, это ограничение Атмел придумал, исходя из точностных характеристик.
Ivan Kuznetzov
Цитата(Tanya @ Feb 26 2009, 16:45) *
Десятые "кажет" - это кажимость. Надо увеличить разрядность вычислений и применить усреднение - будет во много раз лучше.
Вы это очень зря поставили такой операционник. Его смещение нуля (2 мв) соответствует 50 градусам. Температурный дрейф не нормирован. Навевает. Схема, простите меня, не выдерживает никакой критики... Входы при нуле, выход... Нет слов. Нарисована, однако, отлично.


Это тестовый операционник - в идеале поставлю какую-нибудь "инструменталку"
может посоветуете что-нибудь? или схемку подкинете какую-нибудь?

а вот насчет усреднения - это интересно! как это сделать?
Tanya
Цитата(Ivan Kuznetzov @ Feb 26 2009, 15:39) *
Это тестовый операционник - в идеале поставлю какую-нибудь "инструменталку"
может посоветуете что-нибудь? или схемку подкинете какую-нибудь?

а вот насчет усреднения - это интересно! как это сделать?

Усреднение - это известная мания программистов. Делается, естественно, программно. Очень интересное, полезное, увлекательное и плодотворное занятие для ума.
Можно придумать бесконечное число способов усреднения, а потом бесконечно долго выбирать наилучший.
Учтите - для такой сложной математики С слабоват. Только ассемблер.

И для тестов не используйте этот Ваш операционник...
Возьмите сдвоенный ОУ типа OP07 OP(A)X27 и типовую схему для термопар из даташита на OPA4277 op07 или еще откуда-нибудь. Сами не изобретайте велосипедов. Это только совет.
Или аутозеро какое-нибудь.
И не придумывайте автонастраивающийся ПИД. Уже придумано. И вредно. И Вам, и ни в чем не повинным пользователям такого продукта. Прикрутите три потенциометра к свободным входам АЦП - будете задавать коэффициенты. Это тоже только советы.
rx3apf
Цитата(xemul @ Feb 26 2009, 15:07) *
"Они не ведают, что творят."
На всякий случай: в даташите на АВР рекомендуется, чтобы сопротивление источника сигнала для АЦП не превышало скольки-то там кОм. На данной кажимости это уже не скажется, но, будете смеяться, это ограничение Атмел придумал, исходя из точностных характеристик.

На всякий случай - входное сопротивление ADC по даташиту - 100 MOhm. А требование к импедансу источника - исходя из наличия на входе ADC переключаемого конденсатора. Ну так автор совершенно правильно поставил солидный конденсатор на входе, правда, номинал резистора все ж великоват, этак на порядок снизить бы стоит. А вот операционник - да, даже для экспериментов не подходит.
haker_fox
Цитата(Tanya @ Feb 26 2009, 22:34) *
Прикрутите три потенциометра к свободным входам АЦП - будете задавать коэффициенты.

Ой, а зачем такая экзотика? 1111493779.gif Я понимаю, что Вы дали только совет, но там же МК. Проще клавиатурку прикрутить, или через UART...
Tanya
Цитата(haker_fox @ Feb 26 2009, 18:26) *
Ой, а зачем такая экзотика? 1111493779.gif Я понимаю, что Вы дали только совет, но там же МК. Проще клавиатурку прикрутить, или через UART...

Попробуйте сами оба варианта. Лучше на "быстром объекте". Экранчик-то уже есть. Все видно.
А три резистора (или два) быстрее и нагляднее.

Цитата(rx3apf @ Feb 26 2009, 18:04) *
Ну так автор совершенно правильно поставил солидный конденсатор на входе, правда, номинал резистора все ж великоват, этак на порядок снизить бы стоит.

И получил большую постоянную времени. Кажется многим, что печка медленная. Не нужно им диференциальную компоненту. Но это только кажется....
Designer56
Цитата(Tanya @ Feb 27 2009, 00:18) *
И получил большую постоянную времени. Кажется многим, что печка медленная. Не нужно им диференциальную компоненту. Но это только кажется....

Она потому и нужна, что печка медленная...Если, конечно, хочется приличное качество регулирования.
Tanya
Цитата(Designer56 @ Feb 26 2009, 22:25) *
Она потому и нужна, что печка медленная...Если, конечно, хочется приличное качество регулирования.

А для "быстрых" без этой компоненты лучше? Если да, то чем?

Нет, не потому. И медленность - понятие относительное. Живет в головах.
Designer56
Для быстрых можно проинтегрировать, при нужде...Понятие- относительное, но...большие постоянные времены разомкнутой системы порождают медленное установление замкнутой. Кстати, на пракатике операторы любят выключать контура ОС ПИД- регулятроров и крутить вручную...У всех, кроме печей. Или почти у всех.
Ivan Kuznetzov
с конденсатором С2 на схеме ошибка- в реали стоит 100 нанофарад
Tanya
Цитата(Ivan Kuznetzov @ Feb 27 2009, 15:47) *
с конденсатором С2 на схеме ошибка- в реали стоит 100 нанофарад


Лучше бы не конденсатор, а резистор уменьшить сильно. А фильтр на входе нужен, а не на выходе, чтобы операционник не зашкаливал от наводки (помехи).
galjoen
Цитата(Tanya @ Feb 26 2009, 22:40) *
А для "быстрых" без этой компоненты лучше? Если да, то чем?

Печка, это такой объект регулирования, который чистую задержку имеет. Эта задержка от взаимного положения нагревателя и датчика зависит. Если датчик достаточно далёк от нагревателя, то попробуйте в холодной печке на 100% нагреватель включить. Температура как минимум 10 первых секунд не будет изменятся вообще. А на больших печах и минуты. Не будет всё это время никакого сигнала на выходе у дифферециатора. Зато потом появится, когда он уже не нужен и м.б. даже вреден будет. Поэтому практики и считают, что дифферециатор в печах не нужен. Но это они ошибаются. Просто при управлении печкой в идеале нужно эту чистую задержку учитывать. Для этого приходится всякие скользящие средние считать, а реально никто этого не делает. У большинства просто ПИД и всё. По такой схеме качество регулирования ограничено возникновением автоколебаний в малом. В большом-то всё конечно устойчиво. Тут можно много писать, но не знаю интересно ли кому-нибудь это будет?
Tanya
Цитата(galjoen @ Feb 27 2009, 21:14) *
Печка, это такой объект регулирования, который чистую задержку имеет. Эта задержка от взаимного положения нагревателя и датчика зависит. Если датчик достаточно далёк от нагревателя, то попробуйте в холодной печке на 100% нагреватель включить. Температура как минимум 10 первых секунд не будет изменятся вообще. А на больших печах и минуты. Не будет всё это время никакого сигнала на выходе у дифферециатора. Зато потом появится, когда он уже не нужен и м.б. даже вреден будет. Поэтому практики и считают, что дифферециатор в печах не нужен. Но это они ошибаются. Просто при управлении печкой в идеале нужно эту чистую задержку учитывать. Для этого приходится всякие скользящие средние считать, а реально никто этого не делает. У большинства просто ПИД и всё. По такой схеме качество регулирования ограничено возникновением автоколебаний в малом. В большом-то всё конечно устойчиво. Тут можно много писать, но не знаю интересно ли кому-нибудь это будет?

Нет у нормальных печек "чистой задержки". Если считать, что скорость звука (фононов) бесконечна. В таком приближении, как только возник градиент температуры, незамедлительно возникает тепловой поток со всеми вытекающими - ненулевой производной температуры во времени. Модель печки - много-много RC-цепочек. С одной стороны генератор - с другой вольтметр.

Чистая задержка может быть, к примеру, если вы греете воду, а она перекачивается насосом в то место, где стоит датчик. Чисто теоретически - и там нету.
Designer56
Кроме того, датчик температуры в печке (очень зависит от её типа) часто показывает совсем не температуру нагреваемого продукта.
galjoen
Цитата(Tanya @ Feb 27 2009, 21:44) *
Модель печки - много-много RC-цепочек.

А если много-много - это бесконечность, то производная будет нулевая. И задержка тем больше, чем больше теплоёмкость и меньше теплопроводность. Конечно это не чистая задержка. Но можно всё это представить как чистую задержку + одну RC цепочку. И это будет гораздо лучше, чем одна (или в лучшем случае несколько) RC цепочка без задержки, как представляют печку сейчас.
А насчёт того, что тепло распостраняется со скоростью звука я конечно согласен, но вот к практике это отношения не имеет. Вот запах - он тоже теоретически со скоростью звука движется. А на практике?
Tanya
Цитата(galjoen @ Feb 27 2009, 22:21) *
А если много-много - это бесконечность, то производная будет нулевая. И задержка тем больше, чем больше теплоёмкость и меньше теплопроводность. Конечно это не чистая задержка. Но можно всё это представить как чистую задержку + одну RC цепочку. И это будет гораздо лучше, чем одна (или в лучшем случае несколько) RC цепочка без задержки, как представляют печку сейчас.
А насчёт того, что тепло распостраняется со скоростью звука я конечно согласен, но вот к практике это отношения не имеет. Вот запах - он тоже теоретически со скоростью звука движется. А на практике?

Учтите, что при дроблении цепочек нужно дробить и R и C. И производная не будет нулевая... в некотором смысле...
А про тепло и запах - Вы абсолютно правы - уравнения диффузии и теплопроводности едины и неотличимы.
Только запах, в принципе, несколько быстрее, кажется.
galjoen
Цитата(Tanya @ Feb 27 2009, 22:54) *
Учтите, что при дроблении цепочек нужно дробить и R и C. И производная не будет нулевая... в некотором смысле...

Неопределённость типа бесконечность делить на бесконечность. Но если посчитать предел, то там вроде всётаки ноль получается.
Хотя спорить не буду, т.к. очень хорошо забыл всё это и вспоминать желания нет. Тем более, что к практике это отношения не имеет.
Tanya
Цитата(galjoen @ Feb 27 2009, 23:11) *
Тем более, что к практике это отношения не имеет.

А как же я? Практикую напрасно?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.