このコードは超音波センサを i.mx93 (Cortex-m33) に接続するのに正しいですか? /* * 著作権 (c) 2015、Freescale Semiconductor, Inc. * 著作権 2016-2021 NXP * 無断転載を禁じます。 * * SPDXライセンス識別子: BSD-3条項 */ #include "fsl_debug_console.h" #include "board.h" #include "app.h" #include "fsl_tpm.h" #include "fsl_rgpio.h" /**************************************************************************************** * 定義 **********************************************************************************/ /**************************************************************************************** * プロトタイプ **********************************************************************************/ /**************************************************************************************** * 変数 **********************************************************************************/ 揮発性ブールtpmIsrFlag = false ; 揮発性uint32_t立ち上がり時間 = 0 ; 揮発性uint32_t落下時間 = 0 ; 揮発性ブールgotRisingEdge = false ; /**************************************************************************************** * コード **********************************************************************************/ 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 ); // PRINTF("キャプチャされた値: %u\r\n",capturedValue); 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 ; } /*! * @briefメイン関数 */ int main( void ) { tpm_config_t tpmInfo; /* ボードピン、クロック、デバッグコンソールの初期化 */ BOARD_InitHardware(); 設定(); /* 端末にメモを印刷する */ 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_RiseAndFallEdge ); /* タイマーをフリーランニングモードに設定する */ 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 != true )の場合 { } uint32_tティック = 0 ; 下降時間 >= 上昇時間の場合 ticks = 下降時間 - 上昇時間; それ以外 ティック = ( TPM_MAX_COUNTER_VALUE ( DEMO_TPM_BASEADDR ) - 上昇時間) + 下降時間; float PulseUs = (ティック * 1000000 ) / TPM_SOURCE_CLOCK ; PRINTF ( "上昇時間: %u\r\n" ,上昇時間); PRINTF ( "落下時間: %u\r\n" ,fallingTime); PRINTF ( "マイクロ秒は : %.2f\r\n" ,PulseUs); SDK_DelayAtLeastUs( 60000 ,SystemCoreClock); } } オブジェクトの距離をチェックするこのコードにはいくつか問題がありますか? ここで SDK_DelayAtLeastUs(10,SystemCoreClock); この API は、ピンが測定を開始するためのトリガーとして 10 us を与えていないのでしょうか? i.MX93EVK クロック|タイマー Re: Is This code correct for interfacing ultra-sonic sensor into i.mx93 (cortex-m33) ? /* * 著作権 (c) 2015、Freescale Semiconductor, Inc. * 著作権 2016-2021 NXP * 無断転載を禁じます。 * * SPDXライセンス識別子: BSD-3条項 */ #include "fsl_debug_console.h" #include "board.h" #include "app.h" #include "fsl_tpm.h" #include "fsl_rgpio.h" /**************************************************************************************** * 定義 **********************************************************************************/ /**************************************************************************************** * プロトタイプ **********************************************************************************/ /**************************************************************************************** * 変数 **********************************************************************************/ 揮発性ブールtpmIsrFlag = false ; 揮発性uint32_t立ち上がり時間 = 0 ; 揮発性uint32_t落下時間 = 0 ; 揮発性ブールgotRisingEdge = false ; /**************************************************************************************** * コード **********************************************************************************/ 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 ); // PRINTF("キャプチャされた値: %u\r\n",capturedValue); 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 ; } /*! * @briefメイン関数 */ int main( void ) { tpm_config_t tpmInfo; /* ボードピン、クロック、デバッグコンソールの初期化 */ BOARD_InitHardware(); 設定(); /* 端末にメモを印刷する */ 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_RiseAndFallEdge ); /* タイマーをフリーランニングモードに設定する */ 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 != true )の場合 { } // PRINTF("\r\nキャプチャ値 C(n)V=%x\r\n", TPM_GetChannelValue(DEMO_TPM_BASEADDR, BOARD_TPM_INPUT_CAPTURE_CHANNEL)); uint32_tティック = 0 ; 下降時間 >= 上昇時間の場合 ticks = 下降時間 - 上昇時間; それ以外 ティック = ( TPM_MAX_COUNTER_VALUE ( DEMO_TPM_BASEADDR ) - 上昇時間) + 下降時間; uint32_t tpm_clock = CLOCK_GetIpFreq( LPTPM_CLOCK_ROOT ); float PulseUs = (ticks * 1000000 ) / tpm_clock ; PRINTF ( "上昇時間: %u\r\n" ,上昇時間); PRINTF ( "落下時間: %u\r\n" ,fallingTime); PRINTF ( "マイクロ秒は : %.2f\r\n" ,PulseUs); float距離 = PulseUs / 58 ; PRINTF ( "距離: %.2f\r\n" ,距離); SDK_DelayAtLeastUs( 60000 ,SystemCoreClock); } } オシロスコープを使用して確認したところ、トリガー 10 us は正しいです。しかし、問題はエコーピンですか? 正しい値を読み取れませんか? Re: Is This code correct for interfacing ultra-sonic sensor into i.mx93 (cortex-m33) ? すでにオシロスコープを使用して信号を検証しており、10 µs のパルスが表示されています。 次に、TRIG ピンを ECHO ピンに直接ループさせてテストし、コード内でパルス幅を測定しました。ただし、予想された 10 µs ではなく、約 66 µs で印刷されます。 TRIG ピンと ECHO ピンがループ内で直接コネクテッドされている場合は、生成された信号と一致するように正確に 10 µs が測定されるはずです。どこで矛盾が生じているのかを特定できません。 これはクロック構成の問題、またはキャプチャ ロジックのタイミングの不正確さが原因でしょうか? この問題の特定と解決にご協力いただければ幸いです。 よろしくお願いします! Re: Is This code correct for interfacing ultra-sonic sensor into i.mx93 (cortex-m33) ? ご返信ありがとうございます! Re: Is This code correct for interfacing ultra-sonic sensor into i.mx93 (cortex-m33) ?
こんにちは、
コードのセクションは、TPM 構成と超音波センサの TRIG および ECHO 信号の生成/読み取りに応じて異なります。
関数が 10 us 信号を生成しているかどうかを確認するには、オシロスコープまたはデジタル アナライザーで信号を測定することをお勧めします。タイミングが予想どおりでない場合は、コンパイラがパルスが予想どおりに持続しないようにコードを最適化する可能性があるため、値を調整して遅延を生成することができます。
ボード内のセンサの動作を確認しましたか?
参考として例を示します。
チュートリアル: Freedom Board を使用した超音波測距 | Eclipse 上の MCU
よろしくお願いいたします。
查看全文