こんにちは、
車載追跡システムにMMA8451加速度センサを使用しています。
この MMA8451 を使用して動的加速度を測定するにはどうすればよいでしょうか?!
これを読んで、車載が動いているかどうかをどのように判断すればよいでしょうか?
レグ、
アムリーン
アムリーン、
現時点では何が原因なのかよく分かりませんが、その間に、組み込みのモーション検出機能の使用方法を示す簡単なベアメタルのサンプル コードを作成しました。FRDM-KL25Zボード用のCW 10.3に書かれています。
役に立つことを願っております。
よろしくお願いいたします。
トーマス
こんにちは、トーマス。
返信ありがとうございます。
PTA14 割り込みピンに関するご提案はすでに実装済みです。
私はode warrior 10.3を使用しています。プロセッサ エキスパート サービスを使用して、PTA14 ピンを割り込みとして設定しました。
割り込みピン設定ですべてのコマンドを設定した後、割り込みが発生しません。
次に、STATUSレジスタを読み取ってポーリング方法を使用しようとしました。
MMA8451_WriteReg(MMA8451_CTRL_REG_1, 0x018);//0x018 // デバイスを100 Hz ODR(10mS)、スタンバイに設定します
MMA8451_ReadReg(MMA8451_CTRL_REG_1、(uint8_t*)&xyz、1);
CTRL_REG1_データ = xyz[0];
CTRL_REG1_データ |=0x01;
MMA8451_WriteReg(MMA8451_CTRL_REG_1, 0x19); // アクティブモードを設定
MMA8451_ReadReg(0x00, (uint8_t*)&abc,1);
もしabc[0]> 0x00ならば
{
データ準備フラグ=1;
}
この場合も、data_ready_Flag は設定されていません。
また、各「MMA8451_ReadReg」関数呼び出しの間に 200 ミリ秒の遅延を追加しましたが、結果は同じです。
次に加速度センサがアクティブモードになっているかどうかを確認しました。
MMA8451_WriteReg(MMA8451_CTRL_REG_1, 0x018);//0x018 // デバイスを100 Hz ODR(10mS)、スタンバイに設定します
MMA8451_ReadReg(MMA8451_CTRL_REG_1、(uint8_t*)&xyz、1);
CTRL_REG1_データ = xyz[0];
CTRL_REG1_データ |=0x01;
MMA8451_WriteReg(MMA8451_CTRL_REG_1, CTRL_REG1_Data); // アクティブモードを設定
MMA8451_ReadReg(MMA8451_CTRL_REG_1、(uint8_t*)&abc、1);
MMA8451_CTRL_REG_1=0x18 と表示されていますが、読み取る前に 0x19 に設定しています。
デバイスがアクティブ モードになっていない理由がわかりません。
こんにちは、アムリーンさん。
まず、もっと早く返信できなかったことをお詫びします。ここ数日、オフィスを離れていました。
コードから、自由落下/モーション割り込みが有効になっていて、INT1 ピンにマッピングされていることがわかります。CTRL_REG3 レジスタの IPOL ビットと PP_OD ビットは両方ともデフォルト値になっているため、INT1 ピンはプッシュプルでアクティブ ローになります。したがって、立ち下がりエッジ割り込み用に INT1 ピンにコネクテッドの PTA14 ピンを次のように設定する必要があります。
SIM_SCGC5 |= SIM_SCGC5_PORTA_MASK; // ポートAモジュールへのクロックをオンにする
PORTA_PCR14 |= (0|PORT_PCR_ISF_MASK|
PORT_PCR_MUX(0x1)| // PTA14はGPIOとして設定されている
PORT_PCR_IRQC(0xA)); // PTA14は立ち下がりエッジ割り込みに設定されています
ソースコードの他のセクションで PTA14 ピンが初期化されている可能性があります。念のためここに記載しました。
さらに、ISRでは、 次のように書いて IRQを認識する 必要があります。 PORTA_PCR14レジスタのISFビットに 論理1を設定し ます。
PORTA_PCR14 |= PORT_PCR_ISF_MASK; // 割り込みフラグをクリアする
FF_MT_SRCレジスタを正しく読み取ってSRC_FF_MTステータスビットをクリアしていますね。ただし、ISRをできるだけ短くするために、メインループで両方のレジスタを読み取ることをお勧めします。ISRでは、IRQを確認し、メインループでモーションイベントを示す別のフラグをセットするだけです。
お役に立てれば幸いです。
よろしくお願いいたします。
トーマス
こんにちは、 Wlodek_D。
モーション検出の設定については、アプリケーションノート AN4070 を参照してください。
私はCW 10.3でFRDMボードを使用しています
私の初期化は
MMA8451_WriteReg(MMA8451_CTRL_REG_1, 0x018);
//デバイスを100 Hz ODR、スタンバイに設定する
MMA8451_WriteReg(0x15, 0xC8);
//モーション検出の設定レジスタを設定する
MMA8451_WriteReg(0x17, 0x16);
// 1gを超える動き検出
MMA8451_WriteReg(0x18, 0x0A);
// デバウンスカウンターを 100 ms/10 ms (ステップ) = 10 カウントに設定します。
MMA8451_WriteReg(0x2D, 0x04);
//システム内のモーション/自由落下割り込み機能を有効にする
MMA8451_WriteReg(0x2E, 0x04);
//モーション/自由落下割り込み関数をINT1にルーティングする
MMA8451_ReadReg(MMA8451_CTRL_REG_1、(uint8_t*)&xyz、1);
CTRL_REG1_データ = xyz[0];
CTRL_REG1_データ |=0x01;
MMA8451_WriteReg(MMA8451_CTRL_REG_1、CTRL_REG1_データ);
//アクティブモードを設定する
X軸のみにしきい値を設定しました。
電源投入時に割り込みが発生しますが、0X0Cレジスタを読み出すと、その値は0x04ではなく0x00になります。
私の割り込みルーチンは
| MMA8451_ReadReg(0x0C, (uint8_t*)&データ,1); | |
| データ[0] = = 0x04の場合 | |
| { | |
| MMA8451_ReadReg(0x16, (uint8_t*)&データ,1); | |
| Green_LED_SetVal(NULL); | |
| } |
0x0C を読み取った後、割り込みが発生しません。
間違った方向に進んでいる場合はご指導ください。
こんにちは、アムリーンさん。
車載が動いているかどうかを大まかに検出することが目的の場合は、加速度の出力しきい値を設定し、このしきい値を超えたことを移動中の車載の振動の証拠として使用できます。
正確な測定が必要な場合、タスクはより複雑になります。加速度センサによって提供される出力信号は、時間単位での速度の変化を表します。これは、車が一定の速度で動く場合(例えば20 km/h の場合、速度の変化がないため、センサによって報告される加速度はゼロになります (振動を無視した場合)。車が駐車している場合(速度変化なし)にもまったく同じ信号が報告されるため、加速度信号のみを使用して 2 つの異なる状況を区別するには、初期値(測定の初期瞬間の速度)を知る必要があります。他の情報源からの情報も使用できます(例:車輪回転検出器、速度計、前回の測定結果など)、さまざまなソリューションが考えられます。
基本的ながら役に立つ例がApp Notesで参照できます(例:AN4070、AN4068、AN4399、... ) は、MMA8451 製品概要ページ ( MMA8451Q 製品概要ページ) のドキュメント タブに掲載されています。
よろしくお願いいたします。
Wlodek_D。