Jump to content

    

Нелинейную характеристику преобразовать в линейную.

Здравствуйте все. 

Есть делитель. Верхнее плече которого терморезистор, допустим с линейной характеристикой, нижнее плече резистор. Выходная характеристика соответственно будет Rt/R.

И она не линейна.Это напряжение поступает в АЦП контроллера. Как линеаризовать данную характеристику, какую формулу?.

Share this post


Link to post
Share on other sites

Можете пояснить, что Вы имеете в виду под преобразованием этой характеристики в линейную?

Share this post


Link to post
Share on other sites
1 hour ago, khlenar said:

Как линеаризовать данную характеристику, какую формулу?.

Можно взять каноническое уравнение прямой по двум точкам. Для двух температур T1 и T2 получить коды АЦП C1, C2. Использовать координаты точек T1, C1 и T2, C2 для нахождения любой T по любому коду C.

Мы так делаем. Всё работает.

Share this post


Link to post
Share on other sites

U(Rt) = Vref * R / (Rt + R)
Rt(U) = (Vref - U) * R / U
 

Share this post


Link to post
Share on other sites
28 минут назад, arhiv6 сказал:

Можете пояснить, что Вы имеете в виду под преобразованием этой характеристики в линейную?

Для измерения температуры

Share this post


Link to post
Share on other sites
12 минут назад, haker_fox сказал:

Можно взять каноническое уравнение прямой по двум точкам. Для двух температур T1 и T2 получить коды АЦП C1, C2. Использовать координаты точек T1, C1 и T2, C2 для нахождения любой T.

Мы так делаем. Всё работает.

Пока делаю так. Разделил отрезок данных на 10 кусков. В каждом куске свой коэффициент. Работает, но не совсем точно. Нужно на большее количество делить. Как то не красиво.

Share this post


Link to post
Share on other sites
14 минут назад, _pv сказал:

U(Rt) = Vref * R / (Rt + R)
Rt(U) = (Vref - U) * R / U
 

Надо попробовать. С начало переварить)

Share this post


Link to post
Share on other sites
8 минут назад, khlenar сказал:

Пока делаю так. Разделил отрезок данных на 10 кусков. В каждом куске свой коэффициент. Работает, но не совсем точно. Нужно на большее количество делить. Как то не красиво.

Когда-то в 77 году я делал линеаризатор на ячейках "идеальный диод". Так вот, в ГОСТах были ошибки в таблицах, особенно они выделялись для малых температур...

Ну и не забудьте, что нужна "обратная кривая"... Когда в 3-х квадрантах нарисуете, то станет понятно...

 

Share this post


Link to post
Share on other sites
11 minutes ago, khlenar said:

Пока делаю так. Разделил отрезок данных на 10 кусков. В каждом куске свой коэффициент.

возьмите excel, забейте в него две колонки, посчитанные или измеренные - напряжение (ну или сразу код АЦП) и сопротивление (ну или сразу температуру).

постройте график сопротивления (температуры) от напряжения,  натяните на него полином нужной степени.

подставляете в него измеренное напряжение - получаете температуру (сопротивление).

lin.thumb.png.005f497a81cf180fd27e3f1286047d7d.png

Share this post


Link to post
Share on other sites
4 минуты назад, _pv сказал:

возьмите excel...

 

Да, в Exel пробую. В слепую правда). С математикой туговато к сожалению.

Share this post


Link to post
Share on other sites

печаль-беда-огорчение, математика-то за 7й класс средней школы.

 

Share this post


Link to post
Share on other sites
8 minutes ago, khlenar said:

Да, в Exel пробую. В слепую правда). 

Если там стандартный термистор то можно считать по стандартной формуле

  #define   B1  (3988.0f)
  #define   r0  (10000.0f)
  #define  ADC_PREC (4096.0f)
  float r;
  r = val * 10000.0f / ((ADC_PREC-1) - val);
  r = (25 + 273.15f) / ((logf(r / r0) * (25.0f + 273.15f)) / B1 + 1) - 273.15f;

val - показания АЦП
r0 - сопротивление постоянного резистора
ADC_PREC - диапазон АЦП
B1 - узнаем из даташита не термистор

Да, только постоянный резистор в верхнем плече, а не в нижнем.

 

 

Share this post


Link to post
Share on other sites
2 минуты назад, AlexandrY сказал:

Если там стандартный термистор то можно считать по стандартной формуле


  #define   B1  (3988.0f)
  #define   r0  (10000.0f)
  #define  ADC_PREC (4096.0f)
  float r;
  r = val * 10000.0f / ((ADC_PREC-1) - val);
  r = (25 + 273.15f) / ((logf(r / r0) * (25.0f + 273.15f)) / B1 + 1) - 273.15f;

val - показания АЦП
r0 - сопротивление постоянного резистора
ADC_PREC - диапазон АЦП
B1 - узнаем из даташита не термистор

 

 

 

Отлично. А термистор включен в плече делителя(делимого)?

Share this post


Link to post
Share on other sites
23 minutes ago, khlenar said:

Как то не красиво.

А вам какая точность нужна? Вы попросили линеаризацию, и я привёл вам пример линейной функции для всего диапазона. Если разбивать на куски, то это кусочно-линейная аппроксимация. Можно использовать подход, предложенный уважаемым @AlexandrY.

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

Share this post


Link to post
Share on other sites
2 минуты назад, haker_fox сказал:

А вам какая точность нужна? Вы попросили линеаризацию, и я привёл вам пример линейной функции для всего диапазона. Если разбивать на куски, то это кусочно-линейная аппроксимация. Можно использовать подход, предложенный уважаемым @AlexandrY.

У меня не линейная характеристика. По двум точкам данных будет оочень большая погрешность. То, что предложил AlexandrY, больше похоже на правду. 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now