/*
* Copyright 2022 NXP
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#include "fsl_sar_adc.h"
#include "fsl_debug_console.h"
#include "board.h"
#include "app.h"
#include "fsl_rgpio.h"
#include "fsl_tpm.h"
/*******************************************************************************
* Variables
******************************************************************************/
volatile bool captureDone = false;
volatile bool gotRisingEdge = false;
volatile uint32_t risingTime = 0;
volatile uint32_t fallingTime = 0;
uint32_t capturedValue = 0;
/* clang-format on */
/*******************************************************************************
* Code
******************************************************************************/
void SetUp(void)
{
rgpio_pin_config_t out_config ={
kRGPIO_DigitalOutput,
0,
};
// Trigger pin will find range
RGPIO_PinInit(BOARD_RGPIO,TRIG_PIN,&out_config);
RGPIO_PinWrite(BOARD_RGPIO,TRIG_PIN,0);
}
void SendTrigPulse(void)
{
RGPIO_PinWrite(BOARD_RGPIO, TRIG_PIN, 0);
SDK_DelayAtLeastUs(2, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
RGPIO_PinWrite(BOARD_RGPIO, TRIG_PIN, 1);
SDK_DelayAtLeastUs(10, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY); // 10us pulse
RGPIO_PinWrite(BOARD_RGPIO, TRIG_PIN, 0);
}
void TPM_INPUT_CAPTURE_HANDLER(void)
{
capturedValue = TPM_GetChannelValue(DEMO_TPM_BASEADDR, BOARD_TPM_INPUT_CAPTURE_CHANNEL);
if (!gotRisingEdge)
{
risingTime = capturedValue;
gotRisingEdge = true;
/* Switch to falling edge detection */
TPM_SetupInputCapture(DEMO_TPM_BASEADDR, BOARD_TPM_INPUT_CAPTURE_CHANNEL, kTPM_FallingEdge);
}
else
{
fallingTime = capturedValue;
captureDone = true;
}
TPM_ClearStatusFlags(DEMO_TPM_BASEADDR, TPM_CHANNEL_FLAG);
SDK_ISR_EXIT_BARRIER;
}
/*!
* @brief Main function
*/
int main(void)
{
tpm_config_t tpmConfig;
uint32_t pulseTicks = 0, pulseUs = 0;
float distanceCm = 0.0f;
BOARD_InitHardware();
SetUp();
PRINTF("\r\nTPM Ultrasonic Distance Measurement Example\r\n");
TPM_GetDefaultConfig(&tpmConfig);
TPM_Init(DEMO_TPM_BASEADDR, &tpmConfig);
/* Start with rising edge capture */
TPM_SetupInputCapture(DEMO_TPM_BASEADDR, BOARD_TPM_INPUT_CAPTURE_CHANNEL, kTPM_RisingEdge);
TPM_SetTimerPeriod(DEMO_TPM_BASEADDR, 0xFFFFFFFFU);
TPM_EnableInterrupts(DEMO_TPM_BASEADDR, TPM_CHANNEL_INTERRUPT_ENABLE);
EnableIRQ(TPM_INTERRUPT_NUMBER);
TPM_StartTimer(DEMO_TPM_BASEADDR, kTPM_SystemClock);
while (1)
{
gotRisingEdge = false;
captureDone = false;
PRINTF("Sending Trigger Pulse...\r\n");
SendTrigPulse(); /* Send trigger pulse exactly 10 us */
/* Wait until both edges captured */
while (!captureDone) {}
/* Calculate pulse width */
if (fallingTime >= risingTime)
pulseTicks = fallingTime - risingTime;
else
pulseTicks = (0xFFFF - risingTime) + fallingTime;
/* Convert ticks to microseconds */
pulseUs = (pulseTicks * 1000000U) / TPM_SOURCE_CLOCK;
PRINTF("Time clock : %u\r\n",TPM_SOURCE_CLOCK);
/* Convert to distance in cm */
distanceCm = pulseUs / 58.0f;
PRINTF("[DEBUG]Captured value when Interrupt triggers : %u\r\n",capturedValue);
PRINTF("[DEBUG]Rising Edge Tick : %u\r\n", risingTime);
PRINTF("[DEBUG]Falling Edge Tick: %u\r\n", fallingTime);
PRINTF("Pulse Width : %u us\r\n",pulseUs);
PRINTF("Measured Distance : %d cm\r\n", (int)distanceCm);
PRINTF("\r\n");
/* Reset to rising edge detection for new measurement */
TPM_SetupInputCapture(DEMO_TPM_BASEADDR, BOARD_TPM_INPUT_CAPTURE_CHANNEL, kTPM_RisingEdge);
SDK_DelayAtLeastUs(1000000, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
}
}
here i am using input capture example with our application ?
is their need to change any code here , this is not working ?
Here i interface HC-SR04 US sensor with i.mx93 board ?