초음파 Ultrasonic 센서
초음파 센서는 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_ */
※ 참고 자료