こんにちは、
mpl3115s2 圧力/高度センサからのデータの読み取りについて質問があります。1分ごとにデータを読み取る必要があり、すでにスタンバイモードを選択しています。私は以下の設定を使用します。
開始時:
制御レジスタ1でオーバーサンプリングを128に設定する
ptDataCfgレジスタのtdfe、drem、pdfeビットを設定する
読書時間:
BAR_INレジスタに基準圧力を設定する
高度または気圧モードに応じて、ctrl1 のビット alt を 1 または 0 に設定します。
10ms待つ(必要かどうかは分かりません)
ctrl1レジスタのostビットを設定する
ループ内で ost ビットのクリアを待機します
ステータスレジスタのptdrビットを待つ
圧力出力レジスタから3ビットを読み取る
それを浮動小数点数に変換する
気圧と高度の読み取り操作を繰り返します。
自分のアプローチを選択すべきでしょうか?私の測定値は通常は正しいのですが、常に正しいとは限らないので、質問します。高度は時々
65520.000000とかそんな感じ。
すべての回答に感謝します。
よろしくお願いします。ヴォイチェフ・ヤシエヴィチ。
こんにちは、トーマス
はい、バイト(レジスタ)について考えましたが、それは私の間違いでした。
はい、圧力 (小さすぎる、たとえば 107,555 Pa) と高度 (24410 または 65520 m) に問題がありましたが、それは次の構成のためです。
制御レジスタ1でオーバーサンプリングを128に設定する
制御レジスタ1のSYSBビットを設定する
ptDataCfgレジスタのtdfe、drem、pdfeビットを設定する
読書時間:
BAR_INレジスタに基準圧力を設定する
ステータスレジスタのptdrビットを待つ
圧力出力レジスタから3ビットを読み取る
それを浮動小数点数に変換する
ステータスレジスタの読み取りで十分だと思いました。現在の構成では高度のみ値が不正です。
以下のような変換を使用します。
圧力の場合:
// raw data from device registers: 2 - LSB, 1 - CSB, 0 - MSB
union32_t integerPart = {.u8 = {rawPressure[2], rawPressure[1], rawPressure[0], 0}};
// converts raw 18-bit integer part to float and adds 2 bits of fractional part, 0x30 - gets 2 bits from LSB byte
return ((float)(integerPart.u32 >> 6)) + ((float)((rawPressure[2] & 0x30) >> 4) * 0.25);高度について:
//converts raw: 0 - MSB and 1 - CSB to float form as integer part and adds 4 bits from byte 2 - LSB bytes in float form
return ((float)((int32_t) ((rawAltitude[0] << 8) | rawAltitude[1]))) + ((float)(rawAltitude[2] >> 4) * 0.625);よろしくお願いします。ヴォイチェフ・ヤシエヴィチ。
こんにちは、ヴォイチェフさん。
シーケンスは正しいようです (3 ビットは単なるタイプミスで、3 バイト (レジスタ 0x01 - 0x03) を意味していると思います)。
高度測定のみ、または圧力測定でもこのような問題が発生しますか?レジスタ0x01~0x03の生の値をメートル単位の実数値にどのように変換していますか? 変換ミスやデータ型の誤りが原因のように思えます。
よろしくお願いいたします。
トーマス