Chapter. 14 DAC 를이용한 LED 밝기제어 HBE-MCU-Multi AVR Jaeheung, Lee
목차 1. D/A 변환기 2. 병렬 D/A 변환기로 LED 밝기제어하기 3. 직렬 D/A 변환기로 LED 밝기제어하기
D/A 변환기 D/A 변환기 (Digital to Analog Converter) 디지털데이터를아날로그전압으로변환하는소자 A/D변환기와함께마이크로프로세서응용회로에서널리사용됨. 성능평가요소 : 변환시간, 분해능, 선형성 분해능이높을수록섬세한아날로그값을출력할수있다. 인터페이스에따른분류 n n 병렬 D/A 컨버터직렬 D/A 컨버터
D/A 변환기 병렬 D/A 변환기 (Parallel DAC) DAC 모듈의병렬 D/A 변환기인 AD7302 는두개의출력채널을가지는 8 bit DAC 임. 0~255 까지의디지털데이터를 0V~5V 사이의아날로그신호로바꿔줌. 병렬 D/A 변환기 (AD7302) 핀설명 Pin Name 기능 D7~D0 데이터입력, CS 및 WR의제어신호를통해내부버퍼에로드된다. CS Chip Select. Low 신호에동작한다. WR Write Enable. Low 신호에서동작되며 CS와 A/B에의해동작이결정된다. A/B DAC Select. AD7302는두개의출력포트를지원하며출력값을설정할때설정할포트를지정하는역할을한다. LDAC 내부레지스터에설정된포트값에해당하는출력을업데이트하는역할을하며이값을 0 으로고정할경우 WR의값이상승할때출력값이업데이트되도록구성할수있다. CLR 내부레지스터의값을초기화하는역할을한다. VOUT DAC 출력이며그범위는 0V ~ 5.0V 이다.
D/A 변환기 병렬 D/A 변환기 AD7302 신호의타이밍도
D/A 변환기 직렬 D/A 변환기 (Serial DAC) DAC 모듈의직렬 D/A 변환기 DAC081S101 은시리얼인터페이스를가지는 8 비트 D/A 변환기임. 0~255 까지의디지털데이터를 0V~5V 사이의아날로그신호로바꿔줌. 직렬 D/A 변환기 (DAC081S101) 핀설명 Pin Name 기능 DIN SCLK Serial Data Input. SYNC 가하강후 CLK 하강타이밍을기준으로 16bit 가입력된다. Serial Clock Input. DIN 입력에대한래치클럭 SYNCN 데이터의시작을알리는신호로데이터입력구간동안 Low 값을가진다. VOUT DAC 출력이며그범위는 0V ~ 5.0V 이다.
D/A 변환기 직렬 D/A 변환기 DAC081S101 신호의타이밍도
실습 21 : 병렬 DAC 를이용한 LED 밝기제어 실습개요 DAC 모듈의병렬 D/A 변환기를이용하여 LED 의밝기를조절하도록한다. DAC 로디지털데이터를출력하여 DAC 에서변환된아날로그신호가 LED 에입력되어그값의크기에따라 LED 의밝기가제어된다. 실습목표 병렬 D/A 변환기의아날로그출력특성을이해 ATmega128 를이용한병렬 D/A 변환기구동방법습득
실습 21 : 병렬 DAC 를이용한 LED 밝기제어 사용모듈 : MCU 모듈, LED 모듈, DAC 모듈 포트 E, G DAC 모듈병렬 DAC 에연결 MCU 모듈 DAC Analog 출력 LED 모듈 LED 모듈 Signal DAC 모듈병렬 DAC Signal DAC 모듈
실습 21 : 병렬 DAC 를이용한 LED 밝기제어 사용모듈 : DAC 모듈의병렬 DAC 부회로
실습 21 : 병렬 DAC 를이용한 LED 밝기제어 모듈결선방법 MCU 모듈포트 E 의 PE0 ~PE7 을 8 핀케이블로 DAC 모듈의 P_DB0 ~ 7 까지연결 MCU 모듈포트 G 의 PG0 를 DAC 모듈의 P_CS 에, PG1 을 P_WR 에, PG2 를 P_LDAC 에, PG3 를 P_A/B 에연결 병렬 DAC 의아날로그출력단자 OUTA, OUTB 를 2 핀케이블 2 개를이용해서 LED 모듈의 LED 0 와 1 에연결
실습 21 : 병렬 DAC 를이용한 LED 밝기제어 구동프로그램 : 사전지식 개요 n 아날로그출력 A 와 B 에각각다른입력데이터를넣어서그출력에연결된 LED 의밝기를 A 는점점밝아지게, B 는점점어두워지게만들도록한다 n 데이터입력시 A/B 신호를번갈아 0 (A 출력 ) 과 1 (B 출력 ) 로넣어주어야한다. 소스구성 n p_dac_lib.c : DAC 를초기화하는함수와 DAC 에데이터를입력시키는함수를정의 n Parallel_DAC.c : 메인프로그램파일
실습 21 : 병렬 DAC 를이용한 LED 밝기제어 구동프로그램 : 사전지식 병렬 DAC 구동을위한신호구현순서 1) CS, WR 는 low( 0 ) 가될때동작을하므로처음에는 high( 1 ) 로설정한다. 2) LDAC 핀이 low( 0 ) 를유지하면 Auto update 모드로동작한다. 3) D/A 변환을하려면우선, 출력할 AB 포트중하나를선택한다. 4) 그리고, 칩선택을위해 CS 핀을 low ( 0 ) 로한다. 5) 데이타를쓰기위해 WR 를 low( 0 ) 로한다. 6) 공식 V out = 2 x (N /256) x Vref 에맞춰서데이타를입력한다. N : 입력하는데이타 Vref : 입력전압 (5v) / 2 7) WR, CS 을다시 high( 1 ) 로해주는순간전압이출력된다.
실습 21 : 병렬 DAC 를이용한 LED 밝기제어 구동프로그램 : 소스분석 P_dac_lib.h 1-1) #include<avr/io.h> #define OUTA 0x00 #define OUTB 0x08 #define AD7302_DATA PORTE #define AD7302_DATA_DDR DDRE #define AD7302_CTRL PORTG #define AD7302_CTRL_DDR DDRG #define P_CS 0x01 #define P_WR 0x02 #define P_LDAC 0x04 #define P_AB 0x08 void DAC_init(); void DAC_vol_gen(unsigned char selab,unsigned char voltage);
실습 21 : 병렬 DAC 를이용한 LED 밝기제어 구동프로그램 : 소스분석 P_dac_lib.c 2-1) #include"p_dac_lib.h void DAC_init(){ AD7302_DATA_DDR = 0xFF; AD7302_DATA = 0x00; // data 출력 AD7302_CTRL_DDR = P_CS P_WR P_LDAC P_AB; } AD7302_CTRL = P_CS P_WR ; //Auto Update Moce
실습 21 : 병렬 DAC 를이용한 LED 밝기제어 2-2) void DAC_vol_gen(unsigned char selab,unsigned char voltage){ AD7302_CTRL &= ~P_AB ; AD7302_CTRL = selab; AD7302_CTRL &= ~P_CS; AD7302_CTRL &= ~P_WR; AD7302_DATA = voltage; AD7302_CTRL = P_WR; AD7302_CTRL = P_CS; // 출력선택 // 전압선택 }
실습 21 : 병렬 DAC 를이용한 LED 밝기제어 구동프로그램 : 소스분석 Parallel_DAC.c 3-1) #include<avr/io.h> #include<util/delay.h> #include"p_dac_lib.h #define DELAY_MS(x) {static unsigned int _i; \ for(_i=0;_i<x;_i++) \ _delay_ms(1); } int main() { unsigned char VolA = 0x01, VolB = 0xFF; 3-2) DAC_init(); //Parallel DAC 초기화함수 while(1){
실습 21 : 병렬 DAC 를이용한 LED 밝기제어 3-3) DAC_vol_gen(OUTA,VolA); //DAC 에데이터를전송 DAC_vol_gen(OUTB,VolB); 3-4) VolA+ = 4; VolB- = 4; VolA = (VolA == 0? 0x01 : VolA); VolB = (VolB == 0? 0xFF : VolB); DELAY_MS(10); } return 0; } //OUTA 에는전압상승발생 //OUTB 에는전압하강발생 //10ms 단위로딜레이발생
실습 21 : 병렬 DAC 를이용한 LED 밝기제어 실행결과
실습 22 : 직렬 DAC 를이용한 LED 밝기제어 실습개요 DAC 모듈의직렬 D/A 변환기를이용하여 LED 의밝기를조절하도록한다. DAC 로디지털데이터를출력하여 DAC 에서변환된아날로그신호가 LED 에입력되어그값의크기에따라 LED 의밝기가제어된다. 실습목표 직렬 D/A 변환기의아날로그출력특성을이해 ATmega128 를이용한직렬 D/A 변환기구동방법습득
실습 22 : 직렬 DAC 를이용한 LED 밝기제어 사용모듈 : MCU 모듈, LED 모듈, DAC 모듈 MCU 모듈 포트 A DAC 모듈직렬 DAC 에연결 LED 모듈 LED 모듈 Signal DAC Analog 출력 DAC 모듈 DAC 모듈직렬 DAC Signal
실습 22 : 직렬 DAC 를이용한 LED 밝기제어 사용모듈 : DAC 모듈의직렬 DAC 부회로
실습 22 : 직렬 DAC 를이용한 LED 밝기제어 모듈결선방법 직렬 DAC 의아날로그출력단자 OU T_C 는 LED 모듈의 LED 0 에연결 MCU 모듈포트 A 의 PA0 를 DAC 모듈의 S_DIN 에, PA1 을 S_CLK 에, PA2 를 S_SYNC 에연결
실습 22 : 직렬 DAC 를이용한 LED 밝기제어 구동프로그램 : 사전지식 개요 n 아날로그 DAC 에입력데이터를넣어서그출력인 OUT_C 에연결된 LE D 의밝기를점점밝아지게만들도록한다. 직렬 D/A 변환기의입력신호 n CLK 신호에맞추어데이터가한비트씩입력되는데, 그최상위비트의위치를알려주기위해 SYNC 신호를필요로한다. n SYNC 핀이 low 가될때쓰기 (write) 작업을실시 n SYNC 가 low 이고, SCLK 가하강에지일때, Din 이쉬프트 (shift) 레지스터에저장 n 마지막 16 번째비트의 SCLK 하강에지가되면, 정해진동작이시작되며, SYNC 가 high( 1 ) 가되면전압이출력 n 출력전압 : Vout ( 출력전압 ) = Va ( 입력전압 ) x ( 입력값 / 256)
실습 22 : 직렬 DAC 를이용한 LED 밝기제어 구동프로그램 : 사전지식 직렬 DAC 구동을위한신호구현순서 1) 먼저 SYNC 를 high( 1 ) 로만든다. 2) CLK 를 High( 1 ) 로만들었다가잠시후다시 Low( 0 ) 로만든다. 3) 잠시후 SYNC 를 Low( 0 ) 로만든다. 4) CLK 를 High( 1 ) 로만들고, 잠시후데이터를 1 비트보낸다. 5) 잠시후 CLK 를 Low( 0 ) 로만든다. 6) 데이터가모두전달될때까지 4~5 를반복한다.
실습 22 : 직렬 DAC 를이용한 LED 밝기제어 구동프로그램 : 소스분석 Serial_DAC.c 1) #include<avr/io.h> #include<util/delay.h> #define DELAY_MS(x) { static unsigned int _i; \ for(_i=0;_i<x;_i++) \ _delay_ms(1); } #define CLK 0x02 #define Din 0x01 #define SYNC 0x04 #define DAC_PORT PORTA #define DAC_DDR DDRA unsigned char outvol=0;
실습 22 : 직렬 DAC 를이용한 LED 밝기제어 2) void Convert_sDAC(unsigned char tmp); int main(){ DAC_DDR = CLK Din SYNC; DAC_PORT = 0x00; unsigned char VolC = 0x00; Convert_sDAC(0x00); // 초기출력전압 3) while(1){ Convert_sDAC(VolC); VolC+ = 4; VolC =(VolC == 0? 0x01 : VolC); // 전압상승 DELAY_MS(10); //10ms단위로딜레이발생 } return 0; }
실습 22 : 직렬 DAC 를이용한 LED 밝기제어 3) void Convert_sDAC(unsigned char tmp){ unsigned int data=0,mask; unsigned char i; mask = 0x8000; data = tmp<<4; // write sequence PORTA = SYNC; asm("nop"); PORTA = (CLK); asm("nop"); PORTA &= ~(CLK); asm("nop"); PORTA &= ~SYNC; asm("nop");
실습 22 : 직렬 DAC 를이용한 LED 밝기제어 3) for(i=0;i<16;i++){ //data 전송 PORTA = (CLK); asm("nop"); if(data & mask) PORTA = Din; //( 조건문사용 ) 포트A를 Din으로출력 else PORTA &= ~(Din); // 포트A를반전 Din으로출력 asm("nop"); PORTA &= ~(CLK); // 포트A를반전 CLK로출력 asm("nop"); data <<= 1; } }
실습 22 : 직렬 DAC 를이용한 LED 밝기제어 실행결과