Чтобы не измерялось: скорость айсбергов в Тихом океане, килограммы или километры – в итоге всё равно мерой является напряжение, либо постоянное, либо импульсное, либо амплитуда, либо частота и длительность. АЦП меряет амплитуду, триггеры и компараторы меряют динамику. Другого ничего не придумали. И хорошо, если измеряемый процесс линейный. Тогда калибровка будет представлять линейную функцию:

float Line(unsigned short adc,unsigned short adc1,unsigned short adc2, float val1,float val2) {

return (adc-adc1)*(val1-val2)/(adc1-adc2) +val1;

};

Здесь двум физическим значениям val1 и val2 ставится в соответствие два значения АЦП adc1 и adc2. Эта процедура сделана заранее с помощью проверенного прибора и в итоге текущей физической величине val соответствует текущее значение adc:

Val = Line( adc, adc1,adc2, val1,val2);

Иногда процесс нелинейный можно интерпретировать кусочно-линейной аппроксимацией. Это означает, что сколько линейных участков, столько и калибровок.

Бывают очень не линейные процессы. Например в задаче измерения вакуума с помощью теплового манометра методом постоянства температуры накала нити.

Пимер нелинейного процесса

Рис.1

Материал взят отсюда.

На Рис.1 некой переменной ɑ ставится в соответствие давление в Паскалях, причем в логарифмической шкале. Переменная ɑ благополучно измеряется АЦП и зависит от напряжения, как и было замечено в самом начале.

Столкнувшись на практике с этими данными, совершенно не хотелось делать кусочно-линейную аппроксимацию, тем более что на неё надо было убить массу кода в контроллере. Элегантней представить это полиномом 5-й степени. Excell нам в помощь см. noline.xlsx.

Колонка B и C – экспериментальные данные , полученные сторонним прибором отражают зависимость давления вакуума от напряжения ( График «Экспериментальные данные Pa(V)»). Попытка интерполировать именно эту зависимость не реальна из-за логарифмической шкалы. Excell может построить так называемую линию тренда. Поэтому надо прологарифмировать колонку C и работать именно с этими данными – колонка D (График Ln(Pa(V))). Черная линия на этом графики – линия тренда, которую предлагает Excell и выражение полинома 5-й степени с некими коэффициентами. Будет большой ошибкой использовать именно эти коэффициенты для формулы, т.к. они представлены весьма приближенно, видимо просто для красоты.

Отсутствие цифр в колонках B,C и D сделано намеренно. Это отражает тот факт, что снимать значения во всем динамическом диапазоне не удается с равномерными промежутками. Поэтому мы желаем видеть как метод интерполяции интерполирует…

Далее попытаюсь описать чудный интерфейс Excell, который подвластен только факиру.

И так, данные не должны содержать пропуски, поэтому переписываем всё в колонки F и G. В ячейку H23 вставляем выражение:

=ТРАНСП(ЛИНЕЙН(G2:G19;F2:F19^{1;2;3;4;5}))

Не спрашивайте что это такое, я как попугай повторяю, всё что нарыл в просторах Инета. Очевидно, что параметры G2:G19;F2:F19 связаны с колонками данных, выражение {1;2;3;4;5} означает массив коэффициентов для полинома 5-й степени.

Последовательность действий такова:

  1. Вставляем «копипастом» выражение в ячейку H23.
  2. Выделяем ячейки H23-H28
  3. Перемещаем фокус на верхнюю линию, где текст формулы
  4. Нажимаем сочетание Ctrl+Shift+Enter

Результат – появление коэффициентов в выделенной области.

Цирк, аплодисменты!

Никакие иные копипасты и вращение компьютера вокруг головы не поможет. Таков Excell. Я учил эту процедуру полчаса, чтобы запомнить и записать.

Тем не менее данные H2-H19 отражают с хорошей точностью колонку G2. Ну, а теперь если взять экспоненту от H2-H19 получим выражение для конечной интерпретации (колонка K).

Для микроконтроллера, который измеряет напряжение, интерпретация будет выглядеть так:

Объявляем массив коэффициентов из ячеек F23-F28

double Coef[] ={ -2.798453677, 1.891945934, 0.00879742, -0.003080488, 0.000432589, -2.12925E-5};

Пишем функцию:

float Volt_to_Pascal(float x){

double x2,x3,x4,x5,pr;

x2=x*x;

x3=x2*x;

x4=x3*x;

x5=x4*x;

pr = Coef [5]*x5+ Coef [4]*x4+ Coef [3]*x3+ Coef [2]*x2+ Coef [1]*x+ Coef [0];

pr = exp(pr);

return pr;

};

 

Время выполнения функции для микропроцессора Atmega128 на 12 Mhz составляет 400 микросекунд. Не так уж и много…

Коэффициенты для интерполяции экспериментальных данных можно получить и в MathCad.

Пример noline.mcdx

Обновлено (21.05.2015 13:33)

 
Новости электроники от РадиоЛоцмана
Вопросы искусственного интеллекта, философия и практика
. @Mail.ru