ねえ皆さん
この記事では、新しい Xtrinsic FXLS8471Qデジタル加速度センサーの簡単なベアメタルの例のコードについて説明します。私は、2013年に導入されたXtrinsicセンサの多くをFXLS8471Q搭載した最近リリースされた FRDM-FXS-MULTI(-B)センサ拡張ボードを、フリースケールの FRDM-KL25Z開発プラットフォームと組み合わせて使用しました。FreeMASTERツールは、SPIインターフェースを介した割り込み手法を使用して、FXLS8471Qから読み取られた加速度データを視覚化するために使用されます。
このサンプルでは、次のことを示しています。
1. MKL25Z128 MCU(主にSPIおよびPORTモジュール)の初期化。
2. SPIデータの書き込みおよび読み取り操作。
3.最高の解像度を達成するための加速度計の初期化。
4. AN4069に基づく簡単なオフセットキャリブレーション。
5. 割り込み技術を使用してデータを読み出して出力します。
6. レジスタ0x01 – 0x06からの出力値をg単位の実際の加速度値に変換します。
7. FreeMASTERツールでの出力値の視覚化。
1.FRDM-FXS-MULTI(-B)/FRDM-KL25Zの回路図と下の画像でわかるように、SPI信号はKL25Z MCUのSPI0モジュールにルーティングされ、INT1出力はPTA5ピンに接続されます(センサーボードのJ6のピン2-3がジャンパーを使用して一緒に接続されていることを確認してください)。PTD0ピン(チップセレクト)はSPI0モジュールによって自動的に制御されないため、汎用出力として構成されています。FXLS8471QのINT1出力はプッシュプルアクティブLOW出力として構成されているため、対応するPTA5ピン構成は、立ち下がりエッジに割り込みがあるGPIOです。コア/システム・クロック周波数は20.97MHz、SPIクロックは524.25kHzです。
したがって、MCUは次のように構成されます。
void MCU_Init(void)
{
SPI0モジュールの初期化
SIM_SCGC4 |= SIM_SCGC4_SPI0_MASK; SPI0モジュールへのクロックをオンにします
SIM_SCGC5 |= SIM_SCGC5_PORTD_MASK; ポートDモジュールへのクロックをオンにします
PORTD_PCR1 = PORT_PCR_MUX(0x02); PTD1ピンはSPI0 CLKライン
PORTD_PCR2 = PORT_PCR_MUX(0x02); PTD2ピンはSPI0 MOSIライン
PORTD_PCR3 = PORT_PCR_MUX(0x02); PTD3ピンはSPI0 MISOライン
PORTD_PCR0 = PORT_PCR_MUX(0x01); PTD0ピンはGPIOとして構成されています(CSラインは手動で駆動されます)
GPIOD_PSOR |= GPIO_PSOR_PTSO(0x01); PTD0 = 1 (CS 非アクティブ)
GPIOD_PDDR |= GPIO_PDDR_PDD(0x01); PTD0ピンはGPIO出力
SPI0_C1 = SPI_C1_SPE_MASK | SPI_C1_MSTR_MASK; // Enable SPI0 module, master mode
SPI0_BR = SPI_BR_SPPR(0x04) |SPI_BR_SPR(0x02); ボーレート = バスクロック / ((SPPR+1) * 2^(SPR+1)) = 20970000 / ((4+1) * 2^(2+1)) = 524.25 kHz
PTA5ピン(FXLS8471QのINT1に接続)を立ち下がりエッジ割り込み用に構成します
SIM_SCGC5 |= SIM_SCGC5_PORTA_MASK; ポートAモジュールへのクロックをオンにします
PORTA_PCR5 |= (0|PORT_PCR_ISF_MASK| 割り込みフラグをクリアする
PORT_PCR_MUX(0x1)| // PTA5はGPIOとして構成されています
PORT_PCR_IRQC(0xA)); PTA5 は立ち下がりエッジ割り込み用に構成されています
NVICでのPORTA割り込みの有効化
NVIC_ICPR |= 1 << ((INT_PORTA - 16) % 32);
NVIC_ISER |= 1 << ((INT_PORTA - 16) % 32);
}
2. FXLS8471Qは「モード0」SPIプロトコルを使用しており、クロック信号の非アクティブ状態がローであり、データはクロック信号のリーディングエッジでキャプチャされ、立ち下がりエッジで変更されます。
SA1/CS_Bピンの立下りエッジがSPI通信を開始します。書き込み操作は、R/Wビットに1を送信することで開始されます。次に、8ビットレジスタアドレスADDR[7:0]が1番目と2番目のシリアル化されたバイトにエンコードされます。書き込まれるデータは、シリアル化された 3 番目のバイトから開始されます。ビットの順序は次のとおりです。
Byte 0: R/W, ADDR[6], ADDR[5], ADDR[4], ADDR[3], ADDR[2], ADDR[1], ADDR[0]
Byte 1: ADDR[7], X, X, X, X, X, X, X
Byte 2: DATA[7], DATA[6], DATA[5], DATA[4], DATA[3], DATA[2], DATA[1], DATA[0]
SA1/CS_Bピンの立ち上がりエッジはSPI通信を停止します。
以下は、CTRL_REG1(0x3A)に値0x3Dを書き込む書き込み操作です。
同様に、読み取り操作は、R/W ビットに 0 を送信することによって開始されます。次に、8ビットレジスタアドレスADDR[7:0]が1番目と2番目のシリアル化されたバイトにエンコードされます。データはMISOピンから読み取られます(MSBが最初に)。
以下のスクリーンショットは、WHO_AM_Iレジスタ(0x0D)から正しい値0x6Aを読み取る読み取り操作を示しています。
複数の読み取り操作は、1 つの読み取りと同様に実行されます。ただし、8 つの SCLK サイクルの倍数でバイトが読み取られる点が異なります。レジスタ アドレスは自動インクリメントされるため、次のクロック エッジの 8 つごとに次のレジスタの MSB がラッチされます。
レジスタ0x01から0x06への6バイトのバースト読み出しを以下に示します。また、加速度出力データを読み出すことでINT1ピンが自動的にクリアされる様子も示しています。
3. 初期化の開始時に、CTRL_REG2レジスタのRSTビットを設定して、すべての加速度計レジスタをデフォルト値にリセットする必要があります。ただし、ソフトウェアのリセットは、 FXLS8471Qデータシートの付録Aで説明されているように、SPIモードでは正しく機能しません。したがって、ソフトウェアのリセットを実行する次のコードは使用しないでください。代わりに、FRDM-FXS-MULTI-BボードのR46を短縮して、ハードウェアリセットをアクティブにしました。
ダイナミックレンジは±2gに設定され、最高の分解能を達成するために、LNOISEビットが設定され、最低ODR(1.56Hz)と高解像度モードが選択されます(詳細は AN4075を参照)。DRDY割り込みはイネーブルされ、プッシュプルのアクティブロー出力に設定されたINT1割り込みピンに送られます。
void FXLS8471Q_Init (void)
{
符号なし文字 reg_val = 0;
/* 付録 A で説明されているように、SPI モードではソフトウェア リセットが正しく機能しません
FXLS8471Qデータシートのしたがって、次のコードは使用されません。
FRDM-FXS-MULTI-BボードのR46を短縮して、ハードウェアリセットをアクティブにしました。*/
/*FXLS8471Q_WriteRegister(CTRL_REG2, 0x40); すべてのレジスタをPOR値にリセット
一時停止(0x631); ~1msの遅延
do // RSTビットがクリアされるのを待ちます
{
reg_val = FXLS8471Q_ReadRegister(CTRL_REG2) & 0x40;
} while (reg_val);*/
FXLS8471Q_WriteRegister(XYZ_DATA_CFG_REG、0x00); +/-2gレンジ、~0.244mg/LSB
FXLS8471Q_WriteRegister(CTRL_REG2、0x02); 高解像度モード
FXLS8471Q_WriteRegister(CTRL_REG3、0x00); プッシュプル、アクティブ LOW 割り込み
FXLS8471Q_WriteRegister(CTRL_REG4, 0x01); DRDY割り込みをイネーブルにする
FXLS8471Q_WriteRegister(CTRL_REG5, 0x01); INT1 - PTA5 にルーティングされた DRDY 割り込み
FXLS8471Q_WriteRegister(CTRL_REG1、0x3D); ODR=1.56Hz、ノイズ低減、アクティブモード
}
4. AN4069に準拠したシンプルなオフセットキャリブレーション方法が実装されています。
ボイドFXLS8471Q_Calibration(ボイド)
{
char Xoffset, Yoffset, Zoffset;
データレディ = 0;
一方 (!DataReady){} // 最初のデータセットは準備ができていますか?
データレディ = 0;
FXLS8471Q_WriteRegister(CTRL_REG1、0x00); スタンバイモード
FXLS8471Q_ReadMultiRegisters(OUT_X_MSB_REG、6、AccData); データ出力レジスタの読出し 0x01-0x06
Xout_14_bit = ((ショート) (AccData[0]<<8 |AccData[1])) >> 2; 14ビットX軸出力値を計算
Yout_14_bit = ((ショート) (AccData[2]<<8 |AccData[3])) >> 2; 14ビットY軸出力値を計算
Zout_14_bit = ((ショート) (AccData[4]<<8 |AccData[5])) >> 2; 14ビットZ軸出力値を計算
Xoffset = Xout_14_bit / 8 * (-1); X軸オフセット補正値を計算
Yオフセット= Yout_14_bit / 8 *(-1); Y 軸オフセット補正値の計算
Zオフセット=(Zout_14_bit-SENSITIVITY_2G)/ 8 *(-1); Z 軸オフセット補正値の計算
FXLS8471Q_WriteRegister(OFF_X_REG, Xoffset);
FXLS8471Q_WriteRegister(OFF_Y_REG, Yoffset);
FXLS8471Q_WriteRegister(OFF_Z_REG, Zoffset);
FXLS8471Q_WriteRegister(CTRL_REG1、0x3D); 再びアクティブモード
}
5. ISR では、割り込みフラグのみがクリアされ、新しいデータの到着を示すために DataReady 変数が設定されます。
ボイドPORTA_IRQHandler()
{
PORTA_PCR5 |= PORT_PCR_ISF_MASK; 割り込みフラグをクリアする
データレディ = 1;
}
6.加速度計レジスタ0x01〜0x06からの出力値は、最初に符号付き14ビット値に変換され、その後、g単位の実際の値に変換されます。
if (DataReady) 新しいデータセットは準備ができていますか?
{
データレディ = 0;
FXLS8471Q_ReadMultiRegisters(OUT_X_MSB_REG、6、AccData); データ出力レジスタの読出し 0x01-0x06
Xout_14_bit = ((ショート) (AccData[0]<<8 |AccData[1])) >> 2; 14ビットX軸出力値を計算
Yout_14_bit = ((ショート) (AccData[2]<<8 |AccData[3])) >> 2; 14ビットY軸出力値を計算
Zout_14_bit = ((ショート) (AccData[4]<<8 |AccData[5])) >> 2; 14ビットZ軸出力値を計算
Xout_g = ((float) Xout_14_bit) / SENSITIVITY_2G; X 軸の出力値を g で計算します
Yout_g = ((float) Yout_14_bit) / SENSITIVITY_2G; Y 軸の出力値を g で計算します
Zout_g = ((float) Zout_14_bit) / SENSITIVITY_2G; Z 軸の出力値を g で計算します
}
7. 計算された値は、Debugパースペクティブの右上にある「Variables」ウィンドウまたはFreeMASTERアプリケーションで確認できます。FreeMASTERプロジェクトを開いて実行するには、 FreeMASTER 1.4アプリケーション と FreeMASTER通信ドライバをインストールしてください。
MCUのv10.5のCW で書かれた完全なソースコード( FreeMASTERプロジェクトを含む) が添付されています。
この簡単なアプリケーションについて質問がある場合は、以下からお気軽にお問い合わせください。フィードバックや提案も大歓迎です。
よろしくお願いします。
Tomas
hi Tomas
サンプルコードを実行しようとしていますが、正しく実行されているかどうかわかりません
それが正しいかどうかを確認できますか?または私にいくつかの提案をしてください
- Code Warrior 10.6を使用しました
- R46で、ワイヤーラップ付きのブリッジを作成しましたか、それとも起動時に瞬間的にリセットする必要がありますか?
- 示したように、Code Warrior からデバッグ モード (実行中) でボードをリセットしたときにのみ、一部の値を取得します。
- その値をFreemasterツールにプロットできず、応答タイムアウトが発生します(アプリのデバッグ中)
- J6(2-3)はジャンパで接続されています
- 一度実行するか、x、y、zの値を継続的に取得します
よろしくお願いいたします
カルロス