BME280の詳細なチューニングと設定ごとの精度や応答速度についてまとめました。BMP280でもほぼ同じように設定できます。
環境
マイコンはArduino互換のSeeeduino XIAO、センサーは秋月電子のAE-BME280、ライブラリはAdafruitのものです。ボードのメーカーやライブラリが異なっても設定項目は同じです。
設定項目
ライブラリに丸投げすればread()
などの関数で値を読むことはできますが、用途ごとに精度や消費電力を最適化する場合やライブラリを自作する場合に必要な設定について簡単にまとめました。主にデータシートの3. Functional descriptionの内容です。
測定モード
BME280には2つの測定モード(3.3 Sensor modes)があります。
Forced Mode
Forced Modeでは、マイコンからの命令により1サイクルだけ測定をしてマイコンに送信します。
Normal Mode
Normal Modeでは、常に測定を繰り返して値をセンサー内(出力レジスタ)に保存し、マイコンからの命令により最新の値を送信します。測定を繰り返す頻度は測定そのものにかかる時間($t_{measure}$)と待機時間($t_{standby}$)によって決まり、$t_{standby}$を明示的に指定します。
測定の流れ
BME280にオーバーサンプリングと内蔵IIRフィルタの機能があるため、“1サイクル"の測定が複雑になっています。センサーの出力レジスタの値が書き換わるのが"1サイクル"です。まずそれぞれ機能の説明をしたあと、測定の流れについてまとめ直します。
オーバーサンプリング
1サイクルで温度・気圧・湿度をそれぞれ複数回測定して出力値を安定させることができます。測定回数はそれぞれ独立に設定でき、測定を省略することも可能です。
IIRフィルタ
オーバーサンプリングが1サイクル内で複数測定するのに対し、IIRフィルタは前のサイクルまでの値を使って出力値を安定させます。IIRフィルタは$filter_{coefficient}$という定数で設定します。この定数を用いて、前回の出力レジスタの値$data_{filtered-old}$と最新のセンサーの生の測定値$data_{ADC}$の加重平均を計算して新しい出力レジスタの値$data_{filtered}$とします。なお、$data_{ADC}$はオーバーサンプリング後の値です。
$$ data_{filtered}=\frac{data_{filtered-old}\cdot (filter_{coefficient}-1)+data_{ADC}}{filter_{coefficient}} $$
$filter_{coefficient}$は1,2,4,8,16が設定でき、1にすると式から明らかなようにIIRフィルタが無効になります。
1サイクルの値をそのまま出力するわけではないのでノイズが減りますが、複数サイクルの値を使うので応答速度が下がります。この遅れはデータシートのFigure 7: Step response at different IIR filter settingsを参照してください。
全体の流れと測定時間
Figure 6: BME280 measurement cycleの通りです。
- 測定開始
- 気温測定(オーバーサンプリング含む)
- 気圧測定(オーバーサンプリング含む)
- 湿度測定(オーバーサンプリング含む)
- 出力レジスタ更新(IIRフィルタ含む)
- 測定終了
測定時間$t_{measure}$はオーバーサンプリングをどの程度するかによって決まり、9.1 Measurement timeの通り計算できます。
Adafruitライブラリでの設定方法
Adafruit_BME280.hのsetSampling
を用いることで設定を変更できます。引数の定数は同じファイルに列挙型で定義されています。
|
|
チューニング
編集中