- MCP4921 DAC (conversor digital para analógico)
- Componentes necessários
- Esquemático
- Explicação do código
- Testando a conversão digital para analógico usando PIC
Digital e Analógico são parte integrante da Eletrônica. A maioria dos dispositivos tem ADC e DAC e são usados quando há necessidade de conversão de sinais analógicos para digitais ou digitais para analógicos. Além disso, os sinais do mundo real, como som e luz, são analógicos por natureza, portanto, sempre que esses sinais do mundo real devem ser usados, os sinais digitais devem ser convertidos para analógicos, por exemplo, para produzir som usando alto-falantes ou para controlar uma fonte de luz.
Outro tipo de DAC é um modulador de largura de pulso (PWM). Um PWM pega uma palavra digital e gera um pulso digital com largura de pulso variável. Quando esse sinal passa por um filtro, o resultado será puramente analógico. Um sinal analógico pode ter vários tipos de dados em um sinal.
Neste tutorial, faremos a interface do DAC MCP4921 com o Microchip PIC16F877A para conversão de digital para analógico.
Aqui neste tutorial, converteremos o sinal digital em um sinal analógico e exibiremos o valor digital de entrada e o valor analógico de saída no LCD 16x2. Ele fornecerá 1 V, 2 V, 3 V, 4 V e 5 V como a saída analógica final, que é demonstrado no vídeo fornecido no final. Você pode aprender mais sobre o DAC em nosso precioso tutorial de interface do DAC com placas Raspberry Pi, Arduino e STM32.
O DAC pode ser usado em muitas aplicações, como controle de motor, controle de brilho das luzes LED, amplificador de áudio, codificadores de vídeo, sistemas de aquisição de dados, etc. Antes de ir diretamente para a parte de interface, é importante ter uma visão geral sobre o MCP4921.
MCP4921 DAC (conversor digital para analógico)
MCP4921 é um DAC de 12 bits, então MCP4921 fornecerá 12 bits de resolução de saída. Resolução DAC significa número de bits digitais que podem ser convertidos em sinal analógico. Quantos valores podemos alcançar com isso se baseiam na fórmula. Para 12 bits, é = 4096. Isso significa que o DAC com resolução de 12 bits pode produzir 4096 saídas diferentes.
Usando este valor, pode-se calcular facilmente a tensão de etapa analógica única. Para calcular as etapas, a tensão de referência é necessária. Como a tensão lógica para o dispositivo é 5 V, a tensão do degrau é 5/4095 (4096-1 porque o ponto de partida para digital não é 1, é 0), que é 0,00122100122 milivolt. Portanto, uma mudança de 1 bit mudará a saída analógica com 0,00122100122.
Então, essa foi a parte da conversão. O MCP4921 é um IC de 8 pinos. O diagrama de pinos e a descrição podem ser encontrados abaixo.
O MCP4921 IC se comunica com o microcontrolador pelo protocolo SPI. Para comunicação SPI, um dispositivo deve ser mestre, que envia dados ou comando para o dispositivo externo conectado como escravo. No sistema de comunicação SPI, vários dispositivos escravos podem ser conectados a um único dispositivo mestre.
Para enviar os dados e o comando, é importante entender o registro do comando.
Na imagem abaixo, o registro do comando é mostrado,
O registro de comando é um registro de 16 bits. O bit-15 ao bit-12 é usado para o comando de configuração. A entrada de dados e a configuração são claramente mostradas na imagem acima. Neste projeto, o MCP4921 será usado como a seguinte configuração-
Número do bit |
Configuração |
Valor de Configuração |
Bit 15 |
DAC A |
0 |
Bit 14 |
Sem buffer |
0 |
Bit 13 |
1x (V OUT * D / 4096) |
1 |
Bit 12 |
Bit de controle de desligamento de saída |
1 |
Portanto, o binário é 0011 junto com os dados que são determinados pelos bits D11 a D0 do registrador. Os dados de 16 bits 0011 xxxx xxxx xxxx precisam ser enviados, onde os primeiros 4 bits do MSB são a configuração e o resto é o LSB. Será mais claro ao ver o diagrama de tempo do comando de gravação.
De acordo com o diagrama de tempo e a folha de dados, o pino CS está baixo durante todo o período de gravação do comando para o MCP4921.
Agora é a hora de fazer a interface do dispositivo com o hardware e escrever os códigos.
Componentes necessários
Para este projeto, os seguintes componentes são necessários-
- MCP4921
- PIC16F877A
- 20 MHz de cristal
- A Exibir LCD de 16x2 caracteres.
- 2k resistor -1 pc
- Capacitores 33pF - 2 pcs
- Resistor de 4,7k - 1 pc
- Um multímetro para medir a tensão de saída
- Uma placa de ensaio
- Fonte de alimentação 5V, um carregador de telefone pode funcionar.
- Muitos fios de conexão ou fios de berg.
- Ambiente de programação Microchip com kit de programador e IDE com compilador
Esquemático
O diagrama de circuito para a interface do DAC4921 com o microcontrolador PIC é fornecido abaixo:
O circuito é construído em breadboard-
Explicação do código
O código completo para converter sinais digitais em analógicos com PIC16F877A é fornecido no final do artigo. Como sempre, primeiro precisamos definir os bits de configuração no microcontrolador PIC.
// Configurações de bits de configuração PIC16F877A // instruções de configuração da linha de origem 'C' // CONFIG #pragma config FOSC = HS // Bits de seleção do oscilador (oscilador HS) #pragma config WDTE = OFF // Bit de habilitação do temporizador de watchdog (WDT desativado) # pragma config PWRTE = OFF // Bit de habilitação do temporizador de inicialização (PWRT desabilitado) #pragma config BOREN = ON // Bit de habilitação de redefinição de Brown-out (BOR habilitado) #pragma config LVP = OFF // Low-Voltage (Single-Supply) Bit de habilitação de programação serial em circuito (o pino RB3 / PGM tem função PGM; programação de baixa tensão habilitada) #pragma config CPD = OFF // Bit de proteção de código de memória EEPROM de dados (proteção de código EEPROM de dados desativada) #pragma config WRT = OFF // Bits de habilitação de gravação de memória de programa Flash (proteção contra gravação desligada; toda a memória de programa pode ser gravada pelo controle EECON) #pragma config CP = OFF // Bit de proteção de código de memória de programa Flash (proteção de código desligada)
As linhas de código abaixo são usadas para integrar arquivos de cabeçalho de LCD e SPI, também a frequência XTAL e a conexão de pino CS do DAC é declarada.
O tutorial e a biblioteca do PIC SPI podem ser encontrados no link fornecido.
#incluir
A função SPI_Initialize_Master () é ligeiramente modificada para uma configuração diferente necessária para este projeto. Neste caso, o registro SSPSTAT é configurado de forma que os dados de entrada amostrados no final do tempo de saída dos dados e também o relógio SPI configurado como Transmissão ocorram na transição do modo de estado de relógio ativo para ocioso. O outro é igual.
void SPI_Initialize_Master () { TRISC5 = 0; // Definir como saída SSPSTAT = 0b11000000; // página 74/234 SSPCON = 0b00100000; // página 75/234 TRISC3 = 0; // Definir como saída para o modo escravo }
Além disso, para a função abaixo, o SPI_Write () é ligeiramente modificado. A transmissão de dados ocorrerá depois que o buffer for limpo para garantir uma transmissão de dados perfeita por SPI.
void SPI_Write (char entrando) { SSPBUF = entrando; // Grava os dados fornecidos pelo usuário no buffer while (! SSPSTATbits.BF); }
A parte importante do programa é o driver MCP4921. É uma parte um pouco complicada, pois o comando e os dados digitais são combinados para fornecer dados completos de 16 bits no SPI. No entanto, essa lógica é mostrada claramente nos comentários do código.
/ * Esta função é para converter o valor digital em analógico. * / void convert_DAC (valor int sem sinal) { / * Tamanho da etapa = 2 ^ n, portanto, 12 bits 2 ^ 12 = 4096 Para referência de 5V, a etapa será 5/4095 = 0,0012210012210012V ou 1mV (aproximadamente) * / contêiner interno sem sinal; unsigned int MSB; unsigned int LSB; / * Etapa: 1, armazenou os dados de 12 bits no contêiner Suponha que os dados sejam 4095, em binário 1111 1111 1111 * / contêiner = valor; / * Etapa: 2 Criando Dummy de 8 bits. Assim, ao dividir 256, os 4 bits superiores são capturados em LSB LSB = 0000 1111 * / LSB = container / 256; / * Etapa: 3 Envio da configuração com punção dos dados de 4 bits. LSB = 0011 0000 OU 0000 1111. O resultado é 0011 1111 * / LSB = (0x30) - LSB; / * Etapa: 4 O contêiner ainda tem o valor de 21 bits. Extraindo os 8 bits inferiores. 1111 1111 AND 1111 1111 1111. O resultado é 1111 1111 que é MSB * / MSB = 0xFF & container; / * Etapa: 4 Enviando os dados de 16 bits dividindo-os em dois bytes. * / DAC_CS = 0; // CS está baixo durante a transmissão de dados. Conforme a folha de dados, é necessário SPI_Write (LSB); SPI_Write (MSB); DAC_CS = 1; }
Na função principal, um 'for loop' é usado onde os dados digitais para criar a saída de 1 V, 2 V, 3 V, 4 V e 5 V são criados. O valor digital é calculado em relação à tensão de saída / 0,0012210012210012 milivolt.
void main () { system_init (); Introduction_screen (); número int = 0; int volt = 0; enquanto (1) { para (volt = 1; volt <= MAX_VOLT; volt ++) { número = volt / 0,0012210012210012; limpar tela(); lcd_com (FIRST_LINE); lcd_puts ("DADOS enviados: -"); lcd_print_number (número); lcd_com (SECOND_LINE); lcd_puts ("Saída: -"); lcd_print_number (volt); lcd_puts ("V"); convert_DAC (número); __delay_ms (300); } } }
Testando a conversão digital para analógico usando PIC
O circuito construído é testado usando um multímetro. Nas imagens abaixo, a tensão de saída e os dados digitais são mostrados no LCD. O multímetro está mostrando uma leitura próxima.
O código completo com um vídeo de trabalho está anexado abaixo.