ARM ADC컨버터

2013. 5. 8. 17:45스마트콘트롤러/ARM


1.A/D 컨버터의 개요

- 컨버터는 8채널 이며, 10비트 혹은 8비트 의 분해능의 축차비교형의 컨버터를 가지고 있다.
- 축자 비교법이란,




-8비트의 단점과 장점
위의 축차비교법 처럼 8비트는 저 칸칸의 나눔이 256개가 된다는 얘기이며, 단점으로는 10비트보다 좀더 정밀하고 세밀한 계산이 되지 않는다는 점이(분해능이 낮다) 단점이며, 장점으로는 세밀하지 못하지만, 그만큼 계산할 수 있는 시간이 절약되므로 변환속도가 10비트 보다 빠른 장점이 있다. 

총 8채널 3~6번 (ADC전용 컨버터), 9,10,13,16(I/O 입출력 병렬 포트와 겸용) 으로 사용하고 있다
- A/D 변환이 가능한 아날로그 입력전압의 범위는 0~ADVREF이며, 변환은 8비트 or 10비트 모드를 사용할 수 있다.

 
- A/D 변환된 디지털 데이터는 각 채널에 내장된 전용의 데이터 레지스터 ADC_CDR와 모든 채널 공통 데이터 레지스터ADC_LCDR에도 똑같이
저장이 된다. ( 2진수의 숫자로 저장이 되있으며, 이것으로 샘플링 * 저장크기를 알아내어 총 용량을 구할 수 있다 )

<Adc.c 소스>
#include "Adc.h"

void Adc_Init(void)
{
  // 전원공급
  PMC_PCER = 1 << ADC;
  // ADC 리셋
  ADC_CR = 1<< SWRST  ;    // 컨트롤 레지스터 리셋
  // 채널 선택
  ADC_CHER = 1 << ADC_CH7;  // 채널 7번 활성화
  // 프리스컬 분해기능 시작
  ADC_MR  = (5 << PRESCAL) |(0 << LOWRES);
}

unsigned char * Adc_Run7(void)
{
  // 컨버팅 스타트 변환 시작
  ADC_CR = 1<< START;  
  // 컨버팅 대기
//  while()
  // 컨버팅 읽기
//  ADC_CDR[7];
  
  return ;
}

ADC_MR  = (5 << PRESCAL) |(0 << LOWRES);
- 모드 설정 레지스터이며, LOWRES 값 0을 주면서 10비트 분해능을 사용하면서 A/D의 컨버터 5MHz이하를 사용하기 위해 5를 밀어넣는다.
- ADC의 클록 주파수 = MCK/((PRESCAL +1) *2)  == 48 / (( 5 + 1) * 2 ) = 4 이므로 5메가 이하가 된다.


<Adc.h> 헤더파일

#ifndef  __ADC_H__
#define  __ADC_H__

#include "pmc.h"

#define  ADC      4  //ADC 사용
#define  START    1  //스타트 컨버터
#define  SWRST    0  //리셋 
#define  ADC_CH7  7  //채널7사용

#define  PRESCAL  8
#define  SLeep    5
#define  TRGEN    0
#define  STARTUP  18
#define  LOWRES    4
#define  TRGSEL    2
#define  SHTIM    24

#define  ADC_CR    (*((volatile unsigned int *)0xFFFF8000))  //제어 레지스터 (Write-only)
#define   ADC_MR    (*((volatile unsigned int *)0xFFFF8004))  //모드 레지스터 (read/write)
#define   ADC_CHER  (*((volatile unsigned int *)0xFFFF8010))  // 채널 허용 레지스터 (write-only)
#define  ADC_SR    (*((volatile unsigned int *)0xFFFF801C))  // 상태 레지스터 ( read-only)
#define   ADC_LCDR  (*((volatile unsigned int *)0xFFFF8020))  // 최신 데이터 레지스터 (read-only)
#define  ADC_CDR  (((volatile unsigned int *)0xFFFF8030))  // 채널 데이터 레지스터 (write-only)

void Adc_Init(void);
unsigned char * Adc_Run7(void);

#endif  
//end __ADC_H__