다른 센서들과 다르게 초음파센서는 ADC에 연결하고 값을 읽어오기만하면 되는 구조가 아니다.
보다 복잡한 제어가 필요하다.
초음파센서의 원리
초음파 센서는 기본적으로 Trig핀과 Echo핀이 있는데
Trig핀으로 10us 동안 High신호를 입력하면 초음파를 발사하기 시작한다.
이 때부터 Echo핀이 High상태를 유지하다가 초음파가 돌아오면 다시 Low상태가 된다.
초음파센서 사용법
즉 1us주기로 동작하는 타이머를 사용하고
Trig에 10펄스 동안 High신호를 GPIO로 입력한 뒤
Echo핀이 High상태인 동안의 펄스를 카운트하고
그 카운트된 값을 58로 나누면 cm단위의 거리값이 나오게 된다.
주의할 점
Echo가 Low상태가 됬을 때 카운트를 중지하고 다시 Trig로 신호를 줘야하는데
이것을 제어하는 부분을 다른 타이머로 따로 빼서 제어하지않으면 신호가 씹혀 정상적인 동작을 하지 않는다. 타이머를 2개 사용해야하는 부분이다.
int sigcount=0; int t=0; int sensor=0; int state = 0; void InsertSignal() { if(t ==0) { GPIOD->BSRRL=GPIO_Pin_0; t = 1; } if(t ==1) { GPIOD->BSRRH=GPIO_Pin_0; int readGPIO = GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_1); if(readGPIO != 0){ sigcount++; state=1; } else if(readGPIO == 0 && state == 1) { sensor = sigcount; state=0; sigcount=0; } } }===========================================================================
void TIM2_IRQHandler(void) { if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET) { TIM_ClearITPendingBit(TIM2, TIM_IT_Update); InsertSignal(); } } void TIM3_IRQHandler(void) { if (TIM_GetITStatus(TIM3, TIM_IT_Update) == SET) { TIM_ClearITPendingBit(TIM3, TIM_IT_Update); if(state == 0 && sigcount==0) t = 0; if(state2 == 0 && sigcount2==0) t2 = 0; if(state3 == 0 && sigcount3==0) t3 = 0; } }
초음파센서...
절때 여러개의 초음파센서를 사용하지말라.
초음파센서의 측정각은 15도 정도이지만
센서A에서 발사한 초음파가 벽에 반사되어 센서B로 들어가는 경우가 허다하다
원래부터 측정값의 신뢰도가 높지못한데 여러개를 사용할 경우
필터링을 해도 감당이 안되는 측정값을 보여줄 것이다.
반응형
'Embeded > ARM Cortex-M4' 카테고리의 다른 글
스태핑 모터 상 제어 (0) | 2015.07.10 |
---|---|
UART - PC, 블루투스 통신 (0) | 2015.07.10 |
Sink방식과 Source방식 (0) | 2015.07.10 |
DAC(Digital-Analog Converter) (0) | 2015.07.10 |
ADC(Analog-Digital Converter) (0) | 2015.07.10 |