/*
* Copyright (c) 2015, Freescale Semiconductor, Inc.
* Copyright 2016-2021 NXP
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "fsl_debug_console.h"
#include "board.h"
#include "app.h"
#include "fsl_tpm.h"
#include "fsl_rgpio.h"
/*******************************************************************************
* Definitions
******************************************************************************/
/*******************************************************************************
* Prototypes
******************************************************************************/
/*******************************************************************************
* Variables
******************************************************************************/
volatile bool tpmIsrFlag = false;
volatile uint32_t risingTime = 0;
volatile uint32_t fallingTime = 0;
volatile bool gotRisingEdge = false;
/*******************************************************************************
* Code
******************************************************************************/
void SetUp(void)
{
rgpio_pin_config_t out_config ={
kRGPIO_DigitalOutput,
0,
};
/* Trigger pin */
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 status = TPM_GetStatusFlags(DEMO_TPM_BASEADDR);
if (status & TPM_CHANNEL_FLAG)
{
uint32_t capturedValue = TPM_GetChannelValue(DEMO_TPM_BASEADDR, BOARD_TPM_INPUT_CAPTURE_CHANNEL);
// PRINTF("CAPTURED VALUE : %u\r\n",capturedValue);
if (!gotRisingEdge)
{
risingTime = capturedValue;
gotRisingEdge = true;
// TPM_SetupInputCapture(DEMO_TPM_BASEADDR,BOARD_TPM_INPUT_CAPTURE_CHANNEL,kTPM_FallingEdge);
}
else
{
fallingTime = capturedValue;
tpmIsrFlag = true;
gotRisingEdge = false;
// TPM_SetupInputCapture(DEMO_TPM_BASEADDR,BOARD_TPM_INPUT_CAPTURE_CHANNEL,kTPM_RisingEdge);
}
/* Clear interrupt flag.*/
TPM_ClearStatusFlags(DEMO_TPM_BASEADDR, TPM_CHANNEL_FLAG);
}
SDK_ISR_EXIT_BARRIER;
}
/*!
* @brief Main function
*/
int main(void)
{
tpm_config_t tpmInfo;
/* Board pin, clock, debug console init */
BOARD_InitHardware();
SetUp();
/* Print a note to terminal */
PRINTF("\r\nTPM input capture example\r\n");
PRINTF("\r\nOnce the input signal is received the input capture value is printed\r\n");
TPM_GetDefaultConfig(&tpmInfo);
/* Initialize TPM module */
TPM_Init(DEMO_TPM_BASEADDR, &tpmInfo);
/* Setup input capture on a TPM channel */
TPM_SetupInputCapture(DEMO_TPM_BASEADDR, BOARD_TPM_INPUT_CAPTURE_CHANNEL, kTPM_RiseAndFallEdge);
/* Set the timer to be in free-running mode */
TPM_SetTimerPeriod(DEMO_TPM_BASEADDR, TPM_MAX_COUNTER_VALUE(DEMO_TPM_BASEADDR));
/* Enable channel interrupt when the second edge is detected */
TPM_EnableInterrupts(DEMO_TPM_BASEADDR, TPM_CHANNEL_INTERRUPT_ENABLE);
/* Enable at the NVIC */
EnableIRQ(TPM_INTERRUPT_NUMBER);
TPM_StartTimer(DEMO_TPM_BASEADDR, kTPM_SystemClock);
while (1)
{
SendTrigPulse();
while (tpmIsrFlag != true)
{
}
// PRINTF("\r\nCapture value C(n)V=%x\r\n", TPM_GetChannelValue(DEMO_TPM_BASEADDR, BOARD_TPM_INPUT_CAPTURE_CHANNEL));
uint32_t ticks = 0;
if (fallingTime >= risingTime)
ticks = fallingTime - risingTime;
else
ticks = (TPM_MAX_COUNTER_VALUE(DEMO_TPM_BASEADDR) - risingTime) + fallingTime;
uint32_t tpm_clock = CLOCK_GetIpFreq(LPTPM_CLOCK_ROOT);
float PulseUs = (ticks * 1000000) / tpm_clock ;
PRINTF("RISING TIME : %u\r\n",risingTime);
PRINTF("FALLING TIME : %u\r\n",fallingTime);
PRINTF("Micro second is : %.2f\r\n",PulseUs);
float Distance = PulseUs / 58;
PRINTF("DISTANCE : %.2f\r\n",Distance);
SDK_DelayAtLeastUs(60000,SystemCoreClock);
}
}
i checked using oscilloscope , its trigger 10 us is correct. But problem is now echo pin ?
its not reading the correct value ?