- Componentes requeridos
- Módulo DAC MCP4725 (convertidor digital a analógico)
- Comunicación I2C en MCP4725
- Diagrama de circuito y explicación
- Programación de STM32F103C8 para conversión digital a analógica
- Probando el DAC con STM32
Todos sabemos que los microcontroladores funcionan solo con valores digitales pero en el mundo real tenemos que lidiar con señales analógicas. Es por eso que ADC (convertidores analógicos a digitales) está ahí para convertir valores analógicos del mundo real en formato digital para que los microcontroladores puedan procesar las señales. Pero, ¿qué pasa si necesitamos señales analógicas de valores digitales, entonces aquí viene el DAC (convertidor digital a analógico)?
Un ejemplo simple de convertidor de digital a analógico es grabar una canción en un estudio donde un artista cantante está usando un micrófono y cantando una canción. Estas ondas de sonido analógicas se convierten en formato digital y luego se almacenan en un archivo de formato digital y cuando la canción se reproduce utilizando el archivo digital almacenado, esos valores digitales se convierten en señales analógicas para la salida del altavoz. Entonces en este sistema se usa DAC.
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.
Ya hemos interconectado el módulo DAC MCP4725 con Arduino. Hoy usaremos el mismo MCP4725 DAC IC para diseñar un convertidor de digital a analógico usando el microcontrolador STM32F103C8.
Componentes requeridos
- STM32F103C8
- MCP4725 DAC IC
- Potenciómetro 10k
- Pantalla LCD 16x2
- Tablero de circuitos
- Conexión de cables
Módulo DAC MCP4725 (convertidor digital a analógico)
MCP4725 IC es un módulo convertidor de digital a analógico de 12 bits que se utiliza para generar voltajes analógicos de salida de (0 a 5 V) y se controla mediante comunicación I2C. También viene con memoria EEPROM no volátil incorporada.
Este IC tiene una resolución de 12 bits. Esto significa que usamos (0 a 4096) como entrada para proporcionar la salida de voltaje con respecto al voltaje de referencia. El voltaje de referencia máximo es de 5 V.
Fórmula para calcular el voltaje de salida
Voltaje O / P = (Voltaje / Resolución de referencia) x Valor digital
Por ejemplo, si usamos 5V como voltaje de referencia y supongamos que el valor digital es 2048. Entonces, para calcular la salida DAC.
Voltaje O / P = (5/4096) x 2048 = 2.5V
Pinout de MCP4725A continuación se muestra la imagen de MCP4725 con los nombres de los pines que indican claramente.
Pines de MCP4725 |
Utilizar |
AFUERA |
Salidas de voltaje analógico |
GND |
GND para salida |
SCL |
Línea de reloj serial I2C |
SDA |
Línea de datos en serie I2C |
VCC |
Voltaje de referencia de entrada 5 V o 3,3 V |
GND |
GND para entrada |
Comunicación I2C en MCP4725
Este DAC IC se puede interconectar con cualquier microcontrolador que utilice la comunicación I2C. La comunicación I2C requiere solo dos cables SCL y SDA. De forma predeterminada, la dirección I2C para MCP4725 es 0x60. Siga el enlace para saber más sobre la comunicación I2C en STM32F103C8.
Pines I2C en STM32F103C8:
SDA: PB7 o PB9, PB11.
SCL: PB6 o PB8, PB10.
Diagrama de circuito y explicación
Conexiones entre STM32F103C8 y LCD 16x2
Pin LCD No |
Nombre del pin LCD |
Nombre de pin STM32 |
1 |
Tierra (Gnd) |
Tierra (G) |
2 |
VCC |
5V |
3 |
VEE |
Pin del centro del potenciómetro para contraste |
4 |
Registro Seleccionar (RS) |
PB11 |
5 |
Lectura / escritura (RW) |
Tierra (G) |
6 |
Habilitar (EN) |
PB10 |
7 |
Bit de datos 0 (DB0) |
Sin conexión (NC) |
8 |
Bit de datos 1 (DB1) |
Sin conexión (NC) |
9 |
Bit de datos 2 (DB2) |
Sin conexión (NC) |
10 |
Bit de datos 3 (DB3) |
Sin conexión (NC) |
11 |
Bit de datos 4 (DB4) |
PB0 |
12 |
Bit de datos 5 (DB5) |
PB1 |
13 |
Bit de datos 6 (DB6) |
PC13 |
14 |
Bit de datos 7 (DB7) |
PC14 |
15 |
LED positivo |
5V |
dieciséis |
LED negativo |
Tierra (G) |
Conexión entre MCP4725 DAC IC y STM32F103C8
MCP4725 |
STM32F103C8 |
Multímetro |
SDA |
PB7 |
CAROLINA DEL NORTE |
SCL |
PB6 |
CAROLINA DEL NORTE |
AFUERA |
PA1 |
Sonda positiva |
GND |
GND |
Sonda negativa |
VCC |
3,3 V |
CAROLINA DEL NORTE |
También se conecta un potenciómetro, con el pin central conectado a la entrada analógica PA1 (ADC) de STM32F10C8, el pin izquierdo conectado a GND y el pin más derecho conectado a 3.3V de STM32F103C8.
En este tutorial, conectaremos un DAC IC MCP4725 con STM32 y usaremos un potenciómetro de 10k para proporcionar un valor de entrada analógica al pin PA0 de STM32 ADC. Y luego use ADC para convertir el valor analógico en forma digital. Después de eso, envíe esos valores digitales a MCP4725 a través del bus I2C. Luego convierta esos valores digitales a analógicos usando el DAC MCP4725 IC y luego use otro pin ADC PA1 de STM32 para verificar la salida analógica de MCP4725 desde el pin OUT. Finalmente, muestre los valores de ADC y DAC con voltajes en la pantalla LCD de 16x2.
Programación de STM32F103C8 para conversión digital a analógica
Ahora no se necesita un programador FTDI para cargar el código en STM32F103C8. Simplemente conéctelo a la PC a través del puerto USB de STM32 y comience a programar con ARDUINO IDE. Visite este enlace para obtener más información sobre cómo programar su STM32 en Arduino IDE. El programa completo para este tutorial de STM32 DAC se proporciona al final.
En primer lugar incluir biblioteca para I2C y LCD mediante wire.h, SoftWire.h y liquidcrystal.h biblioteca. Obtenga más información sobre I2C en el microcontrolador STM32 aquí.
#incluir
A continuación, defina e inicialice los pines del LCD de acuerdo con los pines del LCD conectados con el STM32F103C8
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; LiquidCrystal lcd (rs, en, d4, d5, d6, d7);
Luego defina la dirección I2C del DAC IC MCP4725. La dirección I2C predeterminada del MCP4725 DAC es 0x60
#define MCP4725 0x60
En la configuración del vacío ()
Primero comience la comunicación I2C en los pines PB7 (SDA) y PB6 (SCL) de STM32F103C8.
Wire.begin (); // Inicia la comunicación I2C
A continuación, configure la pantalla LCD en el modo 16x2 y muestre un mensaje de bienvenida.
lcd.begin (16,2); lcd.print ("RESUMEN DEL CIRCUITO"); retraso (1000); lcd.clear (); lcd.setCursor (0,0); lcd.print ("STM32F103C8"); lcd.setCursor (0,1); lcd.print ("DAC con MCP4725"); retraso (2000); lcd.clear ();
En el bucle vacío ()
1. Primero en el búfer, coloque el valor del byte de control (0b01000000).
(010-Establece MCP4725 en modo de escritura) buffer = 0b01000000;
2. La siguiente declaración lee el valor analógico del pin PA0 y lo convierte en un valor digital que va de 0 a 4096 ya que ADC tiene una resolución de 12 bits y se almacena en la variable adc .
adc = analogRead (PA0);
3. La siguiente afirmación es una fórmula que se utiliza para calcular el voltaje del valor de entrada del ADC (0 a 4096) con el voltaje de referencia de 3.3V.
ipvolt flotante = (3.3 / 4096.0) * adc;
4. Coloque los valores de bit más significativos en el búfer desplazando 4 bits hacia la derecha en la variable ADC y los valores de bit menos significativos en el búfer desplazando 4 bits hacia la izquierda en la variable adc .
buffer = adc >> 4; buffer = adc << 4;
5. La siguiente declaración lee el valor analógico del pin ADC PA1 de STM32 que es la salida DAC (pin OUTPUT del MCP4725 DAC IC). Este pin también se puede conectar al multímetro para verificar el voltaje de salida.
unsigned int analogread = analogRead (PA1);
6. Además, el valor de voltaje de la lectura analógica variable se calcula utilizando la fórmula con la siguiente declaración.
flotador opvolt = (3.3 / 4096.0) * lectura analógica;
7. En el mismo bucle vacío () hay algunas otras declaraciones que se explican a continuación
Comienza la transmisión con MCP4725:
Wire.beginTransmission (MCP4725);
Envía el byte de control a I2C
Wire.write (búfer);
Envía el MSB a I2C
Wire.write (búfer);
Envía el LSB a I2C
Wire.write (búfer);
Finaliza la transmisión
Wire.endTransmission ();
Ahora muestre esos resultados en la pantalla LCD 16x2 usando lcd.print ()
lcd.setCursor (0,0); lcd.print ("Una IP:"); lcd.print (adc); lcd.setCursor (10,0); lcd.print ("V:"); lcd.print (ipvoltio); lcd.setCursor (0,1); lcd.print ("D OP:"); lcd.print (lectura analógica); lcd.setCursor (10,1); lcd.print ("V:"); lcd.print (opvolt); retraso (500); lcd.clear ();
Probando el DAC con STM32
Cuando variamos el valor y el voltaje del ADC de entrada girando el potenciómetro, el valor y el voltaje del DAC de salida también cambian. Aquí los valores de entrada se muestran en la primera fila y los valores de salida en la segunda fila de la pantalla LCD. También se conecta un multímetro al pin de salida del MCP4725 para verificar el voltaje analógico.
A continuación se proporciona el código completo con el video de demostración.