/*
* 著作権 (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 は正しいです。しかし、問題はエコーピンですか?
正しい値を読み取れませんか?