Escolar Documentos
Profissional Documentos
Cultura Documentos
프로그래밍 실전
제작 : 네 로 테 크
강의 : 김 종 형
Embedded AVR Programming
1. A/D 컨버터의 개요
2. A/D 컨버터 관련 레지스터
3. 클럭의 선택 및 동작 타이밍
4. A/D 변환 결과
5. A/D 변환 오차
6. 잡음 제거 방법
7. A/D 컨버터 실습
2006-
2006-04-
04-01 -2-
Embedded AVR Programming
⊙ 안정된 동작을 위한 MCU의 디지털 전원과 별도의 아날로그 회로 전원단자 AVCC를 가지며,
A/D 변환에 필요한 기준전압 AREF 단자 지원
⊙ A/D 컨버젼 설정 순서
- ADMUX로 A/D 신호를 입력받을 채널을 0에서 7까지 선택
- ADCSR로 컨버전 프리스케일러 설정, 컨버전 완료 인터럽트를 설정
- 전역 인터럽트 플래그를 ‘SET’하여 인터럽트 활성화
- 아날로그 디지털 변환 완료 인터럽트 처리 루틴을 구성한 후 ADCSR의 6번 비트를 셋하여
A/D 변환을 시작
- 변환 완료 플래그를 주기적으로 점검하거나 아날로그 디지털 컨버전 완료 인터럽트를
이용하여 A/D 컨버전 이후의 데이터 처리 루틴을 구성
- 반드시 ADCL(하위 데이터)를 먼저 읽어서 저장한 다음에 ADCH(상위 데이터)를 저장
2006-
2006-04-
04-01 -3-
Embedded AVR Programming
ADLAR (ADC Left Adjust Result) : A/D 컨버터 데이터 레지스터와 연관작동
2006-
2006-04-
04-01 -4-
Embedded AVR Programming
단일 전압 입력
2006-
2006-04-
04-01 -5-
Embedded AVR Programming
2006-
2006-04-
04-01 -6-
Embedded AVR Programming
2 0 0 0
2 0 0 1
4 0 1 0
8 0 1 1
16 1 0 0
32 1 0 1
64 1 1 0
128 1 1 1
2006-
2006-04-
04-01 -8-
Embedded AVR Programming
2006-
2006-04-
04-01 -9-
Embedded AVR Programming
2006-
2006-04-
04-01 -10-
10-
Embedded AVR Programming
⊙ 클럭의 선택
- 10비트 분해능으로 정상적인 동작을 위해서는 50kHz~200kHz 범위의 클럭 사용
- ADCSRA 레지스터의 ADPS2~0 비트에 의하여 2,4,8,16,32,64,128 중의 1가지로 선택
- 프리스케일러는 ADCSRA레지스터에서 ADEN=1로 설정한 경우에만 동작
⊙ A/D 컨버터의 동작 시간
조 건 샘플/홀드 시간(사이클) A/D 변환 시간(사이클)
ADEN=1 설정후 최초 변환 13.5 25
그 이후의 일반적인 A/D 변환(단극성 입력) 1.5 13
그 이후의 일반적인 A/D 변환(차동입력) 1.5~2.5 13~14
2006-
2006-04-
04-01 -11-
11-
Embedded AVR Programming
1-4 A/D 변환 결과
⊙ 단극성 입력 채널의 변환 결과
- 변환 결과는 ADCH 및 ADCL에 저장
⊙ 차동입력 채널의 변환 결과
2006-
2006-04-
04-01 -12-
12-
Embedded AVR Programming
1-5 A/D 변환 오차
⊙ 이득 오차(Gain error)
- 이상적인 값에서 일정한 비율만큼 벗어나는 것인데, 이는 디지털 값이 최대치인 경우의
아날로그 입력과 최대 아날로그 입력인 VREF의 차이로 표현
(디지털 값에서 일정치를 곱하거나 나눔으로써 S/W적으로 쉽게 보정)
2006-
2006-04-
04-01 -13-
13-
Embedded AVR Programming
1-6 잡음 제거 방법
⊙ 잡음에 대하여 극도의 안정적인 A/D 변환이 필요한 경우에는 Idle mode(ADC Noise
Reduction Mode)에서 A/D변환을 수행하는 것도 권장
2006-
2006-04-
04-01 -14-
14-
Embedded AVR Programming
2006-
2006-04-
04-01 -15-
15-
Embedded AVR Programming
adc_temp = (((float)(adc_data[0]) / 1024)*500); // Vref가 5V이며 소수점 2째자리까지 표현하기 위해 100을 곱해줌
adc_value = (unsigned int)adc_temp;
delay_ms(2000);
}
}
2006-
2006-04-
04-01 -16-
16-