http://forum.getchip.net/

Линейная апроксимация
http://forum.getchip.net/viewtopic.php?f=20&t=234
Страница 1 из 3

Автор:  avrmastak [ 16 июн 2012, 19:42 ]
Заголовок сообщения:  Линейная апроксимация

Делаю устройство,которое показывает давление масла в автомобиле. Датчик ММ393А меняет свое сопротивление от 315 Ом(при 0 кгс/см^2) до 5 Ом(при 8 кгс/см^2).Идею взял отсюда: http://www.bezkz.su/...metr/11-1-0-399 . После калибровки получаю массив в EEPROM который потом загоняю в массив в оперативке buf_ram[].Не знаю как сделать линейную апроксимацию показаний, т.е. чтобы показания на индикатор шли с учетом данных из массива buf_ram[].

Вложения:
example.rar [1.61 КБ]
Скачиваний: 194

Автор:  aui2002 [ 17 июн 2012, 13:35 ]
Заголовок сообщения:  Re: Линейная апроксимация

А вопрос-то в чем?
В математике или в программировании?

Если в математике, то, как я понял из исходника, есть 5 калибровочных точек, т.е. 5 пар значений Давление (P) - Сопротивление (R). По этим пяти точкам нужно сделать линейную аппроксимацию (учебник математики в помощь).

Результатом аппроксимации будет нахождение коэффициентов уравнения P=a*R+b. (т.е. a и b)
После этого a и b пихаем в EEPROM, а 5 пар калибровочных значений множим на ноль (в смысле они больше не нужны).

Теперь, когда в рабочем режиме снимается значение сопротивления R, его нужно умножить на a и прибавить b. Результат (P) вывести на индикатор.

Аппроксимация - это, по сути, набор операций с матрицами (массивами): умножение, транспонироввание и т.п.
Как мне кажется (могу ошибаться), штука довольно ресурсоемкая, особенно, если еще коэффициент детерминированности считать (это критерий точности аппроксимации).
Хватит ли на это ресурсов выбранного Вами МК?

Еще вопрос: как я понял, калибровка производится один раз при установке девайса на авто? Ну а потом может через год или через два при ТО? Есть ли смысл тогда пихать аппроксимацию в МК?

Может проще, чтобы в режиме калибровки эти 5 пар просто выводились на экран, откуда их можно списать на бумажку (или считать их программатором из EEPROM). Потом засунуть в тот же Excel и в два тычка сделать аппроксимацию там. Коэффициенты a и b, полученные в Excel, либо ввести в прошивку в виде констант, либо через элементы ввода (кнопки и т.п.) скормить девайсу без ковыряния в прошивке?

Автор:  avrmastak [ 19 июн 2012, 22:41 ]
Заголовок сообщения:  Re: Линейная апроксимация

Забил на калибровку. Хочу просто вывести на индикатор реальные показания давления от 0 до 8 с десятыми.Сегодня замерял сопротивление датчика(табличка в архиве). В Exel сделал апроксимацию и нашел уравнение моей кривой. Что с ним делать дальше? Куда его вписать в программе?

Вложения:
Example.rar [3.58 КБ]
Скачиваний: 199

Автор:  aui2002 [ 19 июн 2012, 23:31 ]
Заголовок сообщения:  Re: Линейная апроксимация

А почему аппроксимация-то сделана для функции вида R=f(P), а не для P=f(R) ??? :?
Вам ведь нужно рассчитать значение P по измеренному R, значит логично сделать P функцией, а R - аргументом.
Тогда еще и делить не придется...
После пересчета (см. прикрепленный файл) получаем уравнение вида y = -0,0272x + 8,8315 или, в наших обозначениях:
P = -0,0272R + 8,8315 Получается, что в EEPROM нужно запихнуть два числа: -0,0272 и 8,8315.

avrmastak писал(а):
Что с ним делать дальше? Куда его вписать в программе?

В программе делаем следующее:
1) замеряем сопротивление датчика через АЦП;
2) переводим показания АЦП в Омы (до этого пункта, включительно, как я понял код написан);
3) полученное сопротивление умножаем на -0,0272 и прибавляем 8,8315 (эти цифры должны быть введены в EEPROM при прошивке) и получаем искомое давление в кгс/см2;
4) округляем (или обрубаем) до нужного количества знаков (есть это в коде или нет - не понял, если нет - дописать);
5) выводим полученное значение на... экран или индикатор - что там у Вас стоит не знаю (это тоже написано).

Добавьте в программу код, соответствующий пункту 3 - это и будет использование найденного Вами уравнения.

Вложения:
Комментарий к файлу: см. сразу же на первом листе
appr.xls [24 КБ]
Скачиваний: 185

Автор:  avrmastak [ 21 июн 2012, 00:26 ]
Заголовок сообщения:  Re: Линейная апроксимация

Если делаю, как Вы советуете, на индикаторе какая-то еруна. Умножал и делил на 10,100,1000 - показания 600-400 и постоянно прыгают. Сделал ADC=f(P), а потом выразил из него Р,получилось Р=(983-adc)/92. Единицы давления совпадают все, кроме 0. 0 включается аж при 340 Ом. Десятые доли давления живут своей жизнью,скажем если взять диапазон 7-8 кгс получается:
44 Ом - 8,0.
55 Ом - 7,6.
57 Ом - 7,0.
74 Ом - 7,0.
и никаких промежуточных значений.
Подскажите,пожалуйста,как сделать чтобы 0 стал на место(если в формуле Р=(983-adc)/92, 983 меняю на 920 ноль становится на место,но все показания смещаются на 1) и что не так с десятыми долями.

Вложения:
Example.rar [3.25 КБ]
Скачиваний: 188

Автор:  aui2002 [ 21 июн 2012, 02:19 ]
Заголовок сообщения:  Re: Линейная апроксимация

avrmastak писал(а):
Если делаю, как Вы советуете, на индикаторе какая-то еруна. Умножал и делил на 10,100,1000 - показания 600-400 и постоянно прыгают.

Скорей всего, вместо Сопротивления в Омах Вы подставляли значения АЦП. А умножали и делили на 10,100,1000 с какой целью?
avrmastak писал(а):
Сделал ADC=f(P), а потом выразил из него Р,получилось Р=(983-adc)/92.

А почему не сделали P=f(ADC)? Ведь тогда проще считается...
avrmastak писал(а):
Единицы давления совпадают все, кроме 0. 0 включается аж при 340 Ом

Так и должно быть. Уравнение регрессии в нашем случае описывает зависимость с точностью от 97-98%. Продлите свою линию тренда до пересечения с осью х и увидите, что они пересекутся на 340 Ом.
Чтобы этого не было, нужно искуственно выводить 0 при нужном сопротивлении + так же искусственно выводить 8.

avrmastak писал(а):
Десятые доли давления живут своей жизнью,скажем если взять диапазон 7-8 кгс получается:
44 Ом - 8,0.
55 Ом - 7,6.
57 Ом - 7,0.
74 Ом - 7,0.
и никаких промежуточных значений.

По-моему, где-то в программе косяк с математикой (скорее, всего с округлением), т.к. по Вашему уравнению (Р=(983-adc)/92) для 44Ом должно получиться 8,3, а не 8,0.

Теперь взглянем на возможные варианты расчета:
Вложение:
eqv.JPG
eqv.JPG [ 21.69 КБ | Просмотров: 5753 ]


1) И Ваше, и мои уравнения дают близкие результаты.
2) При округлении до 10-х одинаковыми могут быть давления для 55 и 57 Ом, но ни как не для 57 и 74. Опять же - проверяйте математику.
3) Расчет по тому уравнению, которое я предлагал ранее: абсолютно адекватные числа, никаких там 400-600. Ну и для 55 и 57 Ом давление одинаковое (см. п. 1.)
4) Верхняя и нижняя строчка наглядно демонстрируют уход расчетных краевых значений (0 и 8 кгс/см2) от реальных.

Вложения:
Exel.xls [35 КБ]
Скачиваний: 181

Автор:  aui2002 [ 21 июн 2012, 02:25 ]
Заголовок сообщения:  Re: Линейная апроксимация

Продолжаем разговор.... :mrgreen:

Я бы сделал так.
1) Получаем значение АЦП.
2) Если АЦП = 220, выводим на экран 8,0.
3) Если АЦП = 920, выводим 0,0.
4) Если 220< АЦП<920, по любому из предложенных уравнений считаем P.
5) Округляем P до 10-х долей и выводим.

P.S.
Если я ничего не путаю, деление округляет целые числа вниз. В Вашем уравнении деление есть, может из-за этого и скачут десятые доли?

Автор:  avrmastak [ 22 июн 2012, 00:38 ]
Заголовок сообщения:  Re: Линейная апроксимация

Наконец-то получилось! Показания на индикаторе для P=f(ADC) и ADC=f(P) практически совпадают:
0 - 1,3
1 - 1,6
2 - 2
3 - 2,9
4 - 4,2
5 - 5,4
6 - 6,3
7 - 7
8 - 8
Немного с погрешностью, но это ерунда. Если пишу Р=982.67-adc/92.333 десятки отображаютя как надо,а если округляю Р=983-adc/92,то получается ерунда.

Вложения:
Example.rar [3.69 КБ]
Скачиваний: 198

Автор:  avrmastak [ 22 июн 2012, 00:45 ]
Заголовок сообщения:  Re: Линейная апроксимация

По Вашему варианту P=f(R) на нижнем и верхнем пределе должно получиться точнее. Да, я в формулу подставлял значение АЦП,поэтому и получалась какая-то лажа. Есть делитель (
Вложение:
Фото007.jpg
Фото007.jpg [ 208.28 КБ | Просмотров: 5729 ]
)
Vout=Vin*R2/R1+R2; R2-сопротивление датчика.
ADC=Vout*1024/Vref; Vref-2.56В.
Мне нужно из первой формулы выразить R2 и подставить во вторую? Я правильно понял?
Если так делаю,получается страшная формула R=0.926*adc/(524288-2.56*adc).Потом подставляю в P = -0,0272R + 8,8315.Получается еще страшнее. На экране 0,7 стоит и не меняется.

Автор:  aui2002 [ 22 июн 2012, 01:37 ]
Заголовок сообщения:  Re: Линейная апроксимация

avrmastak писал(а):
Да, я в формулу подставлял значение АЦП,поэтому и получалась какая-то лажа. Есть делитель (
Хорошо. Cчитайте, один баг отловили.
avrmastak писал(а):
Наконец-то получилось! Показания на индикаторе для P=f(ADC) и ADC=f(P) практически совпадают:
avrmastak писал(а):
Если пишу Р=982.67-adc/92.333 десятки отображаютя как надо,а если округляю Р=983-adc/92,то получается ерунда.
Вот за это я деление и не люблю, вечно с ним проблемы, начиная, буквально, с деления столбиком в 3-ем классе :D
avrmastak писал(а):
По Вашему варианту P=f(R) на нижнем и верхнем пределе должно получиться точнее
Значит есть смысл остановиться на этом уравнении. Вообще, при интерполяции, аппроксимации, сглаживании и т.п. краевые точки почти всегда требуют особого отношения.
avrmastak писал(а):
Vout=Vin*R2/R1+R2; R2-сопротивление датчика.
ADC=Vout*1024/Vref; Vref-2.56В.
Мне нужно из первой формулы выразить R2 и подставить во вторую? Я правильно понял?

Не совсем. Нужно вместо Vout во втором уравнении подставить правую часть первого уравнения.
А из того, что получится, уже выражать R2.

ВАЖНО!!!
По первому уравнению: там, наверно, R1+R2 стоят в знаменателе дроби? Т.е. должно быть ADC=(Vin*R2)/(R1+R2)?

Если так, то после подстановки получим выражение:

ADC=(Vin*R2/(R1+R2))*1024/Vref, отсюда R2, если насморк не загубил мне моск, должно быть равно:

R2= -(ADC*R1*Vref)/(ADC*Vref-Vin*1024) (я еще перепроверю, т.к. выводил на скорую руку, но, вроде, правильно)

Считаем R2 по получившейся формуле и подставляем в функцию P=f(R)

Страница 1 из 3 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/