roboforum.ru

Технический форум по робототехнике.
Текущее время: 02 дек 2024, 22:39

Часовой пояс: UTC + 4 часа




Начать новую тему Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 9 ] 
Автор Сообщение
 Заголовок сообщения: математика и mega8
СообщениеДобавлено: 03 апр 2011, 00:29 
Не в сети

Зарегистрирован: 22 мар 2011, 01:02
Сообщения: 20
Полученные данные с bmp085 подставляются в формулы и в виде результата температура и давление, но как минимум температура выдается странная. Сверил с драйвером на данное устройство, формулы расчета такие же как у меня. Если посчитать вручную на листочке по этим же формулам, то все норм. Тогда для проверки написал такую вещь:
MC=-11075;
MD=2432;
X1=6694;
z=MC*2048;
z1=X1+MD;
X2=z / z1;
printf("z = %d z1 = %d\r\n",z,z1); // В итоге выводит z = -6144, а не -22681600, z1 правильно 9126
printf("X2 = %d\r\n",X2); // x2 = 12221 -тоже не понятно что и откуда. Потому что должно быть 2485
Тип данных везде int32_t. Поэтому переполнения нет.
Подскажите в чем проблема.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: математика и mega8
СообщениеДобавлено: 03 апр 2011, 01:13 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
перед printf явно присвойте всем переменным значения и прверьте правильно ли выводит printf

_________________
Читайте !


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: математика и mega8
СообщениеДобавлено: 03 апр 2011, 02:10 
Не в сети
Аватара пользователя

Зарегистрирован: 04 дек 2008, 22:44
Сообщения: 4363
Откуда: Камышин
Skype: galk-aleksandr1
прог. языки: Kotlin, Java, C, C++, Assm, BasCom, VB, php
ФИО: Галкин Александр Владимирович
Если не ошибаюсь в даташите при расчете не все используемые типы int32_t, скорее всего потому ошибки. Авр верно сказал, отловить можно выводом всех переменных

_________________
if(!Operate) Read(pDatasheet);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: математика и mega8
СообщениеДобавлено: 03 апр 2011, 13:08 
Не в сети

Зарегистрирован: 24 май 2010, 15:31
Сообщения: 92
Откуда: Екатеринбург
ФИО: Зайцев Иван Алексеевич
Сам мучаю сей датчик давления и обратил внимания на данный факт. Показывает понтиратуру выше чем ртутный термометр лежащий рядом.
При подстановке значений из даташита - посчитал правилбно. Пришел к выводу, что это температура не окружающего воздуха , а самого криистала, хотя в даташите начего не нашел об этом. Работаеь в связке с LPC1114


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: математика и mega8
СообщениеДобавлено: 03 апр 2011, 13:42 
Не в сети
Аватара пользователя

Зарегистрирован: 04 дек 2008, 22:44
Сообщения: 4363
Откуда: Камышин
Skype: galk-aleksandr1
прог. языки: Kotlin, Java, C, C++, Assm, BasCom, VB, php
ФИО: Галкин Александр Владимирович
На этом датчике делал 3 конструкции. Проблема одинтраз была именно в неверном типе переменной. Показывает и температуру и давление идеально!

_________________
if(!Operate) Read(pDatasheet);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: математика и mega8
СообщениеДобавлено: 03 апр 2011, 23:22 
Не в сети

Зарегистрирован: 22 мар 2011, 01:02
Сообщения: 20
В принципе все были правы. 1 проблема была с типами данных. После исправления стало норм считать температуру. 2 проблема с выводом этих данных. Изменил в конфигурации проекта printf features на "long, width" и использовал %ld. в итоге норм. Температуру показывает четко. Сейчас осталась только проблемка с давлением. при UP=39331 выдает давление 258784, что нереально. Завтра попробую пересчитать вручную. На всякий случай ниже пишу формулы расчета. Вдруг кто ошибку увидит.

nt32_t raschet_p(int16_t AC1,int16_t AC2,int16_t AC3,uint16_t AC4,uint16_t AC5,uint16_t AC6,int16_t B1,int16_t B2,int16_t MB,int16_t MC,int16_t MD,int32_t UT,int32_t UP)
{
int32_t X1,X2,B5,T,B6,X3,B3,P;
uint32_t B4,B7;
int8_t oss=3;
X1 = ((int32_t)UT - (int32_t)AC6) * (int32_t)AC5 >> 15;
X2 = ((int32_t)MC << 11) / (X1 + MD);
B5=X1+X2;
T=(B5+8)>>4;
znach_temp=T;
B6 = B5-4000;
X1 = (B2 * ((B6 * B6) >> 12)) >> 11;
X2 = (AC2 * B6) >> 11;
X3 = X1 + X2;
B3 = (((((int32_t) AC1) * 4 + X3)<<oss) + 2)>> 2;
X1 = (AC3 * B6) >> 13;
X2 = (B1 * ((B6 * B6) >> 12)) >> 16;
X3 = ((X1 + X2) + 2) >> 2;
B4 = (AC4 * (uint32_t) (X3 + 32768)) >> 15;
B7 = ((uint32_t) (UP - B3) * (50000 >> oss));
if (B7 < 0x80000000)
{
P = (B7 << 1) / B4;
}
else
{
P = (B7 / B4) << 1;
}

X1 = (P >> 8) * (P >> 8);
X1 = (X1 * 3038) >> 16;
X2 = (-7357 * P) >> 16;
P = P + ((X1 + X2 + 3791) >> 4);
return P;
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: математика и mega8
СообщениеДобавлено: 04 апр 2011, 00:00 
Не в сети
Аватара пользователя

Зарегистрирован: 04 дек 2008, 22:44
Сообщения: 4363
Откуда: Камышин
Skype: galk-aleksandr1
прог. языки: Kotlin, Java, C, C++, Assm, BasCom, VB, php
ФИО: Галкин Александр Владимирович
Я еще после окнчательных вычислений брал абсолютное значение давления:
Код:
p += (X1 + X2 + 3791) / 16;
p = Abs(p);
p = p / 133;                                     // mm Hg

_________________
if(!Operate) Read(pDatasheet);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: математика и mega8
СообщениеДобавлено: 04 апр 2011, 16:57 
Не в сети

Зарегистрирован: 22 мар 2011, 01:02
Сообщения: 20
Просидел пол дня и наконец разобрался. Я использовал ultra high resolution mode. и поэтому писал oss=3. В итоге после долгих мучений оказалось что если взять oss=0, то все вычисляется идеально. И это в принципе логично, потому что выходное UP в зависимости от режима по крайней мере у меня не меняется. Не знаю где я в мануале не то прочитал, но теперь использую ultra high resolution mode и oss=0.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: математика и mega8
СообщениеДобавлено: 04 апр 2011, 16:59 
Не в сети
Аватара пользователя

Зарегистрирован: 04 дек 2008, 22:44
Сообщения: 4363
Откуда: Камышин
Skype: galk-aleksandr1
прог. языки: Kotlin, Java, C, C++, Assm, BasCom, VB, php
ФИО: Галкин Александр Владимирович
Кстати, действительно и у меня oss=0...

_________________
if(!Operate) Read(pDatasheet);


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Эта тема закрыта, вы не можете редактировать и оставлять сообщения в ней.  [ Сообщений: 9 ] 

Часовой пояс: UTC + 4 часа


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

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


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

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