Технический форум по робототехнике.
Raskolin » 03 апр 2011, 00:29
Полученные данные с 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. Поэтому переполнения нет.
Подскажите в чем проблема.
avr123.nm.ru » 03 апр 2011, 01:13
перед printf явно присвойте всем переменным значения и прверьте правильно ли выводит printf
galex1981 » 03 апр 2011, 02:10
Если не ошибаюсь в даташите при расчете не все используемые типы int32_t, скорее всего потому ошибки. Авр верно сказал, отловить можно выводом всех переменных
elesy » 03 апр 2011, 13:08
Сам мучаю сей датчик давления и обратил внимания на данный факт. Показывает понтиратуру выше чем ртутный термометр лежащий рядом.
При подстановке значений из даташита - посчитал правилбно. Пришел к выводу, что это температура не окружающего воздуха , а самого криистала, хотя в даташите начего не нашел об этом. Работаеь в связке с LPC1114
galex1981 » 03 апр 2011, 13:42
На этом датчике делал 3 конструкции. Проблема одинтраз была именно в неверном типе переменной. Показывает и температуру и давление идеально!
Raskolin » 03 апр 2011, 23:22
В принципе все были правы. 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;
}
galex1981 » 04 апр 2011, 00:00
Я еще после окнчательных вычислений брал абсолютное значение давления:
- Код: Выделить всё • Развернуть
p += (X1 + X2 + 3791) / 16;
p = Abs(p);
p = p / 133; // mm Hg
Raskolin » 04 апр 2011, 16:57
Просидел пол дня и наконец разобрался. Я использовал ultra high resolution mode. и поэтому писал oss=3. В итоге после долгих мучений оказалось что если взять oss=0, то все вычисляется идеально. И это в принципе логично, потому что выходное UP в зависимости от режима по крайней мере у меня не меняется. Не знаю где я в мануале не то прочитал, но теперь использую ultra high resolution mode и oss=0.
galex1981 » 04 апр 2011, 16:59
Кстати, действительно и у меня oss=0...