본문 바로가기
코스웨어/10년 스마트폰BSP

[BSP]업무일지-강혜정-20100712

by 알 수 없는 사용자 2010. 7. 12.
728x90
반응형

 

ADC (Analog Digital Converter)

 

Analog 는 끊어짐이 없이 계속 이어짐.

Analog의 연속적인 값을 받아 오기 위해  Digital 로 바꾼다.

콘덴서의 충전시간을 이용해서(시분할) 숫자로 값을 받아 볼 수 있다.

p.294 변환의 기준전압

A/D Converter 에는 외부 단자 ADVREF를 통하여 기준전압이 공급되어야 한다. 각 채널에서의 아날로그 신호 입력의 범위는 0.0V ~ADVREF 로 결정된다.

(ADVREF 핀에 기준 전압을 걸어주면 된다.) (우리가 사용하는 칩은 3.3V or 5V를 자동으로 걸어놨다.)

 

Sampling : P.297 ADC_MR - PRESCAL : Prescaler Rate Selection ADC 클럭 주파수

ADC 값을 평균적으로 받아 올 수 있다. 분해능을 크게 잡고 주파수를 길게 잡을 수록 정확한 평균값을 얻어 올 수 있지만 시간이 오래 걸린다.

 

8비트 분해능 : 0V ~ 기준전압 까지 디지털화 시켜서 받아 볼 수 있는 값이 255

10비트 분해능 :   1024

세밀한 값을 얻어 오기 위해서는 분해능을 높게 잡으면 된다.

8비트 분해능을 사용할 경우에는 이중에서 하위 8비트만 유효하며 사용하지 않는 상위 2비트는 0으로 읽혀진다.

 

A/D 변환이 완료되면 그 결과는 각 채널의 데이터 레지스터인 ADC_CRDx와 모든 채널에 공통으로 사용되는 최신 데이터 레지스터인 ADC_LCDR에 저장.

최신 데이터 레지스터는 제일 마지막에 변환된 CHANNEL 의 값이 저장된다.

 

변환이 완료 되면 상태 레지스터 ADC_SR 에서 EOCx 비트와 DRDY 비트가 1로 세트된다. 사용자 프로그램은 ADC_CDRx 레지스터를 읽으면 EOCx 비트는 0으로 클리어 되며, ADC_LCDR 레지스터를 읽으면 EOCx 비트와 DRDY 비트가 모두 0으로 클리어 된다.

 

A/D 변환의 트리거

 

A/D 변환 동작의 시작은 소프트웨어 또는 하드웨어적인 방법으로 트리거 할 수 있다.

 

ADC_MR - TRGEN 비트를 사용하여 트리거 방법을 설정할 수 있다.

 

A/D 슬립 모드 : ADC_MR STARTUP 기동시간 - 슬립모드가 깨어나는 시간

 

P.298

ADC_CHER (0~7 CHANNEL) : 채널 허용 레지스터

ADC_CHDR (0~7 CHANNEL) : 채널 금지 레지스터

 

PA17~20 : AD0~AD3 사용

 

전원 공급 : PID4 - ADC 에 공급

PIO 핀을 따로 ADC 로 사용할 때 PIO 병렬 입출력 장치의 17~20번을 금지 시켜주어야 AD0~3 을 사용할 수 있다.

PDR 을 사용

 

장치 선택 : ADC 4개가 따로 있기 때문에 바로 쓸 수도 있다.

값을 받을 때는 하이퍼 터미널이나 CLCD 로 받아 올 수 있다.

 

itoa : int 형을 char 형으로 형변환 시켜서 하이퍼터미널에 출력한다.

 

#include "dk.h"



int main(void)
{
   unsigned int clear;
   char ch;
   
   
   PMC_PCER = (1<<2)|(1<<4);
   
  //---------
병렬 입출력 설정
  PIO_ASR   = (unsigned int)1<<9 | (unsigned int)1<<10;   
   PIO_PDR   = (unsigned int)1<<9 | (unsigned int)1<<10;   
   
   //---------
디버그유닛설정
   DBGU_CR   = (unsigned int)1<<4 | (unsigned int)1<<6;  //
송신부수신부허용설정
  DBGU_MR   = (unsigned int)1<<11;      
  DBGU_BRGR =  26;
   
   ADC_MR = (1<<4)|(1<<13)|(1<<14)|(1<<15);
   ADC_CHER = 1<<4;
  
  while(1)
  {
    ADC_CR = 1<<1;
  
    ch = ADC_SR; 
  
    if(ADC_SR & (1<<4))
    {
       
       ch = ADC_CDR[4];
       Delayms(300);
      
       DBGU_THR = ch;
       Delayms(300);
       
    }
  clear = ADC_SR; 
  }
    return 0;
}

 


728x90