- MCP4921 DAC (convertidor digital a analógico)
- Componentes requeridos
- Esquemático
- Explicación del código
- Prueba de la conversión de digital a analógico mediante PIC
Digital y analógico es una parte integral de la electrónica. La mayoría de los dispositivos tienen tanto ADC como DAC y se utilizan cuando existe la necesidad de convertir señales de analógicas a digitales o de digitales a analógicas. Además, las señales del mundo real, como el sonido y la luz, son de naturaleza analógica, por lo que siempre que se deben utilizar estas señales del mundo real, las señales digitales deben convertirse a analógicas, por ejemplo, para producir sonido mediante altavoces o para controlar una fuente de luz.
Otro tipo de DAC es un modulador de ancho de pulso (PWM). Un PWM toma una palabra digital y genera un pulso digital con ancho de pulso variable. Cuando esta señal pasa a través de un filtro, el resultado será puramente analógico. Una señal analógica puede tener varios tipos de datos en una señal.
En este tutorial, conectaremos DAC MCP4921 con Microchip PIC16F877A para conversión de digital a analógico.
Aquí, en este tutorial, convertiremos la señal digital en una señal analógica y mostraremos el valor digital de entrada y el valor analógico de salida en una pantalla LCD de 16x2. Proporcionará 1V, 2V, 3V, 4V y 5V como la salida analógica final que se demuestra en el video que se muestra al final. Puede obtener más información sobre DAC en nuestro precioso tutorial de interfaz DAC con placas Raspberry Pi, Arduino y STM32.
DAC se puede utilizar en muchas aplicaciones, como control de motores, control de brillo de las luces LED, amplificador de audio, codificadores de video, sistemas de adquisición de datos, etc. Antes de saltar directamente a la parte de interfaz, es importante tener una descripción general sobre MCP4921.
MCP4921 DAC (convertidor digital a analógico)
MCP4921 es un DAC de 12 bits, por lo que MCP4921 proporcionará 12 bits de resolución de salida. La resolución DAC significa la cantidad de bits digitales que se pueden convertir en señal analógica. La cantidad de valores que podemos lograr con esto se basa en la fórmula. Para 12 bits, es = 4096. Esto significa que el DAC de resolución de 12 bits podría producir 4096 salidas diferentes.
Al usar este valor, se puede calcular fácilmente el voltaje de un solo paso analógico. Para calcular los pasos, se requiere el voltaje de referencia. Como el voltaje lógico para el dispositivo es 5V, el voltaje de paso es 5/4095 (4096-1 porque el punto de partida para digital no es 1, es 0), que es 0.00122100122 milivoltios. Entonces, un cambio de 1 bit cambiará la salida analógica con 0.00122100122.
Entonces, esa fue la parte de la conversión. El MCP4921 es un IC de 8 pines. El diagrama de pines y la descripción se pueden encontrar a continuación.
El IC MCP4921 se comunica con el microcontrolador mediante el protocolo SPI. Para la comunicación SPI, un dispositivo tiene que ser maestro, que envía datos o comandos al dispositivo externo conectado como esclavo. En el sistema de comunicación SPI, se pueden conectar varios dispositivos esclavos con un solo dispositivo maestro.
Para enviar los datos y el comando, es importante comprender el registro de comando.
En la imagen de abajo, se muestra el registro de comando,
El registro de comando es un registro de 16 bits. El bit-15 al bit-12 se utiliza para el comando de configuración. La entrada de datos y la configuración se muestran claramente en la imagen de arriba. En este proyecto, el MCP4921 se utilizará con la siguiente configuración:
Número de bits |
Configuración |
Valor de configuración |
Poco 15 |
DAC A |
0 |
Bit 14 |
Sin búfer |
0 |
Bit 13 |
1x (V SALIDA * D / 4096) |
1 |
Poco 12 |
Bit de control de potencia de salida |
1 |
Entonces, el binario es 0011 junto con los datos que están determinados por los bits D11 a D0 del registro. Los datos de 16 bits 0011 xxxx xxxx xxxx deben enviarse donde los primeros 4 bits de MSB son la configuración y el resto es LSB. Será más claro al ver el diagrama de tiempos del comando de escritura.
Según el diagrama de tiempo y la hoja de datos, el pin CS está bajo durante todo el período de escritura del comando en el MCP4921.
Ahora es el momento de conectar el dispositivo con el hardware y escribir los códigos.
Componentes requeridos
Para este proyecto, se requieren los siguientes componentes:
- MCP4921
- PIC16F877A
- Cristal de 20 MHz
- Una pantalla LCD de 16x2 caracteres.
- Resistencia 2k -1 pieza
- Condensadores 33pF - 2 piezas
- Resistencia de 4.7k - 1 pieza
- Un multímetro para medir la tensión de salida.
- Una placa de pruebas
- Fuente de alimentación de 5 V, un cargador de teléfono puede funcionar.
- Muchos cables de conexión o cables de té.
- Entorno de programación de microchip con kit de programador e IDE con compilador
Esquemático
El diagrama de circuito para la interfaz DAC4921 con el microcontrolador PIC se muestra a continuación:
El circuito está construido en Breadboard-
Explicación del código
El código completo para convertir señales digitales en analógicas con PIC16F877A se encuentra al final del artículo. Como siempre, primero necesitamos establecer los bits de configuración en el microcontrolador PIC.
// PIC16F877A Ajustes de bits de configuración // Declaraciones de configuración de la línea de origen 'C' // CONFIG # pragma config FOSC = HS // Bits de selección del oscilador (oscilador HS) # pragma config WDTE = OFF // Bit de habilitación del temporizador de vigilancia (WDT deshabilitado) # pragma config PWRTE = OFF // Bit de habilitación del temporizador de encendido (PWRT deshabilitado) #pragma config BOREN = ON // Bit de habilitación de restablecimiento de bajada (BOR habilitado) #pragma config LVP = OFF // Bajo voltaje (suministro único) Bit de habilitación de programación en serie en circuito (el pin RB3 / PGM tiene función PGM; programación de bajo voltaje habilitada) #pragma config CPD = OFF // Bit de protección de código de memoria EEPROM de datos (protección de código EEPROM de datos desactivada) #pragma config WRT = OFF // Bits de habilitación de escritura de memoria de programa flash (protección de escritura desactivada; el control EECON puede escribir en toda la memoria de programa) #pragma config CP = OFF // Bit de protección de código de memoria de programa flash (protección de código desactivada)
Las siguientes líneas de código se utilizan para integrar archivos de encabezado LCD y SPI, también se declara la frecuencia XTAL y la conexión del pin CS del DAC.
El tutorial y la biblioteca de PIC SPI se pueden encontrar en el enlace proporcionado.
#incluir
Funciton the SPI_Initialize_Master () está ligeramente modificado para una configuración diferente requerida para este proyecto. En este caso, el registro SSPSTAT se configura de tal manera que los datos de entrada muestreados al final del tiempo de salida de datos y también el reloj SPI configurado como Transmisión ocurre en la transición del modo de estado de reloj activo a inactivo. Otro es el mismo.
anular SPI_Initialize_Master () { TRISC5 = 0; // Establecer como salida SSPSTAT = 0b11000000; // pág. 74/234 SSPCON = 0b00100000; // pág. 75/234 TRISC3 = 0; // Establecer como salida para el modo esclavo }
Además, para la función siguiente, SPI_Write () se modifica ligeramente. La transmisión de datos se producirá después de que se borre el búfer para garantizar una transmisión de datos perfecta sobre SPI.
void SPI_Write (char entrante) { SSPBUF = entrante; // Escribe los datos proporcionados por el usuario en el búfer while (! SSPSTATbits.BF); }
La parte importante del programa es el controlador MCP4921. Es una parte un poco complicada ya que el comando y los datos digitales se combinan para proporcionar datos completos de 16 bits a través del SPI. Sin embargo, esa lógica se muestra claramente en los comentarios del código.
/ * Esta función sirve para convertir el valor digital en analógico. * / void convert_DAC (unsigned int value) { / * Step Size = 2 ^ n, Por lo tanto, 12bit 2 ^ 12 = 4096 Para una referencia de 5V, el paso será 5/4095 = 0.0012210012210012V o 1mV (aprox.) * / unsigned int container; MSB int sin firmar; unsigned int LSB; / * Paso: 1, almacenó los datos de 12 bits en el contenedor Supongamos que los datos son 4095, en binario 1111 1111 1111 * / contenedor = valor; / * Paso: 2 Creando Dummy de 8 bits. Entonces, al dividir 256, los 4 bits superiores se capturan en LSB LSB = 0000 1111 * / LSB = contenedor / 256; / * Paso: 3 Envío de la configuración perforando los datos de 4 bits. LSB = 0011 0000 O 0000 1111. El resultado es 0011 1111 * / LSB = (0x30) - LSB; / * Paso: 4 El contenedor todavía tiene el valor de 21 bits. Extrayendo los 8 bits inferiores. 1111 1111 AND 1111 1111 1111. El resultado es 1111 1111 que es MSB * / MSB = 0xFF & container; / * Paso: 4 Enviar los datos de 16 bits dividiéndolos en dos bytes. * / DAC_CS = 0; // CS es bajo durante la transmisión de datos. Según la hoja de datos se requiere SPI_Write (LSB); SPI_Write (MSB); DAC_CS = 1; }
En la función principal, se usa un 'bucle for' donde se crean los datos digitales para crear la salida de 1V, 2V, 3V, 4V y 5V. El valor digital se calcula contra el voltaje de salida / 0.0012210012210012 milivoltios.
void main () { system_init (); introducción_pantalla (); int número = 0; int volt = 0; while (1) { for (volt = 1; volt <= MAX_VOLT; volt ++) { número = volt / 0.0012210012210012; pantalla clara(); lcd_com (PRIMERA_LÍNEA); lcd_puts ("DATOS enviados: -"); lcd_print_number (número); lcd_com (SEGUNDA_LÍNEA); lcd_puts ("Salida: -"); lcd_print_number (voltios); lcd_puts ("V"); convert_DAC (número); __delay_ms (300); } } }
Prueba de la conversión de digital a analógico mediante PIC
El circuito construido se prueba con Multímetro. En las siguientes imágenes, el voltaje de salida y los datos digitales se muestran en la pantalla LCD. El multímetro muestra una lectura cercana.
El código completo con un video funcional se adjunta a continuación.