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 소스>
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> 헤더파일
저장이 된다. ( 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);
}
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
'코스웨어 > 13년 스마트컨트롤러' 카테고리의 다른 글
조유진 제안서 (0) | 2013.05.13 |
---|---|
프로젝트 제안서 입니다 [이도윤] (0) | 2013.05.13 |
DC모터 PWM (3) | 2013.05.10 |
푸쉬푸쉬 게임+소스 (5) | 2013.05.10 |
2013년 5월 8일 정리노트 -by이세웅 (15) | 2013.05.08 |
2013.05.07 수업내용 정리(다소 그림뿐...) - 문영식 (18) | 2013.05.07 |
학교 컴에서 작성한 ~.c예제들 , 핸드폰, 집컴에서도 바로 열어보자! - DropBox (Cloud) (5) | 2013.05.07 |
5월 6일 정리... 하...-백진웅 (14) | 2013.05.07 |