Autonomous Lawn Mower/Sensors

초음파 Ultrasonic 센서

날아라용팔이 2025. 4. 10. 10:32
반응형

초음파 센서는 HC-SR04를 사용하였다. 

 

하드웨어 셋업은 아래와 같다. Trig 신호는 PA4 GPIO 출력을 이용하고 반사되서 되돌아 오는 신호는 Timer5 channel1이 사용되었다. 

 

Timer5 configuration은 다음과 같다. APB1이 60MHz라서 1us를 만들기 위해서 prescaler를 60으로 설정하였다. 인터럽트를 사용하기 위해서 NVIC settings에서 TIM5 global interrupt를 enabled 해줘야 한다. 

 

인터럽트를 사용하기 위해서는 main() 함수에서 인터럽트5의 채널1을 초기화 해주어야 한다. 

초음파 센서를 이용한 거리 측정을 위한 C 코드

#include "ultrasonic.h"

 

// Ultrasonic

#define TRIG_PIN GPIO_PIN_4

#define TRIG_PORT GPIOA

 

 

// ultrasonic sensor

uint32_t IC_Val1 = 0;

uint32_t IC_Val2 = 0;

uint32_t Difference = 0;

uint8_t Is_First_Captured = 0; // is the first value captured ?

 

uint8_t Distance = 0;

 

 

 

// delay in us

void delay_us (uint16_t time)

{

__HAL_TIM_SET_COUNTER(&htim5, 0);

while (__HAL_TIM_GET_COUNTER (&htim5) < time);

}

 

 

// Callback for Input Capture

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)

{

if (htim->Instance == TIM5 && htim->Channel == HAL_TIM_ACTIVE_CHANNEL_1) // TIM5 CH1

{

if (Is_First_Captured == 0)

{

IC_Val1 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);

Is_First_Captured = 1;

 

// Switch polarity to falling edge

__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_FALLING);

}

else

{

IC_Val2 = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1);

__HAL_TIM_SET_COUNTER(htim, 0); // Reset counter for next measurement

 

 

// Calculate difference, accounting for counter overflow

if (IC_Val2 > IC_Val1)

Difference = IC_Val2 - IC_Val1;

else

Difference = (0xFFFF - IC_Val1) + IC_Val2;

 

Distance = Difference * .034/2; // Sound speed in cm/us

 

// Reset for next capture

Is_First_Captured = 0;

 

// Set polarity back to rising edge

__HAL_TIM_SET_CAPTUREPOLARITY(htim, TIM_CHANNEL_1, TIM_INPUTCHANNELPOLARITY_RISING);

__HAL_TIM_DISABLE_IT(htim, TIM_IT_CC1); // TIM5 CH1

}

}

}

 

// Trigger a read from the ultrasonic sensor

void HCSR04_Read(void)

{

 

HAL_GPIO_WritePin(TRIG_PORT, TRIG_PIN, GPIO_PIN_SET);

delay_us(10); // Send 10us pulse

HAL_GPIO_WritePin(TRIG_PORT, TRIG_PIN, GPIO_PIN_RESET);

 

// Enable interrupt for input capture

__HAL_TIM_ENABLE_IT(&htim5, TIM_IT_CC1);

 

}

 

초음파 센서 헤더 코드

#ifndef INC_ULTRASONIC_H_

#define INC_ULTRASONIC_H_

 

#include "stm32f4xx_hal.h"

 

extern TIM_HandleTypeDef htim5; // Declare the timer handle from main.c

 

void delay (uint16_t time);

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim);

void HCSR04_Read (void);

 

 

 

#endif /* INC_ULTRASONIC_H_ */

 

 

※ 참고 자료

https://www.youtube.com/watch?v=ti_1ZwRolU4

반응형