디지털 및 아날로그는 전자 제품의 필수 부분입니다. 대부분의 장치에는 ADC와 DAC가 모두 있으며 신호를 아날로그에서 디지털로 또는 디지털에서 아날로그로 변환해야 할 때 사용됩니다. 또한 소리와 빛과 같은 실제 신호는 본질적으로 아날로그이므로 이러한 실제 신호를 사용해야 할 때마다 디지털 신호를 아날로그로 변환해야합니다 (예: 스피커를 사용하여 사운드를 생성하거나 광원을 제어하기 위해).
또 다른 유형의 DAC는 펄스 폭 변조기 (PWM)입니다. PWM은 디지털 워드를 받아 가변 펄스 폭을 가진 디지털 펄스를 생성합니다. 이 신호가 필터를 통과하면 결과는 순전히 아날로그가됩니다. 아날로그 신호는 신호에 여러 유형의 데이터를 포함 할 수 있습니다.
이 튜토리얼에서는 DAC MCP4921과 Microchip PIC16F877A를 연결하여 디지털에서 아날로그로 변환 합니다.
이 튜토리얼에서는 디지털 신호를 아날로그 신호로 변환하고 입력 디지털 값과 출력 아날로그 값을 16x2 LCD에 표시합니다. 마지막에 주어진 비디오에서 시연되는 최종 아날로그 출력으로 1V, 2V, 3V, 4V 및 5V를 제공합니다. Raspberry Pi, Arduino 및 STM32 보드와의 DAC 인터페이스에 대한 귀중한 자습서에서 DAC에 대해 자세히 알아볼 수 있습니다.
DAC는 모터 제어, LED 조명의 제어 밝기, 오디오 증폭기, 비디오 인코더, 데이터 수집 시스템 등과 같은 많은 애플리케이션에서 사용할 수 있습니다. 인터페이스 부분으로 바로 이동하기 전에 MCP4921에 대한 개요를 확인하는 것이 중요합니다.
MCP4921 DAC (디지털-아날로그 변환기)
MCP4921은 12 비트 DAC이므로 MCP4921은 12 비트의 출력 해상도를 제공합니다. DAC 분해능은 아날로그 신호로 변환 할 수있는 디지털 비트 수를 의미합니다. 이로부터 얼마나 많은 값을 얻을 수 있는지는 공식을 기반으로합니다. 12 비트의 경우 = 4096입니다. 이는 12 비트 분해능 DAC가 4096 개의 서로 다른 출력을 생성 할 수 있음을 의미합니다.
이 값을 사용하면 단일 아날로그 스텝 전압을 쉽게 계산할 수 있습니다. 단계를 계산하려면 기준 전압이 필요합니다. 장치의 논리 전압이 5V이므로 스텝 전압은 5/4095 (디지털의 시작점이 1이 아니기 때문에 4096-1, 0)이며 0.00122100122 밀리 볼트입니다. 따라서 1 비트를 변경하면 0.00122100122로 아날로그 출력이 변경됩니다.
그래서 그것이 변환 부분이었습니다. MCP4921은 8 핀 IC이다. 핀 도면 및 설명은 아래에서 찾을 수있다.
MCP4921 IC는 SPI 프로토콜에 의한 마이크로 컨트롤러와 통신. SPI 통신의 경우 장치는 마스터 여야하며 슬레이브로 연결된 외부 장치에 데이터 또는 명령을 제출합니다. SPI 통신 시스템에서는 하나의 마스터 장치에 여러 개의 슬레이브 장치를 연결할 수 있습니다.
데이터와 명령을 제출하려면 명령 레지스터를 이해하는 것이 중요합니다.
아래 이미지에는 명령 레지스터가 표시되어 있습니다.
커맨드 레지스터는 16 비트 레지스터이다. 비트 -15에서 비트 -12는 구성 명령에 사용됩니다. 데이터 입력 및 구성은 위의 이미지에 명확하게 표시됩니다. 이 프로젝트에서 MCP4921은 다음 구성으로 사용됩니다.
비트 번호 |
구성 |
구성 값 |
비트 15 |
DAC A |
0 |
비트 14 |
버퍼링되지 않음 |
0 |
비트 13 |
1x (V OUT * D / 4096) |
1 |
비트 12 |
출력 전원 차단 제어 비트 |
1 |
따라서 바이너리는 레지스터의 D11 ~ D0 비트에 의해 결정되는 데이터와 함께 0011입니다. 16 비트 데이터 0011 xxxx xxxx xxxx는 MSB의 처음 4 비트가 구성이고 나머지는 LSB 인 경우 제출해야합니다. 쓰기 명령 타이밍 다이어그램을 보면 더 명확해질 것입니다.
타이밍 다이어그램과 데이터 시트에 따르면 CS 핀은 MCP4921에 대한 전체 명령 쓰기 기간 동안 낮습니다.
이제 장치를 하드웨어와 인터페이스하고 코드를 작성할 때입니다.
필요한 구성 요소
이 프로젝트에는 다음 구성 요소가 필요합니다.
- MCP4921
- PIC16F877A
- 20MHz 크리스탈
- 디스플레이 16x2 문자 LCD.
- 2k 저항 -1 pc
- 33pF 커패시터-2 개
- 4.7k 저항-1 개
- 출력 전압을 측정하는 멀티 미터
- 브레드 보드
- 5V 전원 공급 장치, 전화 충전기가 작동 할 수 있습니다.
- 많은 훅업 와이어 또는 버그 와이어.
- 프로그래머 키트 및 IDE (컴파일러 포함)가있는 Microchip 프로그래밍 환경
개략도
DAC4921과 PIC 마이크로 컨트롤러 를 연결 하기위한 회로도 는 다음과 같습니다.
회로는 브레드 보드로 구성됩니다.
코드 설명
PIC16F877A 를 사용 하여 디지털 신호를 아날로그로 변환하는 완전한 코드 는 기사 끝에 제공됩니다. 항상 그렇듯이 먼저 PIC 마이크로 컨트롤러에서 구성 비트를 설정해야합니다.
// PIC16F877A 구성 비트 설정 // 'C'소스 라인 구성 문 // CONFIG #pragma config FOSC = HS // 오실레이터 선택 비트 (HS 오실레이터) #pragma config WDTE = OFF // 워치 독 타이머 활성화 비트 (WDT 비활성화) # pragma config PWRTE = OFF // 전원 켜기 타이머 활성화 비트 (PWRT 비활성화 됨) #pragma config BOREN = ON // 저전압 리셋 활성화 비트 (BOR 활성화 됨) #pragma config LVP = OFF // 저전압 (단일 공급) 인-서킷 직렬 프로그래밍 활성화 비트 (RB3 / PGM 핀에는 PGM 기능이 있음, 저전압 프로그래밍 활성화 됨) #pragma config CPD = OFF // 데이터 EEPROM 메모리 코드 보호 비트 (데이터 EEPROM 코드 보호 꺼짐) #pragma config WRT = OFF // 플래시 프로그램 메모리 쓰기 활성화 비트 (쓰기 방지 해제, 모든 프로그램 메모리는 EECON 제어에 의해 기록 될 수 있음) #pragma config CP = OFF // 플래시 프로그램 메모리 코드 보호 비트 (코드 보호 해제)
아래 코드 라인은 LCD 및 SPI 헤더 파일을 통합하는 데 사용되며 XTAL 주파수 및 DAC의 CS 핀 연결도 선언됩니다.
PIC SPI 튜토리얼 및 라이브러리는 주어진 링크에서 찾을 수 있습니다.
#포함
Funciton SPI_Initialize_Master () 약간 프로젝트에 필요한 다른 구성에 대해 수정된다. 이 경우 SSPSTAT 레지스터는 데이터 출력 시간이 끝날 때 샘플링 된 입력 데이터와 전송으로 구성된 SPI 클럭이 활성에서 유휴 클럭 상태 모드로 전환 될 때 발생하도록 구성됩니다. 기타는 동일합니다.
void SPI_Initialize_Master () { TRISC5 = 0; // 출력으로 설정 SSPSTAT = 0b11000000; // 74 / 234 페이지 SSPCON = 0b00100000; // 75 / 234 페이지 TRISC3 = 0; // 슬레이브 모드의 출력으로 설정 }
또한 아래 함수의 경우 SPI_Write () 가 약간 수정되었습니다. 데이터 전송은 SPI를 통한 완벽한 데이터 전송을 보장하기 위해 버퍼가 지워진 후에 발생합니다.
void SPI_Write (char incoming) { SSPBUF = incoming; // 사용자에게 주어진 데이터를 버퍼에 기록 while (! SSPSTATbits.BF); }
프로그램의 중요한 부분은 MCP4921 드라이버입니다. SPI를 통해 완전한 16 비트 데이터를 제공하기 위해 명령과 디지털 데이터가 함께 펀칭되므로 약간 까다로운 부분입니다. 그러나 그 논리는 코드 주석에 명확하게 표시됩니다.
/ * 디지털 값을 아날로그로 변환하는 기능입니다. * / void convert_DAC (unsigned int value) { / * Step Size = 2 ^ n, 따라서 12bit 2 ^ 12 = 4096 5V 기준의 경우 단계는 5/4095 = 0.0012210012210012V 또는 1mV (대략) * / unsigned int container; unsigned int MSB; unsigned int LSB; / * 단계: 1, 컨테이너에 12 비트 데이터 저장 데이터가 4095이고 이진수 1111 1111 1111 * / container = value; / * 단계: 2 더미 8 비트 만들기. 따라서 256을 나누면 상위 4 비트가 LSB LSB = 0000 1111 * / LSB = container / 256 에서 캡처됩니다 . / * 단계: 3 4 비트 데이터를 펀칭하여 구성을 보냅니다. LSB = 0011 0000 OR 0000 1111. 결과는 0011 1111 * / LSB = (0x30)-LSB; / * Step: 4 컨테이너는 여전히 21 비트 값을가집니다. 하위 8 비트 추출. 1111 1111 AND 1111 1111 1111. 결과는 MSB * / MSB = 0xFF & container 인 1111 1111입니다 . / * Step: 4 16 비트 데이터를 2 바이트로 나누어 전송합니다. * / DAC_CS = 0; // 데이터 전송 중 CS가 낮습니다. 데이터 시트에 따라 필요합니다. SPI_Write (LSB); SPI_Write (MSB); DAC_CS = 1; }
주요 기능에서는 1V, 2V, 3V, 4V, 5V의 출력을 생성하기위한 디지털 데이터가 생성되는 'for loop'가 사용됩니다. 디지털 값은 출력 전압 /0.0012210012210012 밀리 볼트에 대해 계산됩니다.
void main () { system_init (); 소개 _ 화면 (); int number = 0; int volt = 0; while (1) { for (volt = 1; volt <= MAX_VOLT; volt ++) { number = volt / 0.0012210012210012; clear_screen (); lcd_com (FIRST_LINE); lcd_puts ("전송 된 데이터:-"); lcd_print_number (숫자); lcd_com (SECOND_LINE); lcd_puts ("출력:-"); lcd_print_number (볼트); lcd_puts ("V"); convert_DAC (숫자); __delay_ms (300); } } }
PIC를 사용하여 디지털-아날로그 변환 테스트
구축 된 회로는 멀티 미터를 사용하여 테스트됩니다. 아래 이미지에서 출력 전압과 디지털 데이터가 LCD에 표시됩니다. 멀티 미터가 근접 측정 값을 보여줍니다.
작동하는 비디오 가 포함 된 전체 코드가 아래에 첨부되어 있습니다.