2134089_ja-JP

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

2134089_ja-JP

2134089_ja-JP

i.MX9 の 24 MHz TPM クロックで TPM 入力キャプチャが大きな距離値 (約 12 メートル) を返すのはなぜですか?

NXPコミュニティの皆様、こんにちは。

私はi.MX93 (Cortex-M33)を使用しており、 TPM 入力キャプチャを使用して超音波距離センサ (HC-SR04 など)をインターフェースしようとしています。TPM3 (チャネル 2 の入力キャプチャ) を使用して、ECHO ピンの立ち上がりエッジと立ち下がりエッジ間のパルス幅を測定しています。

TPM クロックは24 MHzに設定されており、距離は次の式を使用して計算されます。


float timeUs = (ティック / tpmClk) * 1e6 ;
浮動小数点距離Cm = timeUs / 58.0f ;

参考までに、ここに完全なコードを示します:-

#include "fsl_debug_console.h"
#include "board.h"
#include "app.h"
#include "fsl_tpm.h"
#include "fsl_rgpio.h"
#include "fsl_lpuart.h"

/****************************************************************************************
* 定義
**********************************************************************************/

/****************************************************************************************
* プロトタイプ
**********************************************************************************/

/****************************************************************************************
* 変数
**********************************************************************************/
揮発性ブールtpmIsrFlag = false ;
揮発性uint32_t立ち上がり時間 = 0 ;
揮発性uint32_t落下時間 = 0 ;
揮発性ブールgotRisingEdge = false ;

/****************************************************************************************
* コード
**********************************************************************************/
void Init_LPUART( void )
{
lpuart_config_t 設定;

/* デフォルトの UART 設定を取得します (8N1、パリティなし、フロー制御なし) */
LPUART_GetDefaultConfig(&config);

/* 必要に応じてパラメータを変更します */
config.baudRate_Bps = 115200U ;
config.enableTx = true ;
config.enableRx = true ;

/* 指定されたパラメータでUARTを初期化します */
LPUART_Init( BOARD_LPUART 、&config、 BOARD_LPUART_CLK_FREQ );
}

float CalculateDistance( void )
{
    uint32_tティック;
    下降時間 >= 上昇時間の場合
ticks = 下降時間 - 上昇時間;
    それ以外
ticks = ( TPM_MAX_COUNTER_VALUE ( DEMO_TPM_BASEADDR ) - risingTime) + fallsTime; /* オーバーフロー処理 */

    float tpmClk = CLOCK_GetIpFreq( LPTPM_CLOCK_ROOT ); /* TPMクロックに調整できます */
    float timeUs = (ティック * 1.0f / tpmClk) * 1e6 ;
    PRINTF ( "TPM クロック: %.2f\r\n" ,tpmClk);

    浮動小数点距離Cm = timeUs / 58.0f ;

    distanceCmを返します
}

voidセットアップ( void )
{
rgpio_pin_config_t out_config ={
        kRGPIO_デジタル出力
        0 ,
};
   
/* トリガーピン */
RGPIO_PinInit( BOARD_RGPIO TRIG_PIN 、 &out_config);
RGPIO_PinWrite( BOARD_RGPIO , TRIG_PIN , 0 );
}

void SendTrigPulse( void )
{
RGPIO_PinWrite( BOARD_RGPIO TRIG_PIN 1 );
SDK_DelayAtLeastUs( 10 , SystemCoreClock);
RGPIO_PinWrite( BOARD_RGPIO , TRIG_PIN , 0 );
}

void TPM_INPUT_CAPTURE_HANDLER ( void )
{
    uint32_tステータス = TPM_GetStatusFlags( DEMO_TPM_BASEADDR );

    if (ステータス & TPM_CHANNEL_FLAG )
    {
        uint32_tキャプチャされた値 = TPM_GetChannelValue( DEMO_TPM_BASEADDR BOARD_TPM_INPUT_CAPTURE_CHANNEL );

        if (!gotRisingEdge)
{
立ち上がり時間 = キャプチャされた値;
gotRisingEdge = true ;

            // 立ち下がりエッジ検出に切り替える
TPM_SetupInputCapture( DEMO_TPM_BASEADDR BOARD_TPM_INPUT_CAPTURE_CHANNEL kTPM_FallingEdge );
     }
        それ以外
{
落下時間 = キャプチャされた値;
tpmIsrFlag = true ;
gotRisingEdge = false ;

            // 次の測定では立ち上がりエッジ検出に戻る
TPM_SetupInputCapture( DEMO_TPM_BASEADDR BOARD_TPM_INPUT_CAPTURE_CHANNEL kTPM_RisingEdge );
     }

        // このチャネルの割り込みフラグをクリアする
TPM_ClearStatusFlags( DEMO_TPM_BASEADDR TPM_CHANNEL_FLAG );
   }

    SDK_ISR_EXIT_BARRIER ;
    // tpmIsrFlag = true;

    // /* 割り込みフラグをクリアします。*/
    // TPM_ClearStatusFlags(DEMO_TPM_BASEADDR、TPM_CHANNEL_FLAG);
    // SDK_ISR_EXIT_BARRIER;
}

/*!
* @briefメイン関数
*/
int main( void )
{
tpm_config_t tpmInfo;

/* ボードピン、クロック、デバッグコンソールの初期化 */
BOARD_InitHardware();

SetUp(); /* GPIO をセットアップする */

    // Init_LPUART(); /* もう1つのUARTを初期化します */

/* 端末にメモを印刷する */
    PRINTF ( "\r\nTPM入力キャプチャの例\r\n" );
    PRINTF ( "\r\n入力信号が受信されると、入力キャプチャ値が出力されます\r\n" );

TPM_GetDefaultConfig(&tpmInfo);

/* TPMモジュールを初期化する */
TPM_Init( DEMO_TPM_BASEADDR , &tpmInfo);

/* TPMチャネルで入力キャプチャを設定する */
TPM_SetupInputCapture( DEMO_TPM_BASEADDR BOARD_TPM_INPUT_CAPTURE_CHANNEL kTPM_RisingEdge );

/* タイマーをフリーランニングモードに設定する */
TPM_SetTimerPeriod( DEMO_TPM_BASEADDR , TPM_MAX_COUNTER_VALUE ( DEMO_TPM_BASEADDR ));

/* 2番目のエッジが検出されたときにチャネル割り込みを有効にする */
TPM_EnableInterrupts( DEMO_TPM_BASEADDR TPM_CHANNEL_INTERRUPT_ENABLE );

/* NVIC で有効にする */
EnableIRQ( TPM_INTERRUPT_NUMBER );

TPM_StartTimer( DEMO_TPM_BASEADDR , kTPM_SystemClock );

    一方 1
    {
tpmIsrFlag = false ;

送信トリガパルス();

        while (!tpmIsrFlag)
{
            __NOP (); // キャプチャを待つ
     }

        フロート距離 = CalculateDistance();
        PRINTF ( "上昇時刻: %u\r\n" ,上昇時刻);
        PRINTF ( "落下時間: %u\r\n" ,落下時間);
        PRINTF ( "距離: %.2f cm\r\n" , 距離);

SDK_DelayAtLeastUs( 60000 ,SystemCoreClock);
   }
}
 

しかし、壁がセンサのすぐ近くにある場合でも (たとえば、<50 cm)、一貫して1228 cm ~ 1260 cm 程度の距離値が得られており、これは異常に大きい値です。以下にいくつかの例を示します。

TPM Clock : 24000000.00
RisingTime : 1172965159
FallingTime : 1174675524
Distance: 1228.71 cm

TPM Clock : 24000000.00
RisingTime : 1283028325
FallingTime : 1284738837
Distance: 1228.82 cm

TPM Clock : 24000000.00
RisingTime : 1448107508
FallingTime : 1449851665
Distance: 1252.99 cm

TPM Clock : 24000000.00
RisingTime : 269392922
FallingTime : 269436317
Distance: 31.17 cm

TPM Clock : 24000000.00
RisingTime : 278665048
FallingTime : 278708444
Distance: 31.18 cm

TPM Clock : 24000000.00
RisingTime : 287937289
FallingTime : 287977974
Distance: 29.23 cm

TPM Clock : 24000000.00
RisingTime : 297205949
FallingTime : 297248662
Distance: 30.68 cm

TPM Clock : 24000000.00
RisingTime : 306477012
FallingTime : 306519726
Distance: 30.69 cm

これらの値が一貫して大きすぎる理由はわかりません。


i.MX93EVK


クロック|タイマーRe: Why is TPM input capture returning large distance values (~12 meters) with 24 MHz TPM clock on iご返信ありがとうございます!Re: Why is TPM input capture returning large distance values (~12 meters) with 24 MHz TPM clock on i

こんにちは、

TPM入力キャプチャを使用したHC-SR04超音波センサーから得られる大きな距離値(約12メートル)は、多くの場合、信号のパルス幅測定が不正確であることに起因しています。センサーはエコーパルスの持続時間を計測することで距離を測定しますが、測定にトリガーパルスが含まれている場合や、その他の不正確な点がある場合、距離測定値が実際よりも高くなってしまう可能性があります。 

 
考えられる原因と解決策の内訳は次のとおりです。
1. パルス幅測定の誤り:
  • トリガーパルス付属:
    入力キャプチャは、エコー パルス自体だけでなく、トリガー パルスの立ち上がりエッジからエコー パルスの立ち下がりエッジまでの時間をキャプチャしている可能性があります。 
     

  • ソリューション:
    入力キャプチャがエコーパルスの持続時間のみを測定するように設定されていることを確認してください。通常、タイマーを設定してエコー信号の立ち上がりエッジでトリガーし、立ち下がりエッジをキャプチャします。 
     

2. 信号干渉:
  • 早期エコー検出:
    センサのレシーバは、トランスミッタからの信号が物体に反射する前にそれを検出し、不自然に長いパルス幅を生み出す可能性があります。 
     

  • 斜め反射:
    角度のある表面からの反射により、エコー信号が弱くなったり遅延したりして、距離の読み取りが不正確になるCANがあります。 
     
  • ソリューション:
    • シールド:早期検出を最小限に抑え、信号の方向性を向上させるために、トランスミッタとレシーバの上に小さなチューブまたはシュラウドを使用します。 
       
  • 複数の読み取り:複数の読み取りを行い、過度に大きい値を除外するか、平均を計算します。 
     
  • NewPing ライブラリ:これらの問題に対処するために設計された NewPing ライブラリの使用を検討してください。 
4. ソフトウェアの実装:
  • タイマー設定:
    タイマー プリスケーラまたはクロックの設定が正しくないと、パルス幅測定の精度に影響するCANがあります。 
     
    Ping間の遅延:
    センサには ping 間の最小時間があり、これを超過すると読み取り結果が不正確になる可能性があります。 
     

  • ソリューション:
    • タイマー設定の確認:正確な時間測定を確実に行うために、タイマーのプリスケーラとクロックの構成を確認します。 
       
  • 適切な遅延:センサがリセットされて安定できるように、ping 間に十分な遅延を確保します。 
     
     
    よろしくお願いします。
     
Tags (1)
No ratings
Version history
Last update:
‎11-22-2025 12:03 AM
Updated by: