초음파 센서 연결
#define UTRI_PIN (1<<6)
//ECHO_PIN설정
#define ECHO_PIN (1<<7)
초음파 센서 arm보드에 연결한 모습이다.
1번 pin은 5v연결
2번 핀은 Echo Port로 설정해준 핀으로 연결(6번 핀)
3번 핀은 Trigger port로 설정해준 핀으로 연결한다.(7번 핀)
4번 핀은 지금 쓰는 모드에서는 사용하지 않으므로 연결하지 않는다.
5번 핀은 GND로 연결해준다.
ultra 소스 해석
입력을 Enable 시켜주기 위해서 데이터 시트를 찾았으나.
PIO 레지스터는 기본적으로 입력이 Enable 되고 출력만 따로 Enable시켜주면 된다.
(출력이 Enable되면 입출력 둘다 사용가능)
밑의 Timig Diagram에서 보듯이 Echo의 상승엣지와 하강엣지를 구간을 정확히 체크해야지만 거리 측정이 가능하기 때문에 PDSR레지스터를 이용해서 Echo Pin이 HiGH일때와 LOW로 떨어질때를 감시해준다.
폴링방식을 사용해서 ECHO_PIN이 HIGH가 될때 타이머를 시작하고
ECHO_PIN이 LOW로 떨어지면 타이머 클럭을 Disable시켜 주면 한클럭을 계산해서
함수에서 uiCm을 리턴 시켜 거리를 계산해준다.
//ECHO_PIN이 상승엣지 일때를 찾는 while문
//ECHO_PIN이 1이 될때까지 while을 반복한다.
while(0==(ECHO_PIN & (*AT91C_PIOA_PDSR)));
// 타이머 시작(TC_CCR, AT91C_TC_SWTRG)
*AT91C_TC0_CCR = AT91C_TC_SWTRG;
//ECHO_PIN이 하강엣지 일대를 찾는 while문
while(0!=(ECHO_PIN & (*AT91C_PIOA_PDSR)));
*AT91C_TC0_CCR = AT91C_TC_CLKDIS;
Ultra.c 소스
#include <AT91SAM7S256.h> static void UTimer_Init(void); static void UTimer_ISR(void); static void Utrigger_Init(void); static void ECHO_Init(void); static void Utrigger(void); static volatile unsigned int uiCm; static volatile unsigned int uiState=INIT_OFF; static void UTimer_Init(void) { // 타이머 카운터 0 사용을 위한 PMC 활성화(AT91C_ID_TC0) // p33 : // p204 : //p20 : 주소 *AT91C_PMC_PCER = 1 << AT91C_ID_TC0; // 1.시작 : 타이머 클럭 비활성화 ------------------ // 타이머 클럭 비활성화(TC_CCR 설정) *AT91C_TC0_CCR = AT91C_TC_CLKDIS; // 2. 시작 : 타이머 인터럽트 비활성화 ------------- // 타이머 인터럽트 비활성화(TC_IDR 설정) *AT91C_TC0_IDR = 0xFFFFFFFF; // p479 // 인터럽트 상태 정보 초기화(TC_SR 읽기) *AT91C_TC0_SR; // 언급만 하면 읽은 효과 => 읽으면 0 이 됨 //p476 // 분주비 128, 비교 방식 레지스터 설정(TC_CMR, DIV4_CLOCK, AT91C_TC_CPCTRG) // MCKR divided by 4096 => 12, 0.25us(TC_RC 설정) // 컴페어방식을 사용 컴페어 방식은 설정해놓은 다른 레지스터의 값과 비교해서 같아지면 인터럽트를 발생시킨다. // 오버플로어 방식은 레지스터에 원하는 값을 넣어서 시작값을 바꿔서 원하는 카운팅에 인터럽트를 발생시킨다. *AT91C_TC0_CMR = AT91C_TC_CLKS_TIMER_DIV4_CLOCK | AT91C_TC_CPCTRG; // register c와 비교 // 타이머 카운터 0 인터럽트 비활성화(AIC_IDCR, AT91C_ID_TC0) *AT91C_AIC_IDCR = 1 << AT91C_ID_TC0; // p33 // 3. 시작 : 타이머 카운터 0 인터럽트 비활성화 ------ // 타이머 카운터 0 인터럽트 핸들러 등록(AIC_SVR[AT91C_ID_TC0], timer_handler) // 타이머 카운터 0 인터럽트 모드 설정(AIC_SMR[AT91C_ID_TC0], AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, AT91C_AIC_PRIOR_LOWEST) // 타이머 카운터 0 인터럽트 클리어(AIC_ICCR, AT91C_ID_TC0) AT91C_AIC_SVR[AT91C_ID_TC0] = (unsigned int)UTimer_ISR; // p175 AT91C_AIC_SMR[AT91C_ID_TC0] = AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | AT91C_AIC_PRIOR_LOWEST; *AT91C_AIC_ICCR = 1 << AT91C_ID_TC0; // TC_RC 값 비교 타이머 인터럽트 활성화(TC_IER, AT91C_TC_CPCS) *AT91C_TC0_IER = AT91C_TC_CPCS; // MCKR divided by 128 => 22, 0.001sec(TC_RC 설정) *AT91C_TC0_RC = 22; // 2. 끝 : 타이머 인터럽트 비활성화 --------------- // 타이머 카운터 0 인터럽트 활성화(AIC_IECR, AT91C_ID_TC0) *AT91C_AIC_IECR = 1 << AT91C_ID_TC0; // 3. 끝 : 타이머 카운터 0 인터럽트 비활성화 ------- // 타이머 클럭 활성화(TC_CCR, AT91C_TC_CLKEN) *AT91C_TC0_CCR = AT91C_TC_CLKEN; // 1. 끝 : 타이머 클럭 비활성화 ------------------ // 타이머 시작(TC_CCR, AT91C_TC_SWTRG) // *AT91C_TC0_CCR = AT91C_TC_SWTRG; return; } //소리가 1cm 전진 할때 호출된다. static void UTimer_ISR(void) { // 인터럽트 상태 정보 초기화(TC_SR 읽기) *AT91C_TC0_SR; // 언급만 하면 읽은 효과 => 읽으면 0 이 됨 //p476 ++uiCm; return; } //Trigger 설정 함수 static void Utrigger_Init(void) { //PIOA에 전원공급 *AT91C_PMC_PCER=1<<AT91C_ID_PIOA; //PIOA Enable(6번핀) *AT91C_PIOA_PER = UTRI_PIN; //풀업 Disable(스위치에서만 사용하기 때문에 꺼준다) *AT91C_PIOA_PPUDR = UTRI_PIN; //출력 Enable *AT91C_PIOA_OER = UTRI_PIN; //시작과 동시에 Clear시킨다.(LOW) *AT91C_PIOA_CODR=UTRI_PIN; return; } //ECHO PIN 기본 셋팅 함수 static void ECHO_Init(void) { //PIOA에 전원공급 *AT91C_PMC_PCER=1<<AT91C_ID_PIOA; //PIOA Enable(7번핀) *AT91C_PIOA_PER = ECHO_PIN; //풀업 Disable(스위치에서만 사용하기 때문에 꺼준다) *AT91C_PIOA_PPUDR = ECHO_PIN; return; } //펄스생성 함수 static void Utrigger(void) { volatile unsigned int uiCnt; //LOW로 설정 *AT91C_PIOA_CODR=UTRI_PIN; //딜레이 for(uiCnt=0;uiCnt<1000;uiCnt++); //High로 설정(펄스생성) *AT91C_PIOA_SODR=UTRI_PIN; for(uiCnt=0;uiCnt<1000;uiCnt++); //다시 Low로 만든다 *AT91C_PIOA_CODR=UTRI_PIN; return; } //밑의 두개 빼고는 자체적으로 쓰는 함수들 이기 때문에 나머지 함수들은 static을 붙여준다. void Ultar_Init(void) { UTimer_Init(); Utrigger_Init(); ECHO_Init(); //초음파센서 작동시작 uiState=INIT_ON; return; } unsigned int Ultra_Run(void) { //초음파센서가 초기화 되지 않으면 실행이 되지 않도록 막는다. if(uiState== INIT_OFF) { return 0; } //uiCm에 뭐가 들어가 있는지 모르기 때문에 초기화 해준다. uiCm = 0; *AT91C_TC0_CCR = AT91C_TC_CLKEN; //초음파센서 작동시작 Utrigger(); //ECHO_PIN이 상승엣지 일때를 찾는 while문 //ECHO_PIN이 1이 될때까지 while을 반복한다. while(0==(ECHO_PIN & (*AT91C_PIOA_PDSR))); // 타이머 시작(TC_CCR, AT91C_TC_SWTRG) *AT91C_TC0_CCR = AT91C_TC_SWTRG; //ECHO_PIN이 하강엣지 일대를 찾는 while문 while(0!=(ECHO_PIN & (*AT91C_PIOA_PDSR))); *AT91C_TC0_CCR = AT91C_TC_CLKDIS; //거리를 리턴 시켜준다. return uiCm; } |
main.c 소스
|
구동영상
'코스웨어 > 15년 스마트컨트롤러' 카테고리의 다른 글
20150915-14번-박제혁 일일업무일지 - PWM을 이용한 멜로디 연주 (4) | 2015.09.16 |
---|---|
20150947-13번-박서연 일일업무일지 - PWM, 스피커 (6) | 2015.09.14 |
pwm 파일입니다 (2) | 2015.09.14 |
20150911-11번-남수진 - 센서(초음파센서) / ARM(PWM) (6) | 2015.09.11 |
ARM -Ultra Sonic 소스 입니다~ (0) | 2015.09.10 |
20150909-7번-김재홍-초음파센서(ARM7) (3) | 2015.09.10 |
20150908-3번-권오민 - 센서(서미스터) & ARM(Timer & Ultra Sonic) (12) | 2015.09.08 |
타미머 소스입니다. (2) | 2015.09.08 |