853523_ja-JP

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

853523_ja-JP

853523_ja-JP

MPL3115A2 温度変換<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

こんにちは、

MPL3115A2 の温度読み取り値 (OUT_T_MSB、OUT_T_LSB) を正確に変換する方法がわかりません。次の機能を検討してください:

インライン静的浮動小数点rawTemperature2Float(const uint8_t* const rt)
{
戻り値 ((float)((int8_t)rt[0])) + (((rt[1] >> 4) & 0x0F) * 0.0625f);
}

rt[0] = OUT_T_MSB、rt[1] = OUT_T_LSBです。

質問は、MSB の符号ビットによって小数部の処理方法も決まるか、それとも常に正の値になるかということです。提示された関数では、常に小数部分を追加しています。しかし、符号が負の場合は、それを減算する(または -1 を掛ける)必要があるでしょうか?関数は次のようになりますか?

インライン静的浮動小数点rawTemperature2Float(const uint8_t* const rt)
{
浮動小数点数 = ((rt[1] >> 4) & 0x0F) * 0.0625f;

(rt[0] & 0x80)の場合

{
frac *= -1; // バリアント #1

//frac = (1.0f - frac) * -1; // バリアント #2

     }

((float)((int8_t)rt[0])) + fracを返します。
}

もしそうなら、if のどの変種ですか?

このアプローチでは同様の結果が得られます (すべてのビットが 2 の補数変換用にスレッド化されます)。

インライン静的浮動小数点rawTemperature2Float(const uint8_t* const rt)
{
int32_t temp = (((int32_t)rt[0]) << 4) | (rt[1] >> 4);
if (温度 & 0x800)
温度 = (0x1000 - 温度) * -1;

戻り値 ((float)(temp)) / 16.0f;
}

皆様のご助力に感謝いたします。

圧力センサRe: MPL3115A2 temperature conversion<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

こんにちは、トーマスさん。ご回答ありがとうございます。

コード的には、あなたの方法は私が最後に試したものと同じで、うまくいきました。しかし、あなたのものの方が最適化されています。助かりました。これですべてが明らかになりました。

Re: MPL3115A2 temperature conversion<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

こんにちは、ルカスさん。

返事が遅れたことをお詫び申し上げます。先週は出張しており、コミュニティの質問に回答する時間が限られていました。

私のコードでは次の式を使用します。

温度 = ( float ) (( short )((RawData[3] << | (RawData[4] & 0xF0)) >> 4) * 0.0625;

 

RawData[3] = OUT_T_MSB = FFおよびRawData[4] = OUT_T_LSB = F0の場合、-0.0625を取得する必要があります。

明日オフィスに戻ったら再度テストしますが、私の記憶が正しければ、0xFFF0 に対して実際には -0.0625 が得られました。

よろしくお願いいたします。

トーマス

PS: この回答が質問の解決に役立った場合は、「正解」または「役に立った」とマークしてください。ありがとう。

Tags (1)
No ratings
Version history
Last update:
‎02-04-2026 01:26 PM
Updated by: