[NXP 加速度センサー初めてガイド 1] | 準備中 | ||
NXP マイコン 初心者ガイドまとめ |
もくじ
- はじめに
- 1. 使用するサンプルデザイン
-
2. サンプルデザインを動かしてみる
- 3. ログに表示された内容を確認してみる
- 4. レジスタの値が確認出来るようソースを変更してみよう
- 5. 実機動作させてレジスタの値を確認してみよう
- 6. レジスタの値を変更してちゃんと反映されるか確認してみよう
- 7. まとめ
はじめに
前回は NXP 社の加速度センサー FXLS8974 のサンプルデザインを動作させてみました。
今回の記事は別のサンプルデザインを元に、各種レジスタの値を確認する手順を解説してみたいと思います。
なお NXP 社の加速度センサー概要を知りたい場合は、以下の記事を参照して下さい。
1. 使用するサンプルデザイン
本記事で使用するサンプルデザインは前回の記事でインポートした "frdmk22f_a8974_fxls8974cf_poll" のデザインを使用します。
図1 Project フォルダの "frdmk22f_a8974_fxls8974_poll" のデザイン
ヒント:もしProject フォルダに "frdmk22f_a8974_fxls8974cf_poll" のデザインが無い場合は、前回の記事の"5. サンプルデザイン のプロジェクトを呼び出す"の手順を進めて "図13 Example インポートの画面" で "frdmk22f_a8974_fxls8974cf_poll" を選んで(チェックして)インポートして下さい。
今回、編集するソースファイルは "fxls8974cf_poll.c" です。
図2 "fxls8974cf_pll.c" のソースファイル
2. サンプルデザインを動かしてみる
まずはこの "frdmk22f_a8974_fxls8974cf_poll" のデザインを動かして、どのような動作か確認してみましょう。
"fxls8974cf_poll.c" を右クリックして "Build Project" をクリックして Build します。
図3 "fxls8974cf_poll.c" を Build する
Build のログは Console 画面に表示されます。特にエラー無く終了します。
図4 Build のログ画面
引き続き Debug を行います。ボードを PC と接続します。
接続方法に関しては、前回の記事の "6. サンプルデザイン を実際に動かしてみる" の "図17 PCとボードを接続した" のように接続して下さい。
その後、前回の記事の "6. サンプルデザイン を実際に動かしてみる" の通りに手順を進めて下さい。
以下の画面のように "... LinkServer Debug started on port xxxxx @127.0.0.1" と Console に表示されれば、Debug モードになります。
図5 "frdmk22f_a8974_fxls8974cf_poll" のデバッグモード
Resume ボタン (又はメニューから "Run" -> "Resume") を押してプログラムを動作させます。Terminal 画面には以下の様なログが表示されます。
図6 Terminal のログ画面
3. ログに表示された内容を確認してみる
ログに表示された内容を確認してみましょう。
3-1. ISSDK FXLS8974 sensor driver example demonstration with poll mode
まず「ISSDK FXLS8974 sensor driver example demonstration with poll mode」と表示されています。
これは C ソースの main 関数部分の 74 行目に記載記載されている、以下の PRINTF 構文により表示されています。
図7 ログ画面 初期メッセージ
3-2. Successfully Initialized Timandra with WHO_AM_I = 0x86
続いて出力されているログ内容は「Successfully Initialized Timandra with WHO_AM_I = 0x86」です。
これは以下の構文にて出力されています。ソースファイルの100~124行目です。
図8 ログ表示 イニシャライズ処理
ここではデバイスのイニシャライズが行われ、正常に終了すると、変数 "whoami" の値を元に PRINTF 構文で表示されます。今回読み出された "whoami" の値は 0x86 だったため 「Successfully Initialized Timandra with WHO_AM_I = 0x86」と表示されています。
"WHO_AM_I" とはNXP社が自社製品に独自に割り当てている認識番号です。
FXLS8974 の認識番号は 86 です。この値はデータシートから分かります。
FXLS8974CF, 3-Axis Low-g Accelerometer - Data Sheet
P41 : 15.9 WHO_AM_I register
図9 FXLS8974CF のデータシート | WHO_AM_I register
またこの値は FXLS8974CF のヘッダーファイル (fxls8974.h ("sensors" -> "fxls8974.h")) 内に記載されています。
図10 fxls8974.h に記載されている FXLS8974_WHOAM_I の定義文
3-3. Successfully Applied FXLS8974 Sensor Configuration
次に出力されているログ内容は「Successfully Applied FXLS8974 Sensor Configuration」です。
これはソースファイルの129~136行目で記述されています。
図11 ログ表示 コンフィギュレーション処理
ここでは FXLS8974 Sensor に対してコンフィギュレーションが行われ、正常に終了するとこのログが表示されます。
どうやら 130行目 で宣言されている構造体 "FXLS8974_I2C_Confiure" で各種設定 (Configuration) がされているようです。
構造体 "FXLS8974_I2C_Configure" の内容を確認してみましょう。
Ctrl ボタンを押しながら、マウスのポインタを "FXLS8974_I2C_Configure" に乗せると、文字が青くなりリンク文となります。
図12 Ctrl ボタンを押しながらマウスのポインタを "FXLS8974_I2C_Configure" に乗せた状態
このままクリックすると "FXLS8974_I2C_Configure" の記述に飛びます。これはドライバーファイルの "fxls8974_drv.c" ("sensors" -> "fxls8974_drv.c")にある記述のようです。
図13 FXLS8974_I2C_Configure の記述内容
ヒント:このように構造体や変数などにCtrlボタンを押しながらポインタを持ってきたり、単にポインタを乗せると、様々な情報に飛んだりアクセス出来ますので、ぜひ活用してみましょう。
この記述の内容は特に理解しなくても構いませんが、 この構造体を使う事によって FXLS8974 の各種設定を行い、設定が成功したか失敗したかを判定する記述が fxls8974_poll.c の 129~136行目 を用いれば実装出来るので、ユーザーコードを作成する時に流用が出来ます。
3-4. Raw Data から実加速度を求めてみる
最後に Raw Data が表示されます。
X = 30 Y = 7 Z = 1136
X = 19 Y = -4 Z = 1134
:
:
これらの値は以下のコード文から Raw Data を取得、表示しています。
図14 Raw Data の取得・表示
148行目で "data" として FXLS8974 から読み取ったデータを取得しています。
156 ~ 158行目で "rawData.accel[0:2]" に対して、"data" の並べ替えを行っています。
161行目で X= に "rawData.accel[0]" を、Y= に "rawData.accel[1]" を、Z= に "rawData.accel[2]" の値を
表示するように PRINTF 構文で表示するよう宣言しています。
このように X, Y, Z の値は、それぞれ X軸、Y軸、Z軸の Raw Data の値です。
これが for - loop 構文で循環するように記述されています。
さてここで表示された値は Raw Data の為、加速度に変換しなければなりません。
この変換は AN1270 Temperature compensation of accelerometer sensors measurement の
”2.1 Sensor Raw data" に説明が記載されています。
Raw Data の値を RawAcc count、理論的公称感度を SEN theo とした時、加速度に変換する式は以下の (1) となります。
RawAcc = RawAcc count × SEN theo ・・・・(1)
理論的公称感度 SEN theo はフルスケールレンジに応じて変わります。
例えば FXLS8974 の ±2g の時のフルスケールレンジは 0.98 mg/LSB となります。
図14 FXLS8974 のデータシート記載の ±2g の時の SEN theo の値
これは FXLS8974 には 12ビットの ADC が組み込まれており、±2,048段階のステップになるので
2g ÷ 2,048 = 0.97656 mg/LSB ≅ 0.98 mg/LSB
が公称感度となります。
では以下の値を、(1) の式を用いて実際の加速度に変換してみましょう。
X = 30 Y = 7 Z = 1136
X軸:30 × 0.97656 mg/LSB = 0.87804 g
Y軸:7 × 0.97656 mg/LSB = 0.068292 g
Z軸:1136 × 0.97656 mg/LSB = 1.1082816 g
となります。
このように加速度を求める場合は (1) の式を用いて変換する必要があります。
4. レジスタの値が確認出来るようソースを変更してみよう
では実際にレジスタの値が確認出来るようにソースを変更してみましょう。
何か参考となる記述あるかな、、、、?
:
:
ありましたね。147行目 ~ 158行目 での記述は、"FXLS8974_I2C_ReadData" という構造体に、"data" という変数を用いて、取得した ReadData を格納しています。
図15 "FXLS8974_I2C_ReadData" 構造体で取得している "data"
この取得した "data" を X, Y, Z軸の Raw Data として取得しています。
Raw Data はあるレジスタの値になりますので、同様に別のレジスタの値を取り込むことは出来ないでしょうか?
4-1. レジスタの取得方法を読み解いてみる
調べてみると "FXLS8974_I2C_ReadData" の "cFxls8974OutputNormal" は定数のようです。
(頭に Constant (定数)の c が付いている)
"cFxls8974OutputNormal" は以下のように宣言されている定数でした。
図16 定数 "cFxls8974OutputNormal" の宣言
読み解いていくと以下の様になります。
・ .readFrom : どのデータから読み込むか? (ここでは "FXLS8974_OUT_X_LSB" から読み込む)
・ .numBytes : どの位の行数分だけ読み込むか? (ここでは "FXLS8974_DATA_SIZE" の数分だけ読み込む)
"FXLS8974_OUT_X_LSB" を Ctrl ボタンを押しながらクリックすると、"FXLS8974_OUT_X_LSB" の場所まで飛びます。
どうやら "fxls8974.h" で宣言されているパラメータのようです。
図17 "FXLS8974_OUT_X_LSB" が宣言されている
同様に "FXLS8974_DATA_SIZE" をCtrl ボタンを押しながらクリックすると、"FXLS8974_DATA_SIZE" の場所まで飛びます。
こちらは "fxls8974cf_pool.c" で定義されているようで、その実態は 6 という数字でした。
図18 "FXLS8974_DATA_SIZE" の定義
つまり "fxls8974.h" から "cFxls8974OutputNormal" の意味は以下であると分かります。
"FXLS8974_OUT_X_LSB" から 6 つのデータ (つまり "FXLS8974_OUT_Z_MSB" まで)
図19 "FXLS8974_OUT_X_LSB" から 6 つのデータ
では実際に読み出したいレジスタの値を指定してみましょう。色々なレジスタ値を読み出したいので "FXLS8974_SENS_CONFIG1" から下を全て読み出せるようにしてみます。その数は35個あります。
図20 "FXLS8974_SENS_CONFIG1" から 35 つのデータ
4-2. レジスタ値を読み出せるようソースを書き換えてみる
では "FXLS8974_I2C_ReadData" の構造体を参考に、レジスタ値を読み出せるようにソースを書き換えてみましょう。
ここで新たに "FXLS8974_REG_DATA" という定数を宣言して、図20で示したように35個のレジスタを読み出せるようにします。
#define FXLS8974_REG_SIZE 35
32行目に追記しました。
図21 "FXLS8974_REG_SIZE" の定義文
また新たに "cFxls8974OutputNormal_reg_set" という定数を宣言してみます。
引数は以下のようにします。
・ .readFrom : FXLS8974_SENS_CONFIG1
・ .numBytes : FXLS8974_REG_SIZE
const registerreadlist_t cFxls8974OutputNormal_reg_set[] = {{.readFrom = FXLS8974_SENS_CONFIG1, .numBytes = FXLS8974_REG_SIZE},
__END_READ_DATA__};
53~55行目に追記しました。
図22 "cFxls8974OutputNormal_reg_set" の宣言文
これで "cFxls8974OutputNormal_reg_set" は以下の意味を持った定数となります。
"FXLS8974_SENS_CONFIG1" から 35 個のデータを持った定数
ではこの定数を用いて、 "FXLS8974_I2C_ReadData" の構造体を利用してレジスタの値を読み出してみましょう。
読み出したいレジスタは以下の4種類とします。数字は SENS_CONFIG1 から見て何番目にあるかを表しています。
- SENS_CONFIG1:0番目
- SENS_CONFIG2:1番目
- SENS_CONFIG3:2番目
- INIT_EN:11番目
また読み出したレジスタの値を "reg_data" と定義して格納します。これを69行目で宣言しました。
図22 "reg_data" の宣言文
uint8_t reg_data[FXLS8974_REG_SIZE];
これらを元に "FXLS8974_I2C_ReadData" の構造体を用いて、レジスタ値を表示(PRINTF構文)させる記述は以下の様になります。
Configure設定の記述と、Loop文の記述の間に追記しました。
145行目~156行目になります。
図23 レジスタ値を表示させる記述
/*! Read sensor register data from the FXLS8974. */
status = FXLS8974_I2C_ReadData(&fxls8974Driver, cFxls8974OutputNormal_reg_set, reg_data);
if (ARM_DRIVER_OK != status)
{
PRINTF("\r\n Read Failed. \r\n");
return -1;
}
PRINTF("\r\nFXLS8974_SENS_CONFIG1 = %08b\r\n",reg_data[0]);
PRINTF("\r\nFXLS8974_SENS_CONFIG2 = %08b\r\n",reg_data[1]);
PRINTF("\r\nFXLS8974_SENS_CONFIG3 = %08b\r\n",reg_data[2]);
PRINTF("\r\nFXLS8974_INT_EN = %08b\r\n",reg_data[11]);
これで SENS_CONFIG1 / SENS_CONFIG2 / SENS_CONFIG3 / INIT_EN の値がコンソール上に表示されるはずです。
5. 実機動作させてレジスタの値を確認してみよう
ではこのソースファイルでボードを用いて動作確認してみましょう。
"Build" -> "Debug" して Terminal に現れたログは以下のようになりました。
「 図5 Terminal のログ画面」とは何が変わったでしょうか?
図24 変更後のTerminal のログ画面
以下のログが加わりました。
------------------
FXLS8974_SENS_CONFIG1 = 00000001
FXLS8974_SENS_CONFIG2 = 00000010
FXLS8974_SENS_CONFIG3 = 10010000
FXLS8974_INT_EN = 10000000
------------------
ちゃんと SENS_CONFIG1 / SENS_CONFIG2 / SENS_CONFIG3 / INIT_EN の値が表示されました。
ではこの値は正しいのでしょうか?
これを確認する為に、SENS_CONFIG1 などがどのように設定されているか確認してみましょう。
SENS_CONFIG1 及び SENS_CONFIG3 は "cFxls8974ConfigNormal" で定数として宣言されています。
38行目~43行目のあたりです。
図25 "cFxls8974ConfigNormal" の定数宣言
この記述では以下のように関連付けられています。
- FXLS8974_SENS_CONFIG1=> "FXLS8974_SENS_CONFIG1_FSR_2G"
- FXLS8974_SENS_CONFIG3=> "FXLS8974_SENS_CONFIG3_WAKE_ODR_6_25HZ"
まず FXLS8974_SENS_CONFIG1 ですが "FXLS8974_SENS_CONFIG1_FSR_2G" はどのような値でしょうか?
この名前から Full-Scale Range が 2G が割り当てられていると見受けられます。
これを確認する為に "FXLS8974_SENS_CONFIG1_FSR_2G" を Ctrl ボタンを押しながらクリック すると、"fxls8974.h" の 455行目に飛びました。
図26 "FXLS8974_SENS_CONFIG1_FSR_2G" の定義記述
FXLS8974 のデータシートを確認すると SENS_CONFIG1 の FSR (2bit目と1bit目) は 00b となっており 2G の設定となっています。
図27 SENS_CONFIG1 のレジスタビット定義
図28 SENS_CONFIG1 の FSR[1..0] の定義
ログでは
FXLS8974_SENS_CONFIG1 = 00000001
となっており、SENS_CONFIG1 の 2bit目と1bit目は 00b なので、確かに FSR は 2G の設定になっている事が確認出来ました。
同様に FXLS8974_SENS_CONFIG3 に対しては "FXLS8974_SENS_CONFIG3_WAKE_ODR_6_25HZ" が関連付けられています。
"FXLS8974_SENS_CONFIG3_WAKE_ODR_6_25HZ" を Ctrl ボタンを押しながらクリック すると、"fxls8974.h" の 568行目 に飛びます。
図29 "FXLS8974_SENS_CONFIG3_WAKE_ODR_6_25HZ" の定義記述
ここでは WAKE モードや SLEEP モードの ODR が規定されており、"FXLS8974_SENS_CONFIG3_WAKE_ODR_6_25HZ" は
WAKE モードの ODR 周波数が 6.25Hz の設定になります。
FXLS8974 のデータシートを確認すると SENS_CONFIG3 の [7..4] bit目が WAKEモードの ODR 周波数の設定ビットです。
図30 SENS_CONFIG3 のレジスタビット定義
さらに ODR の値は "1001" となり、ODR = 6.25Hz で設定されていることが分かります。
図31 SENS_CONFIG3 の ODR[3..0] の定義
ログでは
FXLS8974_SENS_CONFIG3 = 10010000
となっており、SENS_CONFIG3 の [7..4] は 1001b なので、確かにモードは WAKE でODR は6.25Hz の設定になっている事が確認出来ました。
6. レジスタの値を変更してちゃんと反映されるか確認してみよう
さらに "cFxls8974ConfigNormal" を変更して、ちゃんとレジスタ値が反映されるか確認してみましょう。
変更する値は以下の様にしてみます。
- FXLS8974_SENS_CONFIG1=> "FXLS8974_SENS_CONFIG1_FSR_8G"
- FXLS8974_SENS_CONFIG3=> "FXLS8974_SENS_CONFIG3_SLEEP_ODR_50HZ"
変更した "cFxls8974ConfigNormal" は以下の様になります。
図32 変更した "cFxls8974ConfigNormal" の定数宣言
では再度 "Build" -> "Debug" して Terminal のログを確認してみましょう。
以下の様なログになりました。
図33 変更後のTerminal のログ画面
------------------
FXLS8974_SENS_CONFIG1 = 00000101
FXLS8974_SENS_CONFIG2 = 00000010
FXLS8974_SENS_CONFIG3 = 00000110
FXLS8974_INT_EN = 10000000
------------------
図28 や 図30, 図31 から確かに以下のように変更が反映されました。
- FXLS8974_SENS_CONFIG1 の FSR (2ビット目、1ビット目) は 10b なので、図28から
FSR = 8G の設定になっている - FXLS8974_SENS_CONFIG3 の LSB4ビットが 0110b になっており、図30 からモードは SLEEP、
図31から ODR = 50 Hz の設定になっている
このように "fxls8974cf_poll.c" を編集することにより、レジスタ値を確認したり変更が反映されることが確認できました。
7. まとめ
今回の記事では NXP社が用意しているサンプルデザインを用いて、ログの確認ポイント点、レジスタ値確認のための
ソースコードの編集すべき点、レジスタ値を変更してちゃんと反映されているか確認する点などを具体的な画面を
お見せしながら解説しました。
今回の記事を通じて、NXP社が用意しているサンプルデザインは事前にレジスタ設定などが行われているため、
少ないソースコードの編集によりレジスタ値の変更が容易に出来ることがお分かり頂けたかと思います。
実際に製品開発をする時は、サンプルデザインをうまく流用して迅速な開発が出来るように参考にしてみましょう。
ヒント:センサーデバイスを動作させる場合は必ずマイコンを使用します。マイコンの基本的な使い方を知りたい場合は「NXP マイコン初心者ガイド」がとても参考になります。以下の URL にマイコン初心者ガイドのリンク集がありますので併せて参考にして下さい。
[NXP 加速度センサー初めてガイド 1] | 準備中。。。 | ||
NXP マイコン 初心者ガイドまとめ |