제목 : 실험 #8 예비보고서 ADC 제어 실험목적 - ADC를이용하여아날로그신호를디지털신호로변환하는과정을이해한다. - ATmega128의내장 ADC 제어방법을이해한다. 실험장비 - ATmega128(AVR Chip), 온도센서 (TC1047A), 조도센서 (TSL251R) 실험이론 - A/D 변환 아날로그신호 샘플링펄스 - A/D 변환과정 - A/D 변환과정은샘플 & 홀드로동작한다. 파형을보다정교하게처리하려면샘플링펄스의주기를짧게하여더많은샘플링결과를얻어야한다. 샘플 & 홀드는샘플링결과값을다음샘플링때까지일정하게유지시킴으로써 ADC가신호를변환하는동안일정한입력값을얻을수있게한다. - 양자화과정 - 아날로그값을바이너리코드로변환하는과정을양자화라고한다. 바이너리코드의비트수를증가시키면샘플링결과를보다정밀하게나타낼수있게된다. - 2 비트와 4 비트의정밀도차이 -
- ATmega128의내장 ADC(Analog-Digital Converter) 모듈 아날로그신호를디지털신호로, A/D 변환해주는모듈을 ADC라고한다. ADC의종류에는플래시, 이중경사, 연속근사, 시그마-델타등이있는데, 연속근사방식이가장널리사용되며, ATmega128의내장 ADC 역시연속근사방식으로동작한다. 10비트분해능 0.5 LSB의적분형비선형성 ±2 LSB의절대정밀도 13~260μs의변환시간 초당 76,900 ~ 15kbps 샘플링 8개의멀티플렉스된단극성입력채널 7개의차동입력채널 10배와 200배의선택적이득을갖는 2개의차동입력채널 ADC의결과값에대한좌우측보정기능 0~VCC까지의 ADC 입력전압범위 기준전압으로내부의 2.56V와외부의 2.0V ~ AVCC를선택가능 프리런닝또는단일변환모드 ADC 변환완료시에인터럽트발생 슬립모드잡음제거기 - ATmega128의 ADC 내부구조및특징 - 아날로그신호는 Port F의 0~7까지 8개의핀을통해입력가능하다. 각핀은 8개의단극성입력으로동작할수있고, 기준입력을제외한 7개의핀은 ADC1~0, ADC3~2, ADC1 기준, ADC2기준등네가지타입의차동입력으로동작할수도있다. ADC1~0과 ADC3~2 차동입력의경우내부증폭기에의해 1배, 10배, 200배중원하는동작을선택할수있다. 1배, 10배증폭의경우 8비트, 200배증폭의경우 7비트의해상도를가진다. 디지털회로의영향을받지않고, 잡읍에보다안정적인동작을수행할수있도록, 독립적인아날로그회로전원단자및기준전원입력단자 AVCC와 AREF를가지고있으며, AVCC는 VCC±0.3V 이내의전압을유지해야한다. AREF는 AVCC와 VCC를초과할수없으며 AVCC나내부의 2.56V 전압을사용할때에는 AREF와 GND 사이에 0.1uF의캐패시터를연결하여사용한다. 단극성입력시주파수는 50~1000kHz, VREF는 2.0V~AVCC, 아날로그입력전압은 GND~VCC를사용한다. 차동입력시주파수는 50~200kHz, VREF는 2.0V~AVCC-0.5, 아날로그입력전압은 GND~VCC를사용한다. A/D변환은단일모드와프리러닝모드가있는데, 프리러닝모드는 ADSRA 레지스터의 ADSC 비트를 1로설정하면처음 A/D변환이시작되고, 이후에도 ADSC를 1로설정할필요없이자동으로변환이반복된다. A/D변환결과는 10비트값으로, ADCH/L 두개의레지스터에저장되는데, 그값은다음공식에의해결정된다. - 단일모드 - - 차동입력 - 차동입력의 GAIN은증폭배율을뜻한다. 이식을통해 A/D 변환결과를통해입력전압인 V IN 과 (V POS -V NEG ) 를계산할수도있다.
- ATmega128 의내장 ADC 관련레지스터 ADC Multiplexer Selection Register. ADC의아날로그입력채널, 기준전압, 변환결과레지스터의저장형식을선택한다. Reference Selection Bits. ADC에사용할기준전압을선택한다. AVCC 및내부전압을사용할경우 AREF와 GND 사이에 0.1uF의캐패시터를연결한다. REFS[1:0] ADLAR ADC Left Adjust Result. A/D변환결과 10비트값이만들어지기때문에 ADCH, L 두개의레지스터에저장되는데, 변환결과를왼쪽으로정렬해 ADC레지스터 16비트공간의최상위에위치시킬것인지, 오른쪽으로정렬해상위 6비트를비울것인지선택한다. 0 = 오른쪽정렬, 1 = 왼쪽정렬 Analog Channel and Gain Selection Bit. ADC에사용할아날로그입력채널을선택한다. 차동입력의경우같은핀을 +, - 입력으로사용할수도있는데, 이는오프셋오차를수정하기위해수정할오프셋을알아내기위해 (Offset calibration) 사용된다. MUX[4:0] - ADMUX 레지스터 -
ADC Control Status Register A. ADC의동작을설정하거나상태를표시한다. ADC Enable. A/D 변환은전력소모가많기때문에 ATmega128은사용할경우에만 ADC 모듈을켜 ADEN 도록구성해놓았다. 이비트의값을 1로설정해 ADC를사용가능하도록해야 A/D변환을수행할수있다. ADC Start Conversion. 이비트를 1로설정하면 A/D 변환이시작된다. 단, 프리러닝모드에서는매번이비트를 1로설정하지않아도처음 1로설정해변환이시작된이후에도자동으로변환이 ADSC 반복된다. ADSC가 1로설정된후, 처음변환에는 25클럭, 이후에는 13클럭이소요된다. A/D변환수행중에도값이 1로유지되며, 변환이끝났을때하드웨어적으로 0으로설정된다. ADC Free Running Select. ADC를프리러닝모드로설정한다. 프리러닝모드에서는 ADSC를 1로설정한이후, ADFR 지속적으로 A/D변환이일어나기때문에, 임의의시간의 A/D 변환결과를읽어들일수있다. ADC Interrupt Flag. A/D변환이완료되어 ADC 레지스터의값이갱신된이후하드웨어적으로 1로설정되고, 인 ADIF 터럽트를요청한다. ADIE와 SREG의 I 비트가 1로설정되어있으면인터럽트가발생된다. 인터럽트처리가시작되면하드웨어적으로 0으로설정되며, 이비트를강제로 0으로클리어하려면이비트에 1을써야한다. ADC Interrupt Enable. ADIE A/D 변환완료인터럽트를허가한다. 실제로인터럽트가처리되려면 SREG 레지스터의 I 비트역시 1로설정되어야한다. ADC Prescaler Select Bit. ADC에인가되는클럭의분주비를선택한다. A/D변환에는일정주기의클럭이소요되므로, 시스템클럭을어떤분주비로나눌것인가에따라변환시간이달라진다. ADPS[2:0] - ADCSRA 레지스터 - ADLAR = 0 ADLAR = 1 ADC Data Register. ADC 의변환결과를저장하는레지스터. 단극성입력시 10 비트양의정수로 0~1023, 차동입력시 10 비트 2 의보수로 512~511 의범위를갖는다. 반드시 ADCL 을먼저읽고 ADCH 를읽어야한다. ADLAR 설정에따라데이터정렬방법이달라지는데, 필요에따라설정해사용하면된다. 예를들어하위 2 비트값이필요없다면 ADLAR 을 1 로설정해상위 8 비트값을모두 ADCH 에저장하도록하는것이사용하기편하다. - ADCH/L 레지스터 -
- 실험킷의 ADC 회로 - 실험킷의 ADC 회로구성 - 실험킷에는 ATmega128 내부 ADC 외에, 외부의 ADC 칩을통한 A/D변환도실습할수있도록구성되어있는데, 회로는위와같다. 입력단자인 SMA-R-PC를통해아날로그신호를입력받고, OPAMP를통해 ADC 칩인 AD0809CCN에 IN0 핀으로입력된다. 그외에 IN1과 2에 ADC0과 1이입력되는데, 이는실험킷의온도센서, 조도센서와연결되어있다. 이세입력은 A0~2 핀의조합으로선택할수있는데, ADC_CS 주소에쓴값을통해선택하는것으로생각된다. 변환된값을읽을때엔 ADC_READ 주소의값을읽어오면된다. 메모리매핑된 ADC 칩의주소에접근하면 CPLD에서 ADC_CS 신호를출력하게되고그신호가 ADC 칩의 START 핀에입력되어 A/D변환이시작된다. - 온도센서 (TC1047A) TC1047A 칩은온도에따라다른크기의전압을출력하는칩이다. 따라서이전압을통해현재온도를알수있게된다. 2.5~5.5V에서동작하며, 최소 40, 최대 125 까지측정가능하다. 0 에서 500mV의출력을내보내며, 1 마다 10mV씩증가한다. 따라서 40 의 100mV ~ 125도의 1.75V 사이의출력값을가진다. - TC1047A 의온도에따른출력그래프 - - 실험킷상의온도센서 - 실험킷의온도센서회로구성 - 입력전압으로 3.3V가사용되었고, 출력값은점퍼설정에따라 ADC0과 ADC2에출력된다. 점퍼 10을쇼트시킬경우 ADC0와연결되어외부 ADC 칩에서사용할수있고, 점퍼 7을쇼트시킬경우 ATmega128의 ADC2 단자에연결되어내부 ADC에서사용할수있다. 0 에서 500mV의출력을내보내기때문에, V IN = ADC * V REF / 1024 공식을통해 A/D변환결과에서입력전압을구하고, 그전압에서 500mV를빼면측정온도를구할수있다.
- 조도센서 (TSL251R) TSL251R 칩은광량에따라다른크기의전압을출력하는칩이다. 따라서이전압을통해현재밝기를알수있게된다. 2.7~5.5V에서동작하며, 어두울시 0에서밝을시최대 3.3V 의출력값을가진다. 또한, 빛을쬐는각도에따라서도아래와같이출력전압이변하기때문에적절한위치선정이중요하다. - TSL251R 의조도에따른출력그래프 - - 실험킷상의조도센서 - 실험킷의조도센서회로구성 - 입력전압으로 3.3V가사용되었고, 출력값은점퍼설정에따라 ADC1과 ADC3에출력된다. 점퍼 9를쇼트시킬경우 ADC1과연결되어외부 ADC 칩에서사용할수있고, 점퍼 8을쇼트시킬경우 ATmega128의 ADC3 단자에연결되어내부 ADC에서사용할수있다. V IN = ADC * V REF / 1024 공식을통해 A/D변환결과에서입력전압을구해조도를알수있다. 실험방법 - AVR Studio 4를이용하여프로그램소스코드작성후빌드하여실행파일 (.hex) 을생성한다. - AVR Studio 4의 AVR Programmer 를이용, AVR칩에프로그램을다운로드하여실험킷에서의동작을확인한다. 예제코드분석.include "m128def.inc".equ TLCD_LE = 0x6800.equ TLCD_CS = 0x6400.cseg.org 0x0000 INIT_MCU: LDI R16, high(0x10ff) LDI R17, low(0x10ff) OUT SPH,R17 OUT SPL,R16 Text LCD 제어신호의메모리매핑주소 Text LCD 데이터버스의메모리매핑주소 프로그램의코드의시작이후의코드를메모리주소 0x00 부터시작장치초기화루틴프로그램의스택설정
LDI R16,0b10000000 OUT MCUCR,R16 CALL INIT_LCD LDI R16, 0x80 LDI R16, '0' LDI R16, 'x' 외부메모리에접근하기위해 MCUCR 레지스터의 SRE 비트를 1 로설정한다. A/D 변환결과를 LCD 에출력하기때문에먼저 LCD 를초기화한다. LCD 의각라인첫행에 0x 를출력한다. LDI R16, 0xC0 LDI R16, '0' LDI R16, 'x' LOOP: LDI R16,0b10000101 OUT ADCSRA,R16 LDI R16,0b01000010 OUT ADMUX,R16 CALL D200US CALL TEMP_SENSOR LDI R16,0b10000101 OUT ADCSRA,R16 LDI R16,0b01000011 OUT ADMUX,R16 CALL D200US CALL LIGHT_SENSOR CALL D200MS JMP LOOP LIGHT_SENSOR: LDI R20,16 LIGHT_SENSOR_SUB1: LDI R16,0b11010101 OUT ADCSRA,R16 NOP LIGHT_SENSOR_SUB2: SBIS ADCSRA, ADIF JMP LIGHT_SENSOR_SUB2 IN R16, ADCL IN R17, ADCH ADD R18, R16 ADC R19, R17 CALL D1MS DEC R20 BRNE LIGHT_SENSOR_SUB1 메인루틴 ADC Enable, 결과우측정렬, 32 분주를사용하도록설정한다. 따라서 ADC 는 8MHz / 32 = 250KHz 로동작한다. AVCC 에인가된외부전압을사용하고, ADC2 와연결된온도센서를단극성으로입력받도록설정한다. 기준전압설정을변경하면회로가안정될때까지최소 125us 이상기다린후 A/D 변환을시작해야하기때문에 200us 의딜레이를준다. 온도센서 A/D 변환루틴을호출한다. ADC Enable, 결과우측정렬, 32 분주를사용하도록설정한다. 따라서 ADC 는 8MHz / 32 = 250KHz 로동작한다. AVCC 에인가된외부전압을사용하고, ADC3 과연결된조도센서를단극성으로입력받도록설정한다. 기준전압설정을변경하면회로가안정될때까지최소 125us 이상기다린후 A/D 변환을시작해야하기때문에 200us 의딜레이를준다. 조도센서 A/D 변환루틴을호출한다. 프로그램반복실행 조도센서 A/D 변환루틴 16 회 A/D 변환을카운트하기위해 R20 에 16 을저장한다. 조도센서 A/D 변환시작루틴 A/D 변환을시작하며, ADIF 플래그를 0 으로설정한다. 조도센서 A/D 변환결과처리루틴 ADIF 플래그를조사하여 1 일때까지대기한다. A/D 변환결과를 R17:R16 에가져온다. 이전 A/D 변환결과에현재 A/D 변환결과를더한다. 16 회의 A/D 변환이수행될때까지 A/D 변환시작루틴으로돌아가반복한다. 16 회에걸친 A/D 변환결과가더해진값을가지고있는 R19:R18 레지스터를우측으로네번쉬프트하여 16 으로나눈값을만든다. 즉 (16 회 A/D 변환값의합 ) / 16 으로, 평균값을구한다.
LDI R16,0x82 MOV R17,R19 MOV R16,R18 CALL LCD_4HEX LDI R16,0x89 LDI R17,high(330) LDI R16,low(330) CALL MUL16 LDI R23,high(1024) LDI R22,low(1024) ; ; CLR R23 LDI R22,10 MOV R20, R18 CLR R23 LDI R22,10 ORI R16, '0' LDI R16,'.' MOV R16, R18 ORI R16, '0' MOV R16,R20 ORI R16,'0' RET TEMP_SENSOR: LDI R20,16 LCD 의첫번째행세번째열에커서를위치시킨다. 16 비트숫자를 4 자리 16 진수로변환하여 LCD 에출력해주는 LCD_4HEX 루틴을호출하기위해인수로사용하는 R17:R16 에 A/D 변환값을복사한뒤, LCD_4HEX 루틴을호출한다. 즉, 조도센서의 A/D 변환결과값을 16 진수로출력한다. LCD 의첫번째행열번째열에커서를위치시킨다. 이후의코드는입력전압을계산하는코드이다. 기준전압인 3.3V 에서소수둘째자리까지남기기위해 100 을곱한 330 을곱할수로 R17:R16 에저장한다. R19:R18 을 R17:R16 과곱해결과를 R19~R16 에저장하는루틴인 MUL16 을호출한다. R19:R18 은위에서계산한 A/D 변환의평균값이다. 입력전압계산식에따라 1024 로나누기위해 1024 를 R17:R16 에저장한다. R19~R16 을 R23:R22 로나눠몫을 R17:R16 에, 나머지를 R19:R18 에저장하는루틴인 DIV16 을호출한다. 위나눗셈결과를다시 10 으로나눈다. 나머지를 R20 에복사한다. 위나눗셈결과를다시 10 으로나눈다. 즉, 100 을나눈나머지 10 진수두자리값이 R18 과 R20 에저장된다. 현재 LCD 커서위치에 0 을출력한다. 현재 LCD 커서위치에. 을출력한다. 나머지중 10 의자리값에 0 의 ASCII 코드값을더해해당숫자의문자값을 R16 에저장하고, LCD_DATA 루틴을호출해현재 LCD 커서위치에나머지중 10 의자리값을출력한다. 나머지중 1 의자리값에 0 의 ASCII 코드값을더해해당숫자의문자값을 R16 에저장하고, LCD_DATA 루틴을호출해현재 LCD 커서위치에나머지중 1 의자리값을출력한다. 온도센서 A/D 변환루틴이하과정은조도센서 A/D 변환루틴과크게차이가없다. TEMP_SENSOR_SUB1: LDI R16,0b11010101 OUT ADCSRA,R16 NOP TEMP_SENSOR_SUB2: SBIS ADCSRA, ADIF JMP TEMP_SENSOR_SUB2 IN R16, ADCL IN R17, ADCH ADD R18, R16 ADC R19, R17 CALL D1MS DEC R20 BRNE TEMP_SENSOR_SUB1
LDI R16,0xC2 MOV R17,R19 MOV R16,R18 CALL LCD_4HEX LDI R16,0xC9 LDI R17,high(1122) LDI R16,low(1122) CALL MUL16 온도센서값은 LCD 의두번째행에표시한다. 조도센서와달리기준전압인 3.3V 에 100 을곱한 330 대신 1122 를곱하기위해준비하는데, 이유는할수없다. LDI R23,high(1024) LDI R22,low(1024) CLR R23 LDI R22,10 MOV R20, R18 CLR R23 LDI R22,10 ORI R16, '0' MOV R16, R18 ORI R16, '0' LDI R16,'.' MOV R16,R20 ORI R16,'0' RET.include "Delay.asm".include "LCD_LIB.asm".include "Math_LIB.asm" 딜레이관련함수가정의된 asm 파일 LCD 제어관련함수가정의된 asm 파일 16 비트곱셈, 나눗셈용함수가정의된 asm 파일 참고문헌 - ADC 이론 : 보조자료 ADC Document.pdf - 온도센서이론 : TC1047A Datasheet - 조도센서이론 : TSL251R Datasheet