2135797_ja-JP

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

2135797_ja-JP

2135797_ja-JP

このコードは超音波センサを 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 を与えていないのでしょうか?
 
クロック|タイマー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

よろしくお願いいたします。

タグ(1)
評価なし
バージョン履歴
最終更新日:
‎11-20-2025 04:57 PM
更新者: