반응형

요 외계인같은게 초음파 측정기다
이걸로 초음파를 쏘면 물체에 부딪히고 돌아온 초음파까지의 시간을 계산해 물체와의 거리를 계산한다
먼저 가운데 Trigger와 Echo를 연결할 핀과 타이머를 활성화해주자
Trigger는 PF12번 핀, Echo는 PA6번 핀을 사용할 것이다


ioc의 TIM3에서 Channel1을 Input Capture direct mode로 활성화하고 아래 설정을 변경해준다

그러면 위와 같이 PA6핀이 자동으로 활성화된다

PF12번 핀을 GPIO_Output으로 활성화하고 위처럼 라벨링해준뒤 저장하고 코드를 생성하자

main.c의 기존 TIM10 타이머에 초음파 측정기를 위한 변수를 추가해주고
#include "main.h"
extern volatile int TIM10_10ms_ultrasonic;
volatile int distance; // 거리를 측정한 펄스 갯수를 저장하는 변수
volatile int ic_cpt_finish_flag = 0; // 초음파 거리 측정 완료 indicator 변수
// Drivers/STM32F4xx_HAL_Driver/Src/stm32f4xx_hal_tim.c 에서
// HAL_TIM_IC_CaptureCallback 복붙
// 초음파 센서의 ECHO핀의 상승 엣지와 하강 엣지 발생 시 이곳으로 들어 옴
volatile uint8_t is_first_capture = 0; // 0 : 상승 엣지 / 1 : 하강 엣지
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if (htim -> Instance == TIM3)
{
if (is_first_capture == 0) // 상승 엣지일 때
{
__HAL_TIM_SET_COUNTER(htim, 0); // clear HW counter
is_first_capture = 1; // 상승 엣지를 만났다는 flag
}
else if (is_first_capture == 1) // 하강 엣지일 때
{
is_first_capture = 0; // 다음 echo 펄스를 count 하기 위해 변수 초기화
distance = HAL_TIM_ReadCapturedValue(htim, TIM_CHANNEL_1); // 현재까지 count한 펄스 수를 일거옴
ic_cpt_finish_flag = 1; // 초음파 측정 완료
}
}
}
void ultrasonic_processing(void)
{
int dis; // 거리를 측정한 펄스 갯수를 저장하는 변수
if (TIM10_10ms_ultrasonic >= 100) // 1초
{
TIM10_10ms_ultrasonic = 0;
make_trigger();
char ultra_buff[20];
if (ic_cpt_finish_flag) // 초음파 측정이 완료 되었으면
{
ic_cpt_finish_flag = 0;
dis = distance;
dis = dis * 0.034 / 2; // 1us 0.034cm 이동하므로 곱해주고 왕복이므로 편도를 구하려면 나누기 2해야함
printf("dis : %dcm\n", dis);
}
}
}
void make_trigger(void)
{
HAL_GPIO_WritePin(ULTRASONIC_TRIGGER_GPIO_Port, ULTRASONIC_TRIGGER_Pin, 0); // 매개 변수 값들은 main.h에 저장되어 있음
delay_us(2);
HAL_GPIO_WritePin(ULTRASONIC_TRIGGER_GPIO_Port, ULTRASONIC_TRIGGER_Pin, 1); // 매개 변수 값들은 main.h에 저장되어 있음
delay_us(10);
HAL_GPIO_WritePin(ULTRASONIC_TRIGGER_GPIO_Port, ULTRASONIC_TRIGGER_Pin, 0); // 매개 변수 값들은 main.h에 저장되어 있음
}
ultrasonic.c를 생성하여 위 코드를 입력한다

main.c에 ultrasonic_processing() 함수를 extern 해주고

main() 안에 해당 코드를 작성해서 TIM3의 CHANNEL 1을 시작한다

마지막으로 while문 안에 ultrasonic_processing() 함수를 입력하면 끝

연결을 이렇게 해주면 된다
초음파 측정기 앞에 있는 물체의 거리에 따라 거리가 다르게 출력되는 것을 확인할 수 있다
반응형
'임베디드 > STM32 (ARM Cortex - M4)' 카테고리의 다른 글
| [STM32] PWM DCMotor 제어 (0) | 2023.10.22 |
|---|---|
| [STM32] I2C LCD 출력 (1) | 2023.10.22 |
| [STM32] DHT11 온 습도 측정기 (0) | 2023.10.21 |
| [STM32] 타이머 (1) | 2023.10.21 |
| [STM32] UART (0) | 2023.10.20 |