본문 바로가기
코스웨어/13년 스마트컨트롤러

ARM ADC컨버터 복습용[문남경]

by 알 수 없는 사용자 2013. 5. 8.
728x90
반응형

ARM ADC 컨버터 복습하시는데 이해가 편하도록 작성하였습니다~ 즐공~


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()
{
  PMC_PCER = 1<<ADC_ID;  // ADC에 전원 공급
  ADC_CR = 1<<SWRST;    // ADC회로에 리셋
  ADC_CHER = (1<<light)|(1<<temp);  // 사용할 센서의 채널 활성화
  ADC_MR = 5<<PRESCAL | 0<<LOWRES;  // 5를 왼쪽으로 미는 PRESCAL, 10bit Resolution의 4MHz 컨버젼 타입

  return;
}

unsigned int ADC_run()  // 타이밍도 코딩, P542
{
  ADC_CR = 1<<START;
  while(0==ADC_SR & (1<<DRDY));    // 16번째bit를 bitmask하여 참이 될때가지 반복하게 하여 
                    //  Convertion Time을 번다.
  ADC_LCDR;
  return ((ADC_CDR4 & 0x3FF)<<16)|(ADC_CDR5 & 0x3FF);
}

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_

#define ADC_CR     (*((volatile unsigned int *)0xFFFD8000))  // Control Register            P546
#define ADC_MR     (*((volatile unsigned int *)0xFFFD8004))  // Mode Register              P546
#define ADC_CHER   (*((volatile unsigned int *)0xFFFD8010))  // Channel Enable Register        P546
#define ADC_CHDR   (*((volatile unsigned int *)0xFFFD8014))  // Channel Disable Register        P546
#define ADC_CHSR   (*((volatile unsigned int *)0xFFFD8018))  // Channel Status Register        P546
#define ADC_SR     (*((volatile unsigned int *)0xFFFD801C))  // Status Register              P546
#define ADC_LCDR   (*((volatile unsigned int *)0xFFFD8020))  // Last Converted Data Register      P546
#define ADC_IER   (*((volatile unsigned int *)0xFFFD8024))  // Interrupt Enable Register      P546
#define ADC_IDR   (*((volatile unsigned int *)0xFFFD8028))  // Interrupt Disable Register      P546
#define ADC_IMR   (*((volatile unsigned int *)0xFFFD802C))  // Interrupt Mask Register        P546
#define ADC_CDR0   (*((volatile unsigned int *)0xFFFD8030))  // Channel Data Register 0        P546
#define ADC_CDR1   (*((volatile unsigned int *)0xFFFD8034))  // Channel Data Register 1        P546
#define ADC_CDR2   (*((volatile unsigned int *)0xFFFD8038))  // Channel Data Register 2        P546
#define ADC_CDR3   (*((volatile unsigned int *)0xFFFD803C))  // Channel Data Register 3        P546
#define ADC_CDR4   (*((volatile unsigned int *)0xFFFD8040))  // Channel Data Register 4        P546
#define ADC_CDR5   (*((volatile unsigned int *)0xFFFD8044))  // Channel Data Register 5        P546
#define ADC_CDR6   (*((volatile unsigned int *)0xFFFD8048))  // Channel Data Register 6        P546
#define ADC_CDR7   (*((volatile unsigned int *)0xFFFD804C))  // Channel Data Register 7        P546


#define PMC_PCER  (*((volatile unsigned int *)0xFFFFFC10))  // 
#define  ADC_ID    4                      //
#define SWRST    0                      // Software Reset              p547
#define START    1                      // Start Conversion            p547

//ARM보드의 ADC 채널을 활성화 하기 위한 디파인
#define CH0      0
#define CH1      1
#define CH2      2
#define CH3      3
#define CH4      4
#define CH5      5
#define CH6      6
#define CH7      7

#define light    CH4          // 채널 4번에 light라는 장치를 쓰기위해 light에 채널 4를 정의
#define temp      CH5          // 채널 5번에 온도센서를 쓰기 위해

// ADC_MR 레지스터 정의
#define LOWRES    4          // ADC_MR | Resolution = 0 : 10bit , 1 : 8bit 세로디테일
#define PRESCAL    8
#define DRDY    16
#define EOC0    0
#define EOC1    1
#define EOC2    2
#define EOC3    3
#define EOC4    4
#define EOC5    5
#define EOC6    6
#define EOC7    7



void ADC_Init();
unsigned int ADC_run();

#endif  // _ADC_C_

728x90