
MCP4922 é um conversor digital-analógico (DAC) de 12-bits da Microchip.
Características
- Tensão de operação: 2.7V até 5.5V;
- Comunicação via SPI;
- Resolução de 12-bits;
- 2 canais de saída;
- Ganho de saída (1x ou 2x);
Funcionamento
O MCP4922 converte um valor digital de 12 bits em um valor de tensão de 0V até VREF
. Ainda é possível ter um ganho de saída de 2 * VREF
. Cada canal possui um pino VREF
externo.
O pino SHDN
tem a finalidade de colocar ambos as saídas no modo shutdown. Também é possível configurá-los individualmente pelo registro de configuração. No modo shutdown a maioria dos circuitos internos são desligados e a saída é configurada para ter uma resistência de 500k.
O cálculo para a tensão de saída é: ((VREF * Valor) / 4096) * Ganho
.
Para definir o valor de um determinado canal:
- Definimos o pino
CS
com nível lógico baixo para habilitar a transmissão dos dados; - Enviamos 16 bits:
- O bit 15 seleciona o canal:
0
é o canal 0 e1
é o canal 1; - O bit 13 indica o ganho de saída:
0
= ganho de 2x e1
= não há ganho; - O bit 12 define se o canal selecionado será colocado no modo shutdown.
0
= modo shutdown e1
= modo normal; - Os bit 11-0 sãos os 12 bits que definem o valor de saída do canal selecionado.
- Definimos o pino
CS
com nível lógico alto para finalizar a transmissão dos dados;
Um projeto legal que poderíamos montar é um player de músicas no formato WAV (Mono ou Stereo) lidos de um SD Card.
Download
Código
/* | |
MCP4922 - Conversor Digital-Analógico de 12-bits e 2 canais. | |
Autor: Tiago Melo | |
Blog: Microcontrolandos | |
Compilador: MikroC PRO PIC | |
Bibliotecas: Soft_SPI | |
*/ | |
//Pinos do MCP4922. | |
sbit SoftSpi_SDI at RB2_bit; | |
sbit SoftSpi_SDO at RB2_bit; | |
sbit SoftSpi_CLK at RB0_bit; | |
sbit MCP4922_CS at RB1_bit; | |
sbit SoftSpi_SDI_Direction at TRISB2_bit; | |
sbit SoftSpi_SDO_Direction at TRISB2_bit; | |
sbit SoftSpi_CLK_Direction at TRISB0_bit; | |
sbit MCP4922_CS_Direction at TRISB1_bit; | |
void MCP4922_Init() { | |
MCP4922_CS_Direction = 0; | |
MCP4922_CS = 1; | |
} | |
void MCP4922_Write(char channel, unsigned value, char gain) { | |
((char*)&value)[1].B7 = channel; //A/B | |
((char*)&value)[1].B6 = 0; //BUF | |
((char*)&value)[1].B5 = !gain.B0; //GA | |
((char*)&value)[1].B4 = 1; //SHDN | |
//Habilita a transferencia de dados. | |
MCP4922_CS = 0; | |
//Enviamos primeiro o byte MSB. | |
Soft_SPI_Write(((char*)&value)[1]); | |
Soft_SPI_Write(((char*)&value)[0]); | |
//Desabilita a transferencia de dados. | |
MCP4922_CS = 1; | |
} | |
void main() { | |
unsigned valor = 0; | |
//Inicializa o MCP4922. | |
Soft_SPI_Init(); | |
MCP4922_Init(); | |
while(1) { | |
MCP4922_Write(0, valor, 0); //canal 0, sem ganho. | |
MCP4922_Write(1, valor, 1); //canal 1, com ganho. | |
//Incrementa o valor. | |
valor++; | |
//Máximo 12 bits. | |
valor &= 0xFFF; | |
//Faz nada por 100ms. | |
Delay_ms(100); | |
} | |
} |
Nenhum comentário