Перейти к блогу GetChip.net - блог        JilTE[1] - в разработке     Модификации устройств - модификации

 
Текущее время: 19 ноя 2019, 18:23

Часовой пояс: UTC + 3 часа [ Летнее время ]



Начать новую тему Ответить на тему  [ Сообщений: 24 ]  На страницу 1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Линейная апроксимация
СообщениеДобавлено: 16 июн 2012, 19:42 
Не в сети

Зарегистрирован: 23 май 2012, 22:07
Сообщения: 38
Делаю устройство,которое показывает давление масла в автомобиле. Датчик ММ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 КБ]
Скачиваний: 208
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Линейная апроксимация
СообщениеДобавлено: 17 июн 2012, 13:35 
Не в сети

Зарегистрирован: 20 май 2011, 23:58
Сообщения: 151
Откуда: St.-Petersburg
А вопрос-то в чем?
В математике или в программировании?

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

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

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

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

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

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Линейная апроксимация
СообщениеДобавлено: 19 июн 2012, 22:41 
Не в сети

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


Вложения:
Example.rar [3.58 КБ]
Скачиваний: 209
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Линейная апроксимация
СообщениеДобавлено: 19 июн 2012, 23:31 
Не в сети

Зарегистрирован: 20 май 2011, 23:58
Сообщения: 151
Откуда: St.-Petersburg
А почему аппроксимация-то сделана для функции вида 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 КБ]
Скачиваний: 201
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Линейная апроксимация
СообщениеДобавлено: 21 июн 2012, 00:26 
Не в сети

Зарегистрирован: 23 май 2012, 22:07
Сообщения: 38
Если делаю, как Вы советуете, на индикаторе какая-то еруна. Умножал и делил на 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 КБ]
Скачиваний: 200
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Линейная апроксимация
СообщениеДобавлено: 21 июн 2012, 02:19 
Не в сети

Зарегистрирован: 20 май 2011, 23:58
Сообщения: 151
Откуда: St.-Petersburg
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 КБ | Просмотров: 6061 ]


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


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


Последний раз редактировалось aui2002 21 июн 2012, 02:31, всего редактировалось 5 раз(а).
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Линейная апроксимация
СообщениеДобавлено: 21 июн 2012, 02:25 
Не в сети

Зарегистрирован: 20 май 2011, 23:58
Сообщения: 151
Откуда: St.-Petersburg
Продолжаем разговор.... :mrgreen:

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

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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Линейная апроксимация
СообщениеДобавлено: 22 июн 2012, 00:38 
Не в сети

Зарегистрирован: 23 май 2012, 22:07
Сообщения: 38
Наконец-то получилось! Показания на индикаторе для 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 КБ]
Скачиваний: 211
Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Линейная апроксимация
СообщениеДобавлено: 22 июн 2012, 00:45 
Не в сети

Зарегистрирован: 23 май 2012, 22:07
Сообщения: 38
По Вашему варианту P=f(R) на нижнем и верхнем пределе должно получиться точнее. Да, я в формулу подставлял значение АЦП,поэтому и получалась какая-то лажа. Есть делитель (
Вложение:
Фото007.jpg
Фото007.jpg [ 208.28 КБ | Просмотров: 6037 ]
)
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 стоит и не меняется.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения: Re: Линейная апроксимация
СообщениеДобавлено: 22 июн 2012, 01:37 
Не в сети

Зарегистрирован: 20 май 2011, 23:58
Сообщения: 151
Откуда: St.-Petersburg
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)


Последний раз редактировалось aui2002 22 июн 2012, 04:59, всего редактировалось 2 раз(а).

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 24 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0


Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB