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 소스>
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__
저장이 된다. ( 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 ;
}
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__
'스마트콘트롤러 > ARM' 카테고리의 다른 글
[TEXT LCD 모듈]사용자정의 CG램에 HEX숫자 변환하는 엑셀 (0) | 2013.05.27 |
---|---|
[ARM]타이머 카운터와 인터럽트 (1) | 2013.05.20 |
1. GNUARM 설치하기。 (0) | 2013.04.11 |
센서 종류 (0) | 2013.04.11 |
2. ARM칩에 소스 넣어 구동하기( 기 초 )。 (0) | 2013.04.11 |