こんにちは、みんな!読んでくださってありがとうございます!
私は FXTH87 タイヤ圧力センサに取り組んでいますが、まずリセット ソースに関して問題があります。センサが回転するたびに Z 軸加速度センサでカウントしているのですが、何らかの理由で、それをカウントするレジスタが突然ゼロに戻ります (チップ リセット)。この問題を解決するために、COP タイマーと定期的なハードウェア (PRST)、リセット ソースに取り組んできましたが、何も変わりませんでした。
一方、チップの電力消費を測定したところ、RF および UUMA ペリフェラルがオンの状態で 5mA、コード上で何も実行していない STOP1 モードで 1.48mA でした。これは非常に大きい値です。リセットの問題が、チップ内の電力、電圧などの問題で発生しているのかどうかはわかりません。電源電圧を使用しており、正常に動作していますが、チップの電力消費に問題があり、強制的にリセットされる可能性があります。
よろしくお願いいたします!
こんにちは、フアン。
私も同じことを試していますが、同じ問題が発生しています。それをどう解決しますか?(回転を測定)
ありがとう
こんにちは、Juan。これらの電流を測定するために使用した方法を説明していただけますか?電力消費量をどのように測定していますか?現在の値をどこかに記録していますか?
こんにちは、フアン。
リセットの問題が解決されたことを嬉しく思います。
- 前述の参照プロジェクトをダウンロードしたら、この回答に添付されているガイドに従ってください。第 2 章では、デバイスをプログラムする方法を説明します。このようなガイドに従って、デバイスをフラッシュしたら結果を共有していただけますか?
-リファレンス デザインに記載されている 434 MHz の FXTH87 用の標準的なリファレンス デモンストレーターを引き続き使用できます。他に何か問題があればお知らせください。
- STOP1 は、最大限の電力節約のために RAM を含むほとんどの内部回路の電源をオフにし、電圧レギュレータをスタンバイ状態にすることを意味します。15uA という電流は多すぎます。測定手順について簡単に説明していただけますか?
電源モードに基づいた電力消費を確認するには、データシートの 17.4 章を参照してください。
この情報がお役に立てれば幸いです。
よろしくお願いいたします。
デビッド
こんにちは、ありがとうございます!
はい、以前は¨firmware.h¨というライブラリを使用していたので、現在はTPMS FXTH87リファレンスプロジェクトLF RF通信CW10を使用しています。しかし、このコード例ではリセットは解決されましたが、別の問題が発生しています...チップをオフにした後、チップはコードを実行しません。つまり、コードは送信時に正常に動作し、リセットの問題はありませんが、電源をオフにしてオンにすると、コードは動作しません。
私は 433 MHz で送信するため、回路図 TPMS FXTH87 434MHz を使用しています (図 2-2)。FXTH87 434 MHzの典型的なリファレンスデモンストレーター // PDF FXTH87EDRMより)...それとも FXTH87 315 MHz の代表的なリファレンスデモンストレーター??
電力消費については、まだ同じ問題があります。Stop1 モードとペリフェラルおよびチップ外の GPIO は約 2 mA を消費しますが、少なくとも 15 uA である必要があります。この消費では実装が不可能なので、この問題を解決するのを手伝ってください。
お手数ですが、よろしくお願いいたします。
これは私が使用しているコードです
************************************************************************************** * * TPMS FXTH87 LF RF通信 * LFで受信したデータを処理します * RFフレームフォーマットとRF設定は、MKW01レシーバと互換性があります。* * ユーザー構成.h: ユーザーが設定できるデモパラメータが含まれています * * MKW01_Communication.c : 受信した LF フレームを処理し、それに応じてコマンドを実行する関数が含まれています * ************************************************************************************/ /* ******************************************************************************************** * * Main.c- コードはここに保存されます。* ************************************************************************************ */ #include/* EnableInterruptsマクロ用 */ #include "derivative.h"/* ペリフェラルの宣言をインクルードする */ #include "main.h"#include "user_configuration.h" #include "dal.h"#include "szk_lf_data_detect.h" #include "szk_ff_tpm.h"#include "MKW01_Communication.h" #include "LED.h"/* **************************************************************************************** * * MAIN * * user_configuration.h でデモパラメータを選択します* ********************************************************************************** */ /* 注意: LED5 と LED6 は PTB0 と PTB1 によって駆動され、これらは LF ブロックでも優先的に使用されます。 * SO、LF ブロックがオンの場合、LED5 と LED6 は使用できません。* user_configuration.h で LED を使用するかどうかを選択します。*/ unsigned long i=0; unsigned int c=0; int PACCZ=0,PACCX=0,P=0; UINT8 RESET @ 0x1800; UINT16 Z=0; UINT8 u8Status=0x00; UINT16 gu16UUMA[5];// @ 0x01A1; UINT16 u16CompPressure; UINT16 u16CompAccelZ; UINT16 FrameID; UINT32 Tire_ID; UINT8 Firmware_Version; UINT8 Derivative_Descriptor; UINT8 TPMS_ID[6]; UINT8 LFDatagram[5]; UINT16 u16CompAccelX; //UINT8 TPMS_CONT_ACCEL_GV @ 0x008Eu; /* 組み込みファームウェアがこの場所にマップします */ //UINT8 TPMS_INTERRUPT_FLAG @ 0x008Fu; /* 組み込みファームウェアがこの場所にマップします */ UINT32 vueltas=0; ////////////////////////////////////////////////////////////////////////////////////////////////////////////// UINT8 au8RFDataForCS[15] @ 0x0091; // 最大長は 32 バイトです。RF バッファーのサイズ (バイト単位) void vfnSetupMCU(void); void RF_Setup(void); void InitTPM1CH0(void); void Send_RF_Datagram(void); void Code_Manchester_Frame(unsigned char *ptr); void vfnSetSTOPMode(UINT8 u8Mode); void tire_ID(void); void Init_LF(void); void Decode_LF_Datagram(void); void vfnSetPWU(void); void main(void) { UINT8 u8LFCount; UINT8 u8LFFirst; // DisableInterrupts; u8LFFirst = LFDATA; /* セットアップ用に GPIO を設定 */ vfnSetupGPIO(); vfnSetupMCU(); vfnSetPWU(); RF_Setup();i=0; while(i<200){i++;}i=0; // 5000(400ms) -- 12500(1s) tire_ID(); vueltas=0;PACCZ=0;PACCX=0;c=0; // EnableInterrupts; for (;;) { __RESET_WATCHDOG(); /* 犬に餌をやる */////////////////////////////////////////////////////////////////////////////////////// RESET = CLEAR; // while(i<10000){i++;}i=0; // 5000(400ms) -- 12500(1s) // c++; // while(i<10000){i++;}i=0; // 5000(400ms) -- 12500(1s) // c++; RFCR2=0x0E; RFCR7_RFIACK = SET; // u8Status=TPMS_READ_VOLTAGE(gu16UUMA); u8Status=TPMS_READ_TEMPERATURE(gu16UUMA); u8Status=TPMS_READ_PRESSURE(gu16UUMA,4); // u8Status=TPMS_READ_ACCEL_X(gu16UUMA,2,0,7); u8Status=TPMS_READ_ACCEL_Z(gu16UUMA,2,0,7); //TPMS_READ_ACCEL_Z(gu16UUMA,2,0,7); u8Status=TPMS_COMP_PRESSURE(&u16CompPressure,gu16UUMA); P=u16CompPressure>>1; u8Status=TPMS_COMP_ACCEL_Z(&u16CompAccelZ,gu16UUMA); //TPMS_COMP_ACCEL_Z(&u16CompAccelZ,gu16UUMA); PACCZ=u16CompAccelZ>>1; Z=gu16UUMA[4]; // Z=gu16UUMA[4]; // u8Status=TPMS_READ_ACCEL_X(gu16UUMA,2,0,7); //TPMS_READ_DYNAMIC_ACCEL_Z(1,&u8Offset,UUMA); // u8Status=TPMS_COMP_ACCEL_X(&u16CompAccelX,gu16UUMA); // PACCX=u16CompAccelX>>1; while(Z<315) //<27 Z<315 // Z<309 (X) { // DisableInterrupts; RFCR2=0x0E; RFCR7_RFIACK = SET; // すべてのフラグをクリアします // RESET = CLEAR;__RESET_WATCHDOG(); /* 犬に餌をやります */ // u8Status=TPMS_READ_VOLTAGE(gu16UUMA); u8Status=TPMS_READ_TEMPERATURE(gu16UUMA); u8Status=TPMS_READ_PRESSURE(gu16UUMA,4); // u8Status=TPMS_READ_ACCEL_X(gu16UUMA,2,0,7); u8Status=TPMS_READ_ACCEL_Z(gu16UUMA,2,0,7); //TPMS_READ_ACCEL_Z(gu16UUMA,2,0,7); u8Status=TPMS_COMP_ACCEL_Z(&u16CompAccelZ,gu16UUMA); //TPMS_COMP_ACCEL_Z(&u16CompAccelZ,gu16UUMA); PACCZ=u16CompAccelZ>>1; // PTBD=1; //X=UUMA[3]; Z=gu16UUMA[4]; // Z=gu16UUMA[4]; // while(i<200){i++;}i=0; // 5000(400ms) -- 12500(1s) //////////// Send_RF_Datagram();TPMS_RF_WRITE_DATA_REVERSE(sizeof(au8RFDataForCS), &au8RFDataForCS[0u], 0); // TPMS_RF_READ_DATA_REVERSE(sizeof(READBuff), &READBuff[0], 0); // while(i<350){i++;}i=0; // 5000(400ms) -- 12500(1s) /////////// RFCR2 = 0x8E; // TPMS_RF_SET_TX(119); while(i<500){i++;}i=0; // 5000(400ms) -- 12500(1s) //////// i<400 } while(Z>295) //>17 Z>295 // Z>295 (X) { // DisableInterrupts; RFCR2=0x0E; RFCR7_RFIACK = SET; // すべてのフラグをクリアします // RESET = CLEAR;__RESET_WATCHDOG(); /* 犬に餌をやります */ // u8Status=TPMS_READ_VOLTAGE(gu16UUMA); u8Status=TPMS_READ_TEMPERATURE(gu16UUMA); u8Status=TPMS_READ_PRESSURE(gu16UUMA,4); // u8Status=TPMS_READ_ACCEL_X(gu16UUMA,2,0,7); u8Status=TPMS_READ_ACCEL_Z(gu16UUMA,2,0,7); //TPMS_READ_ACCEL_Z(gu16UUMA,2,0,7); u8Status=TPMS_COMP_ACCEL_Z(&u16CompAccelZ,gu16UUMA); //TPMS_COMP_ACCEL_Z(&u16CompAccelZ,gu16UUMA); PACCZ=u16CompAccelZ>>1; // PTBD=0; //Z=UUMA[4]; Z=gu16UUMA[4]; // Z=gu16UUMA[4]; // while(i<200){i++;}i=0; // 5000(400ms) -- 12500(1s) /////////// Send_RF_Datagram();TPMS_RF_WRITE_DATA_REVERSE(sizeof(au8RFDataForCS), &au8RFDataForCS[0u], 0); // TPMS_RF_READ_DATA_REVERSE(sizeof(READBuff), &READBuff[0], 0); // while(i<350){i++;}i=0; // 5000(400ms) -- 12500(1s) /////////// RFCR2 = 0x8E; // TPMS_RF_SET_TX(119); while(i<500){i++;}i=0; // 5000(400ms) -- 12500(1s) //////// i<400 } vueltas++; //// Turn it around } } /* ************************************************************************************ * * vfnSetSTOPMode * ************************************************************************************ */ void vfnSetSTOPMode(UINT8 u8Mode) { /* 表 3-1.ストップ モードの選択 SIMPOT1 SPMSC2 SPMSC1 BDCSCR STOPE PDC LVDE & LVDSE ENBDM ストップ モード 0 x x x ストップ モードは無効です。STOP 命令が実行されると不正なオペコードがリセットされます。1 1 0 0 Stop1 1 x 1 x Stop4 1 x x 1 BDM 付き Stop4 */ if (u8Mode == STOP1 ) { SPMSC2 |= SPMSC2_PDC_MASK; SPMSC1 = (SPMSC1 | SPMSC1_LVDE_MASK) & (UINT8) (~((UINT8) (SPMSC1_LVDSE_MASK | SPMSC1_BGBE_MASK))); } else if (u8Mode == STOP4 ) { SPMSC2 |= SPMSC2_PDC_MASK; /* 正確な ADC 測定のために BGBE を使用します */ SPMSC1 |= (SPMSC1_LVDSE_MASK | SPMSC1_LVDE_MASK | SPMSC1_BGBE_MASK); } else { /* 何もしない */ } } /* ************************************************************************************ * * vfnSetPWU * ************************************************************************************ */ void vfnSetPWU(void) { /* 定期的なウェイクアップ用に PWU を構成します */ PWUCS0 = 0x1Fu; PWUCS1 = CLEAR; PWUDIV = 0x1Fu; return; } /* ************************************************************************************ * vfnSetupGPIO ******************************************************************************* */ void vfnSetupGPIO(void) { // すべての GPIO は入力です PTADD = 0x00; PTBDD = 0x00; // SIMOPT1 = 0X33;//0x33//WDT を無効、デバッグ BDM を有効に、停止を有効に、RF (DIS)(En) 有効。0x23(RF 無効) 0x21(デバッグなし) // SIMOPT2 = 0X00; // 0x00 クロック BUSCLK 4Mhz // 0X73 //0X03 // /*BUSCLKS 00 bUS fREQUENCY = 4Mhz*/ // SRS = 0x00; // PWUCS1 = 0x00; return; } //////////////////////////////////////////////////////// ///////////////////////////////////////////////////////// void vfnSetupMCU(void)//FXTH87 の初期設定のアーカイブ { SIMOPT1 = 0X33;//0x33//WDT を無効にし、デバッグ BDM を有効にし、停止を有効にし、RF を有効にします。0X13 0x11 ////// 0X31 SIMOPT2 = 0X00; // 0x00 クロック BUSCLK 4Mhz // 0X70 /*BUSCLKS 00 bUS fREQUENCY = 4Mhz*/ // SRS = 0x00; // PWUCS1 = 0x00; } void RF_Setup(void) { // DisableInterrupts; // TPMS_RF_ENABLE(1); RFCR0 = 0x33; //0x33 データは9615.4 bpsで送信されました // 0x19 (19230.8bps) RFCR1 = 0x77; //0x64 を 56 ビットの場合は 38 に設定 RFCR2 = 0x0E; // RF 送信オフ - EOM なし - Pout=8dBm - RPAGE=0 // 00001110 0x14 // RFCR2 = 0x8E; //RF 送信オン - EOM なし - Pout=8dBm - RPAGE=0 0x94 RFCR3 = 0x00; //0x00 RF 出力低 - RF パワーアップ - 1 つのフレームが送信されました // 00000000 RFCR4 = 0x05; //0x05 インターフレーム タイミングを 5ms に設定 /////////////////////////////////////////////////////////////////////// RFCR5 = 0x00; //0x80 疑似乱数は使用されていません VCO の最大電力消費レベル RFCR6 = 0x01; //VCO 最大電力 - インターフレーム タイミング // は 00 でした RFCR7 = 0x00; // RF 割り込み有効 (無効) - LVD 無効 - RFM リセットなし // fDATA0=fXTAL x ((12 + 4 x CF) + AFREQ/8192) // = 26MHz x((12 + 4 x 1) + 5644 (10110000 01100) /8192) /// 5009 (10011101 10001) 431.8977MHz // = 433.9131 // fDATA1=fXTAL x ((12 + 4 x CF) + BFREQ/8192) // = 26MHz x((12 + 4 x 1) + 5674 (10110001 01010) /8192) /// 5041 (10011100 10001) 432.0024MHz // = 434.0083 // 434.0083 - 433.9131 = 47.6kHz(x2 95.2 kHz) /* 434MHz */ PLLCR0=0x9D;// 0xB0 1011 0000 // 0x9D (431.8977MHz)// AFREQ[12:5] PLLCR1=0x8E;// 0x62 01100 0 10 // 0x8E (431.8977MHz)(POL=1) 8A (POL=0) // AFREQ[4:0] POLコード[1:0] PLLCR2=0x9C;// 0xB1 10110001 // 0x9C (432.0024MHz)PLLCR3=0x8E;// 0x56 01010 110 CF=1 434MHz MOD=1 FSK CKREF=0 DX信号は生成されません // 0x8E (432.0024MHz)//PLLCR3=0x54; // 01010 100 CF=1 434MHz MOD=0 OOK CKREF=0 DX信号は生成されません // EnableInterrupts; } void InitTPM1CH0(void) { TPM1SC=0x08 | 0x02;// 4F CLOCK TIMER = FBUS=8MHz/128 - タイマーをオンに設定します TPM1C0SC=0x00; //TBMで設定し、割り込み有効アドレスを設定します TPM1MODH=0xFF; // FF OCを1.13秒ごとに固定します TPM1MODL=0xFF;// FF OCを1.13秒ごとに固定します } void Send_RF_Datagram(void) { //unsigned char i; //DisableInterrupts; /* MC33696 の特定のデータ */ au8RFDataForCS[0]=0xAA; au8RFDataForCS[1]=0xAA; // AA 10101010 は、残りが DATA の au8RFDataForCS[2]=0xAA であることを理解するために必要です。 // (UINT8) (ブエルタス >> 24u); // /* MC33696 の特定データの終わり */ au8RFDataForCS[3]=(UINT8) (u16CompPressure >> 8u); // 圧力 kPA au8RFDataForCS[4]=(UINT8) (u16CompPressure); // 圧力 kPA au8RFDataForCS[5]=0xAA; au8RFDataForCS[6]=(UINT8) (vueltas >> 16u); // au8RFDataForCS[7]=(UINT8) (vueltas >> 8u); au8RFDataForCS[8]=(UINT8) (ブエルタス); au8RFDataForCS[9]=(UINT8) (タイヤ ID >> 24u); // タイヤ ID au8RFDataForCS[10]=(UINT8) (タイヤ ID >> 16u); // タイヤ ID au8RFDataForCS[11]=(UINT8) (タイヤ ID >> 8u); // タイヤ ID au8RFDataForCS[12]=(UINT8) (タイヤ ID); // タイヤID au8RFDataForCS[13]=0xAA; // (UINT8) (ブエルタス >> 24u); // au8RFDataForCS[14]=0xAA; //au8RFDataForCS[15u]=(UINT8) (PACCZ); //au8RFDataForCS[16u]=0xAA; //RFD21=Tx; //RFD32=Tx; InitTPM1CH0(); //RFCR7_RFIACK=1; // すべてのフラグをクリアします //while(i<2500){i++;}i=0; // 5000(400ms) -- 12500(1s) //EnableInterrupts; } void tire_ID(void) { TPMS_READ_ID (TPMS_ID); // 実行時間 = 512µs Firmware_Version = TPMS_ID[0]; Derivative_Descriptor = TPMS_ID[1]; Tire_ID = 0; Tire_ID |= TPMS_ID[2]; Tire_ID <<= 8; Tire_ID |= TPMS_ID[3]; Tire_ID <<= 8; Tire_ID |= TPMS_ID[4]; Tire_ID <<= 8; Tire_ID |= TPMS_ID[5]; } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /* ******************************************************************************************** * * ファイルの終了。* ************************************************************************************ */
こんにちは、フアン。
問題をより深く理解するために、以下の情報を確認してください。
- TPMS FXTH87 リファレンス プロジェクト LF RF 通信 CW10 を 使用していますか?
- デバイス接続のリファレンスとして、 回路図 TPMS FXTH870911 315MHz を 使用することを検討しましたか?
- SRS レジスターを読んでいただけますか?結果を共有していただけますか?
よろしくお願いいたします。
デビッド
ファームウェア呼び出しなしで測定値を取得する方法を誰か知っていますか?
私はリセット ソースに焦点を当てていますが、問題が発生するリセット ソースは「不正なアドレス」と「低電圧検出」の 2 つだけです。最初のもの (不正なアドレス) の方がリセットに関して責任が高くなります。「u8Status=TPMS_READ_ACCEL_Z(UUMA,2,0,7);」のようなファームウェアサブルーチンを使用しない場合、リセットの問題は解決されます...しかし、これは解決策ではないことはご存じでしょう...
私はこのチップをレシーバ RFM69HCW と通信させましたが、必要なのはチップ自体がリセットされないことだけです。