목차
1. 실험목표
2. 관련이론
3. 데이터시트
4. 실험
5. 실험결과
6. 오차 및 분석
2. 관련이론
3. 데이터시트
4. 실험
5. 실험결과
6. 오차 및 분석
본문내용
시작한다. 분주기는 ADEN bit가 설정되어 있는 한 동작한다.
③ A/D 컨버터의 시작
: single conversion mode에서는 ADCSRA 레지스터의 ADSC bit에 1을 설정함으로써 A/D 변환을 시작한다. 이 ADSC bit는 A/D 변환이 진행 중에는 1의 상태를 유지하다가 변환이 완료되면 자동적으로 클리어된다. A/D 변환이 진행되고 있는 중에 데이터 채널이 바뀌어지면 현재의 변환을 마친 후에야 다른 채널에 대한 변환을 시작한다.
free running mode에서는 A/D 변환이 끊임없이 이루어지고 ADC 데이터 레지스터를 갱신한다. free running mode는 ADCSRA 레지스터의 ADFR bit를 1로 설정함으로써 선택되고, 최초의 변환은 ADCSRA 레지스터의 ADSC bit를 1로 설정함으로써 이루어진다. 이 모드에서 A/D변환은 ADC Interrupt flag인 ADIF bit의 설정값과 관계없이 이루어진다.
④ ADC 기준전압 선택
: 단일전압 입력에서 ADC 기준전압 VREF는 AVCC, 내부 2.56V, external AREF 중 하나를 선택할 수 있다. AVCC는 수동 스위치를 통하여 ADC에 연결되고, 내부 2.56V 전압은 내부 bandgap 기준전압으로부터 발생된다. 어느 경우에도 외부 AREF 핀이 A/D 컨버터에 직접 연결된다. AREF 핀과 GND 사이에 커패시터를 연결해 넣으면 기준전압은 잡음의 영향을 적게 받는다.
⑤ A/D 변환 시간
: 일반적인 경우의 A/D 변환에 13 ADC 클럭 사이클이 소요되며, ADC가 ON 상태가 된 후 최초의 변환은 아날로그 회로를 초기화하기 위해서 25 ADC 클럭사이클이 소요된다.
⑥ A/D 변환의 결과 저장
: A/D 컨버터가 변환을 완료하면 그 변환 결과는 ADC 데이터 레지스터인 ADCH와 ADCL에 저장되는데 ADMUX 레지스터의 ADLAR에 의해 좌 혹은 우측 정렬이 된다.
: ADIF flag bit는 1로 세트된다. 또한 단일전압 입력의 경우에는 ADSC bit가 클리어 된다. 프로그램에서 이 bit를 다시 1로 설정하면 새로운 변환이 ADC 클럭 에지의 최초 상승부에서 시작된다. free running mode에서는 A/D 변환 완료 직후에 새로운 변환이 시작된다. 이 때, ADSC bit는 1의 상태를 유지한다.
: 따라서 입력전안 Vin은 다음 식으로 구해진다.
: 여기서 Vin은 멀티플렉서로 선택된 단일 아날로그 입력전압이고, VREF는 선택된 기준전압이다. 이 변환 결과는 10bit 양의 정수 표현법을 사용하므로 0~1023 범위의 값을 갖는다.
이 때 0의 값은 아날로그 입력전압이 GND와 같은 값이라는 것을 나타내고, 1023값은 아날로그 입력전압이 VREF -1과 같은 값을 나타낸다.
⑦ A/D 변환기 동작 순서 흐름
1. A/D 컨버터 초기화 설정
2. A/D 컨버터 스타트
3. A/D 변환
4. A/D 변환 완료
5. A/D 변환 완료 인터럽트 요청
6. ADC 상태 플래그셋
7. ACD 다음 동작 결정
3. 회로도
※ 모듈 회로도 ※
※ 전체 회로도 ※
4. 예제 코드 및 분석
5. 실험 결과 코드 분석
① 헤더 파일 : 함수와 정의 제공
#include
#include
#include
#include
② 어셈블리 : 포트C를 CLCD의 포트로 사용하도록 설정
#asm
.equ __lcd_port = 0x15;
#endasm
③ 매크로 및 상수 정의 : ADC에 사용할 기준 전압을 정의
#define ADC_VREF_TYPE 0x60
④ 변수 정의 : 문자열 저장 변수 ‘temp\' 정의
unsigned char temp[16];
⑤ 함수 ‘read_adc\' : ADC 값을 읽어옴
unsigned char read_adc(unsigned char adc_input)
{
ADMUX = adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA |= 0x40;
while ((ADCSRA & 0x10) == 0);
ADCSRA |= 0x10;
return ADCH;
}
⑥ 메인 함수
void main(void)
{
unsigned char adc_data;
ADMUX = ADC_VREF_TYPE;
ADCSRA = 0x86;
lcd_init(16);
lcd_clear();
while (1)
{
adc_data = read_adc(0);
lcd_gotoxy(0, 0);
sprintf(temp, \"adc value : %d\", adc_data);
lcd_puts(temp);
}
}
6. 오차 및 분석
- 이번 실험에서는 오차가 일어나지 않았다. 실험 결과가 예상대로 완벽하게 나왔다.
나머지는 내가 생각한 다른 가능성들이다.
- 첫째로, 소자의 불확실성이다. 이번 강의에 사용한 소자는 우리 학교 랩실 인원들이 하나하나 직접 기판에 납땜을 한 소자로서, 그 과정에서 소자가 손상됐을 가능성이 존재한다.
(실제로, 첫 시간에 저항과 전구 등을 납땜하고 노트북과 연결하여 작동을 확인 할 당시, 8개의 전구 중 하나가 계속 불이 들어오지 않아 당황했었는데, 2시간의 피드백 끝에, ATmega128 소자 불량으로 파악되었다. 자세하게는, 49번 핀인 PA2 부분이 제대로 납땜이 되어 있지 않았던 것이다. 그 부분을 인두기로 다시 제대로 납땜하니, 전구는 정상적으로 들어왔다.)
- 둘째로, 점퍼선(와이어)에서도 저항은 존재한다는 것이다. 그러므로 전류가 그 점퍼선(와이어)을 이동하면서 자연스럽게 그 점퍼선 상에 있는 자그마한 저항의 영향을 받기 때문에 시뮬레이션의 결과처럼 이상적이론적 결과는 현실적으로는 불가능하기 때문에 오차가 생긴 것이라고 생각한다.
- 셋째로는, 점퍼선(와이어)의 결함이라고 생각한다.
소자와 소자 사이를 이을 때, 우린 보통 래핑 와이어를 사용하는데, 절연 소자로 감싸져있는 와이어 속이 미세하게 끊어져 있을 수도 있고, 또는 납땜하는 과정에서 미세하게 전류가 통하지 않게 납땜을 했을 가능성 또한 배제할 수 없다고 생각한다.
③ A/D 컨버터의 시작
: single conversion mode에서는 ADCSRA 레지스터의 ADSC bit에 1을 설정함으로써 A/D 변환을 시작한다. 이 ADSC bit는 A/D 변환이 진행 중에는 1의 상태를 유지하다가 변환이 완료되면 자동적으로 클리어된다. A/D 변환이 진행되고 있는 중에 데이터 채널이 바뀌어지면 현재의 변환을 마친 후에야 다른 채널에 대한 변환을 시작한다.
free running mode에서는 A/D 변환이 끊임없이 이루어지고 ADC 데이터 레지스터를 갱신한다. free running mode는 ADCSRA 레지스터의 ADFR bit를 1로 설정함으로써 선택되고, 최초의 변환은 ADCSRA 레지스터의 ADSC bit를 1로 설정함으로써 이루어진다. 이 모드에서 A/D변환은 ADC Interrupt flag인 ADIF bit의 설정값과 관계없이 이루어진다.
④ ADC 기준전압 선택
: 단일전압 입력에서 ADC 기준전압 VREF는 AVCC, 내부 2.56V, external AREF 중 하나를 선택할 수 있다. AVCC는 수동 스위치를 통하여 ADC에 연결되고, 내부 2.56V 전압은 내부 bandgap 기준전압으로부터 발생된다. 어느 경우에도 외부 AREF 핀이 A/D 컨버터에 직접 연결된다. AREF 핀과 GND 사이에 커패시터를 연결해 넣으면 기준전압은 잡음의 영향을 적게 받는다.
⑤ A/D 변환 시간
: 일반적인 경우의 A/D 변환에 13 ADC 클럭 사이클이 소요되며, ADC가 ON 상태가 된 후 최초의 변환은 아날로그 회로를 초기화하기 위해서 25 ADC 클럭사이클이 소요된다.
⑥ A/D 변환의 결과 저장
: A/D 컨버터가 변환을 완료하면 그 변환 결과는 ADC 데이터 레지스터인 ADCH와 ADCL에 저장되는데 ADMUX 레지스터의 ADLAR에 의해 좌 혹은 우측 정렬이 된다.
: ADIF flag bit는 1로 세트된다. 또한 단일전압 입력의 경우에는 ADSC bit가 클리어 된다. 프로그램에서 이 bit를 다시 1로 설정하면 새로운 변환이 ADC 클럭 에지의 최초 상승부에서 시작된다. free running mode에서는 A/D 변환 완료 직후에 새로운 변환이 시작된다. 이 때, ADSC bit는 1의 상태를 유지한다.
: 따라서 입력전안 Vin은 다음 식으로 구해진다.
: 여기서 Vin은 멀티플렉서로 선택된 단일 아날로그 입력전압이고, VREF는 선택된 기준전압이다. 이 변환 결과는 10bit 양의 정수 표현법을 사용하므로 0~1023 범위의 값을 갖는다.
이 때 0의 값은 아날로그 입력전압이 GND와 같은 값이라는 것을 나타내고, 1023값은 아날로그 입력전압이 VREF -1과 같은 값을 나타낸다.
⑦ A/D 변환기 동작 순서 흐름
1. A/D 컨버터 초기화 설정
2. A/D 컨버터 스타트
3. A/D 변환
4. A/D 변환 완료
5. A/D 변환 완료 인터럽트 요청
6. ADC 상태 플래그셋
7. ACD 다음 동작 결정
3. 회로도
※ 모듈 회로도 ※
※ 전체 회로도 ※
4. 예제 코드 및 분석
5. 실험 결과 코드 분석
① 헤더 파일 : 함수와 정의 제공
#include
#include
#include
#include
② 어셈블리 : 포트C를 CLCD의 포트로 사용하도록 설정
#asm
.equ __lcd_port = 0x15;
#endasm
③ 매크로 및 상수 정의 : ADC에 사용할 기준 전압을 정의
#define ADC_VREF_TYPE 0x60
④ 변수 정의 : 문자열 저장 변수 ‘temp\' 정의
unsigned char temp[16];
⑤ 함수 ‘read_adc\' : ADC 값을 읽어옴
unsigned char read_adc(unsigned char adc_input)
{
ADMUX = adc_input | (ADC_VREF_TYPE & 0xff);
delay_us(10);
ADCSRA |= 0x40;
while ((ADCSRA & 0x10) == 0);
ADCSRA |= 0x10;
return ADCH;
}
⑥ 메인 함수
void main(void)
{
unsigned char adc_data;
ADMUX = ADC_VREF_TYPE;
ADCSRA = 0x86;
lcd_init(16);
lcd_clear();
while (1)
{
adc_data = read_adc(0);
lcd_gotoxy(0, 0);
sprintf(temp, \"adc value : %d\", adc_data);
lcd_puts(temp);
}
}
6. 오차 및 분석
- 이번 실험에서는 오차가 일어나지 않았다. 실험 결과가 예상대로 완벽하게 나왔다.
나머지는 내가 생각한 다른 가능성들이다.
- 첫째로, 소자의 불확실성이다. 이번 강의에 사용한 소자는 우리 학교 랩실 인원들이 하나하나 직접 기판에 납땜을 한 소자로서, 그 과정에서 소자가 손상됐을 가능성이 존재한다.
(실제로, 첫 시간에 저항과 전구 등을 납땜하고 노트북과 연결하여 작동을 확인 할 당시, 8개의 전구 중 하나가 계속 불이 들어오지 않아 당황했었는데, 2시간의 피드백 끝에, ATmega128 소자 불량으로 파악되었다. 자세하게는, 49번 핀인 PA2 부분이 제대로 납땜이 되어 있지 않았던 것이다. 그 부분을 인두기로 다시 제대로 납땜하니, 전구는 정상적으로 들어왔다.)
- 둘째로, 점퍼선(와이어)에서도 저항은 존재한다는 것이다. 그러므로 전류가 그 점퍼선(와이어)을 이동하면서 자연스럽게 그 점퍼선 상에 있는 자그마한 저항의 영향을 받기 때문에 시뮬레이션의 결과처럼 이상적이론적 결과는 현실적으로는 불가능하기 때문에 오차가 생긴 것이라고 생각한다.
- 셋째로는, 점퍼선(와이어)의 결함이라고 생각한다.
소자와 소자 사이를 이을 때, 우린 보통 래핑 와이어를 사용하는데, 절연 소자로 감싸져있는 와이어 속이 미세하게 끊어져 있을 수도 있고, 또는 납땜하는 과정에서 미세하게 전류가 통하지 않게 납땜을 했을 가능성 또한 배제할 수 없다고 생각한다.
추천자료
교육연수계획서 (최신기준)
(A+) 마이크로프로세서응용 ATmega128 USART 보고서
(A+) 마이크로프로세서응용 ATmega128 16Bit Timer, Counter, PWM 보고서
(A+) 마이크로프로세서응용 ATmega128 8bit Timer, Counter 보고서
(A+) 마이크로프로세서응용 ATmega128 CLCD 실습 보고서
(A+) 마이크로프로세서응용 ATmega128 Polling 방식과 Interrupt 방식 보고서
(A+) 마이크로프로세서응용 ATmega128 Module, 노트북과 ISP 이용한 LED 제어 결과보고서
(A+) 마이크로프로세서응용 ATmega128 Module, Test Board LED 결과보고서
소개글