こんにちは、
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;
}
皆様のご助力に感謝いたします。
こんにちは、トーマスさん。ご回答ありがとうございます。
コード的には、あなたの方法は私が最後に試したものと同じで、うまくいきました。しかし、あなたのものの方が最適化されています。助かりました。これですべてが明らかになりました。
こんにちは、ルカスさん。
返事が遅れたことをお詫び申し上げます。先週は出張しており、コミュニティの質問に回答する時間が限られていました。
私のコードでは次の式を使用します。
温度 = ( float ) (( short )((RawData[3] <<
RawData[3] = OUT_T_MSB = FFおよびRawData[4] = OUT_T_LSB = F0の場合、-0.0625を取得する必要があります。
明日オフィスに戻ったら再度テストしますが、私の記憶が正しければ、0xFFF0 に対して実際には -0.0625 が得られました。
よろしくお願いいたします。
トーマス
PS: この回答が質問の解決に役立った場合は、「正解」または「役に立った」とマークしてください。ありがとう。