Skip to main content
Nchun.1
Associate III
April 24, 2021
Solved

In input capture function , i am trying to interface HC-sr04 Ultrasonic sensor to STM32F401. I am giving input to TRIG pin with 10 micro seconds ON and Need to Measure Pulse from ECHO pin of the Sensor and not getting Exact Width.

  • April 24, 2021
  • 2 replies
  • 2755 views

The Pulse width value of the waveform in input capture is not matching with orginal Pulse from sensor output .

Please help.

0693W00000AMQ1dQAH.png0693W00000AMQ1YQAX.png#include<NEW.h>

#include<stdio.h>

#include<stdarg.h>

void Ultra_setting();

void delay(int val);

void Tim3_Capture();

void Uart1_config();

void uart_printf(const char *fmt, ...);

uint32_t timeStamp1 = 0,timeStamp2=0,width=0,Distance=0;

unsigned int flag=0;

void TIM3_IRQHandler()

{

uint32_t time = TIM3->CCR1;

if (flag==0)

{

   timeStamp1=time;

 }

else

 {

   timeStamp2= time;

     if(timeStamp2>timeStamp1)

    {

     width= timeStamp2-timeStamp1;

    }

    else if(timeStamp2<timeStamp1)

    {

      width= (0xffff - timeStamp1) + timeStamp2;

    }

    Distance = width *(.034/2);

    flag=0;

    WRITE(NVIC_ISER0 ,(0<<29));/*Disabling TIM3 Interrupt */

    TIM3->CR1=0;/*Disable Counter */

   uart_printf("The distance is %d %d %d %d\n", Distance,timeStamp1,timeStamp2,width);

  }

  flag++;

}

int main()

{

  //GPIO A configuration

SystemInit();

Ultra_setting();

Uart1_config();

  Tim3_Capture();/*Enable Tim3 capture*/

  GPIOA->ODR |=1<<12;/* Turning ON PA12pin */

  delay(100);/* 10 microseconds ON*/

  GPIOA->ODR &=~(1<<12);/* Turning ON PA12 pin */

  while(1);

}

char buf[512];

void uart_printf(const char *fmt, ...)

{

int ret;

va_list args;

va_start(args, fmt);

ret = vsnprintf(buf, 512, fmt, args);

va_end(args);

if (ret > 0)

{

for (int i =0; i < ret; i++)

{

USART1->SR = 0;

USART1->DR = buf[i];

while(!(USART1->SR & (1<<6)) );

}

}

}

void Uart1_config()

{

RCC->APB2ENR |=USART1_CLK;

RCC->AHB1ENR |=1;

GPIOA->MODER |=2<<18;/* Enabling Mode of PA9 */

GPIOA->MODER |=2<<20;/*Enabling Mode of PA9 */

GPIOA->OSPEEDR |=3<<18;/* Enabling High speed of PA9*/

GPIOA->OSPEEDR |=3<<20;/* Enabling High speed of PA10*/

GPIOA->AFR[1] |=7<<4;/*Enabling AFR7 of PA9 */

   GPIOA->AFR[1] |=7<<8;/*Enabling AFR8 of PA10 */

USART1->CR1 |=USART1_EN;

   USART1->BRR =((3<<0) | (0x68<<4)); /*9600 Baud Rate*/

USART1->CR1 |=USART1_RE;

USART1->CR1 |=USART1_TE;

}

void Tim3_Capture()

{

//input capture mode

RCC->APB1ENR |= 2;   //ENABLE TIMER 3

TIM3->PSC = 16;    /*divide by 16 - 1 Mhz*/

TIM3->CCMR1 |=TIM2_CCIS;//01: CC1 channel is configured as input, IC1 is mapped on TI1.

TIM3->CCER |=1;   //enable CH1 input capture

   TIM3->CCER |=5<<1; //enable 11: noninverted/both edges

WRITE(NVIC_ISER0 ,(1<<29));//Enable timer Interrupt.

TIM3->DIER =1<<1; //Bit 1 CC1IE: Capture/Compare 1 interrupt enable

TIM3->CR1 = 1;  //enable TIM3

   TIM3->CNT=0;

}

void Ultra_setting()

{

  RCC->AHB1ENR |=1; /* Enabling clock for GPIOA port*/

GPIOA->MODER |=2<<12;/*Alternative function in PA6 pORT*/

GPIOA->MODER |=1<<24;/*General Purpose output function in PA12 Port*/

GPIOA->AFR[0]|=2<<24; /* Alternate function low register is AF1 is TIM3_CH1 */

GPIOA->OSPEEDR|=1<<12;/*Medium speed */

}

void delay(int val)

{

 RCC->APB1ENR |=1<<0; /* TIM2 clock enabled*/

 TIM2->CNT=0;

 TIM2->PSC=1;

 TIM2->CR1 |=1;

 while(TIM2->CNT < val);

 TIM2->SR=0;

}

This topic has been closed for replies.
Best answer by waclawek.jan

TIMx_PSC is preloaded, you need to force update by setting TIMx_EGR.UG to get it "active".

JW

2 replies

waclawek.jan
waclawek.janBest answer
Super User
April 24, 2021

TIMx_PSC is preloaded, you need to force update by setting TIMx_EGR.UG to get it "active".

JW

Nchun.1
Nchun.1Author
Associate III
April 24, 2021

Thank you again JW.

Now Project is working perfectly