Busan IT/ARM Controller2015. 9. 9. 09:12

==================================Outline=====================================

ARM 타이머/카운터 소스 

초음파 센서 거리측정식

----------------------------------------------------------------------------


ARM 타이머/카운터 소스


20150908.zip


** main.c에서 TIMER_Init을 호출하지 않아 1초마다 LED 깜빡이는 코드가 작동하지 않았다.

/*** timer.c ***/

#include "timer.h"

static volatile unsigned int uiMSec;    //milli second

// 0번 타이머 접두어: TC0 // 1번 타이머 접두어: TC1 // 2번 타이머 접두어: TC2
// 예: #define TC0_CCR    ((volatile unsigned int *)0xFFFA0000)
// 인터럽터 관련 : AT91C_BASE_AIC
// 0번 타이머 관련 : AT91C_BASE_TC0
// PMC 관련   : AT91C_BASE_PMC

void TIMER_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 = 0xFF;  
// 인터럽트 상태 정보 초기화(TC_SR 읽기)
  *AT91C_TC0_SR;  // 초기화 :: 수행되면 레지스터가 초기화된다.

// 분주비 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;  
  

// 타이머 카운터 0 인터럽트 비활성화(AIC_IDCR, AT91C_ID_TC0)
  *AT91C_AIC_IDCR = 1 << AT91C_ID_TC0; 
  
// 3. 시작 : 타이머 카운터 0 인터럽트 비활성화 ------

// 타이머 카운터 0 인터럽트 핸들러 등록(AIC_SVR[AT91C_ID_TC0], timer_handler)
  AT91C_AIC_SVR[AT91C_ID_TC0] = (unsigned int)Timer_ISR;  

// 타이머 카운터 0 인터럽트 모드 설정(AIC_SMR[AT91C_ID_TC0], AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL, AT91C_AIC_PRIOR_LOWEST)
  AT91C_AIC_SMR[AT91C_ID_TC0] = AT91C_AIC_SRCTYPE_INT_HIGH_LEVEL | AT91C_AIC_PRIOR_LOWEST;

// 타이머 카운터 0 인터럽트 클리어(AIC_ICCR, AT91C_ID_TC0)
  *AT91C_AIC_ICCR = 1 << AT91C_ID_TC0;

// TC_RC 값 비교 타이머 인터럽트 활성화(TC_IER, AT91C_TC_CPCS)
  *AT91C_TC0_IER = AT91C_TC_CPCS;
// MCKR divided by 128 => 375, 0.001sec(TC_RC 설정) 
  *AT91C_TC0_RC = 375;
// 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;


}


void ms_delay(unsigned int uiMS)
{
  uiMSec = 0;
  while(uiMSec < uiMS);
}

void Timer_ISR(void)
{
// 인터럽트 상태 정보 초기화(TC_SR 읽기)
  *AT91C_TC0_SR;  // 초기화 :: 수행되면 레지스터가 초기화된다.
  ++uiMSec;

}


초음파 센서 거리측정식


초음파 센서가 1cm 앞에 있는 물체를 감지하는데를 걸리는 시간(클럭)을 측정 해보자.

소리의 속도는 340m/s 이고 이를 cm로 표현하기 위해 100을 곱하면 34,000cm/s 이다. 


비례식으로 나타내면 1초 : 34,000cm = x초 : 1cm이다.

외항과 내항을 곱하면 1cm/초 = (34,000)(x)cm/초 이므로

x = 1/34,000임으로 값은 0.00002941176470588240이다. 초음파를 측정하기 위해서 보낸 초음파를 다시 받아야 하기 때문에 곱하기 2를 해주어야 한다.

소리의 속도(m/s)소리의 속도(cm/s)1cm 이동시간 * 2

340

     34,000

0.00005882352941176470


즉 주파수가 분주비에 의해 0.00005882352941176470 가 되는 수를 찾아야 한다.


128분주의 오차가 가장 작음으로 128분주를 사용할 것이다. 128분주의 오차를 계산하면 아래 표와 같다.


반응형

'Busan IT > ARM Controller' 카테고리의 다른 글

초음파 센서 동작  (0) 2015.09.10
초음파 센서  (0) 2015.09.09
Timer/Counter  (0) 2015.09.07
주파수와 ARM 메모리맵  (0) 2015.08.28
Interrupt Code, 초음파 센서 SRF05, Timer/Counter  (0) 2015.08.19
Posted by newind2000