- MCP4921 DAC (Digital-Analog-Wandler)
- Erforderliche Komponenten
- Schema
- Code Erklärung
- Testen der Digital-Analog-Wandlung mit PIC
Digital und Analog ist ein wesentlicher Bestandteil der Elektronik. Die meisten Geräte verfügen sowohl über ADC als auch über DAC und werden verwendet, wenn Signale entweder von analog zu digital oder von digital zu analog konvertiert werden müssen. Auch die realen Signale wie Ton und Licht sind analoger Natur. Wenn diese realen Signale verwendet werden müssen, müssen die digitalen Signale in analoge Signale umgewandelt werden, um beispielsweise Ton mit Lautsprechern zu erzeugen oder eine Lichtquelle zu steuern.
Eine andere Art von DAC ist ein Pulsweitenmodulator (PWM). Eine PWM nimmt ein digitales Wort und erzeugt einen digitalen Impuls mit variabler Impulsbreite. Wenn dieses Signal durch einen Filter geleitet wird, ist das Ergebnis rein analog. Ein analoges Signal kann mehrere Datentypen in einem Signal enthalten.
In diesem Tutorial werden wir den DAC MCP4921 mit dem Microchip PIC16F877A für die Digital-Analog-Wandlung verbinden.
Hier in diesem Tutorial werden wir das digitale Signal in ein analoges Signal umwandeln und den digitalen Eingangswert und den analogen Ausgangswert auf einem 16x2-LCD anzeigen. Es liefert 1 V, 2 V, 3 V, 4 V und 5 V als endgültigen Analogausgang, der in dem am Ende angegebenen Video gezeigt wird. Weitere Informationen zu DAC finden Sie in unserem wertvollen Tutorial zur DAC-Schnittstelle mit Raspberry Pi, Arduino und STM32-Karten.
DAC kann in vielen Anwendungen verwendet werden, z. B. Motorsteuerung, Steuerhelligkeit der LED-Leuchten, Audioverstärker, Videocodierer, Datenerfassungssysteme usw. Bevor Sie direkt zum Schnittstellenteil springen, ist es wichtig, einen Überblick über MCP4921 zu haben.
MCP4921 DAC (Digital-Analog-Wandler)
MCP4921 ist ein 12-Bit-DAC, daher bietet MCP4921 eine Ausgangsauflösung von 12 Bit. DAC-Auflösung bedeutet die Anzahl der digitalen Bits, die in ein analoges Signal umgewandelt werden können. Wie viele Werte wir damit erreichen können, hängt von der Formel ab. Für 12-Bit ist dies = 4096. Dies bedeutet, dass der DAC mit 12-Bit-Auflösung 4096 verschiedene Ausgänge erzeugen kann.
Mit diesem Wert kann man leicht die einzelne analoge Stufenspannung berechnen. Zur Berechnung der Schritte wird die Referenzspannung benötigt. Da die logische Spannung für das Gerät 5 V beträgt, beträgt die Stufenspannung 5/4095 (4096-1, da der Startpunkt für digital nicht 1 ist, sondern 0), was 0,00122100122 Millivolt beträgt. Eine Änderung von 1 Bit ändert also den Analogausgang mit 0,00122100122.
Das war also der Konvertierungsteil. Der MCP4921 ist ein 8-poliger IC. Das Pin-Diagramm und die Beschreibung finden Sie unten.
Der MCP4921-IC kommuniziert über das SPI-Protokoll mit dem Mikrocontroller. Für die SPI-Kommunikation muss ein Gerät ein Master sein, der Daten oder Befehle an das als Slave angeschlossene externe Gerät sendet. Im SPI-Kommunikationssystem können mehrere Slave-Geräte mit dem einzelnen Master-Gerät verbunden werden.
Um die Daten und den Befehl zu senden, ist es wichtig, das Befehlsregister zu verstehen.
In der folgenden Abbildung ist das Befehlsregister dargestellt.
Das Befehlsregister ist ein 16-Bit-Register. Das Bit-15 bis Bit-12 wird für den Konfigurationsbefehl verwendet. Die Dateneingabe und die Konfiguration sind im obigen Bild deutlich dargestellt. In diesem Projekt wird der MCP4921 als folgende Konfiguration verwendet:
Bitnummer |
Aufbau |
Konfigurationswert |
Bit 15 |
DAC A. |
0 |
Bit 14 |
Ungepuffert |
0 |
Bit 13 |
1x (V OUT * D / 4096) |
1 |
Bit 12 |
Ausgangs-Ausschaltsteuerbit |
1 |
Die Binärdatei ist also 0011 zusammen mit den Daten, die durch die Bits D11 bis D0 des Registers bestimmt werden. Die 16-Bit-Daten 0011 xxxx xxxx xxxx müssen gesendet werden, wobei die ersten 4 Bit des MSB die Konfiguration und der Rest das LSB sind. Dies wird durch das Zeitdiagramm des Schreibbefehls klarer.
Gemäß dem Zeitdiagramm und dem Datenblatt ist der CS-Pin für die gesamte Befehlsschreibperiode zum MCP4921 niedrig.
Jetzt ist es an der Zeit, das Gerät mit der Hardware zu verbinden und die Codes zu schreiben.
Erforderliche Komponenten
Für dieses Projekt sind folgende Komponenten erforderlich:
- MCP4921
- PIC16F877A
- 20 MHz Kristall
- Ein LCD mit 16 x 2 Zeichen.
- 2k Widerstand -1 Stck
- 33pF Kondensatoren - 2 Stk
- 4,7k Widerstand - 1 Stck
- Ein Multimeter zur Messung der Ausgangsspannung
- Ein Steckbrett
- 5V Stromversorgung, Ein Telefonladegerät kann funktionieren.
- Viele Anschlussdrähte oder Bergdrähte.
- Mikrochip-Programmierumgebung mit Programmer-Kit und IDE mit Compiler
Schema
Das Schaltbild für die Verbindung von DAC4921 mit dem PIC-Mikrocontroller ist unten angegeben:
Die Schaltung ist in Breadboard- aufgebaut.
Code Erklärung
Der vollständige Code für die Umwandlung digitaler Signale in analoge Signale mit PIC16F877A ist am Ende des Artikels angegeben. Wie immer müssen wir zuerst die Konfigurationsbits im PIC-Mikrocontroller setzen.
// PIC16F877A Konfigurationsbit-Einstellungen // ' C'- Quellzeilen-Konfigurationsanweisungen // CONFIG #pragma config FOSC = HS // Oszillatorauswahlbits (HS-Oszillator) #pragma config WDTE = OFF // Watchdog-Timer Aktivierungsbit (WDT deaktiviert) # Pragma-Konfiguration PWRTE = AUS // Einschalt-Timer-Aktivierungsbit (PWRT deaktiviert) # Pragma-Konfiguration BOREN = EIN // Brown-Out-Reset-Aktivierungsbit (BOR aktiviert) # Pragma-Konfiguration LVP = AUS // Niederspannung (Einzelversorgung)) Aktivierungsbit für serielle In-Circuit-Programmierung (RB3 / PGM-Pin hat PGM-Funktion; Niederspannungsprogrammierung aktiviert) #pragma config CPD = OFF // Daten-EEPROM-Speichercode-Schutzbit (Daten-EEPROM-Code-Schutz aus) #pragma config WRT = OFF // Schreibprogramm-Aktivierungsbits für Flash-Programmspeicher (Schreibschutz aus; der gesamte Programmspeicher kann von der EECON-Steuerung beschrieben werden) #pragma config CP = OFF // Code-Schutzbit für Flash-Programmspeicher (Codeschutz aus)
Die folgenden Codezeilen werden zum Integrieren von LCD- und SPI-Header-Dateien verwendet. Außerdem wird die XTAL-Frequenz und die CS-Pin-Verbindung des DAC deklariert.
Das PIC SPI-Tutorial und die Bibliothek finden Sie unter dem angegebenen Link.
#einschließen
Funktion SPI_Initialize_Master () wurde geringfügig für eine andere Konfiguration geändert, die für dieses Projekt erforderlich ist. In diesem Fall ist das SSPSTAT-Register so konfiguriert, dass die am Ende der Datenausgabezeit abgetasteten Eingangsdaten und auch der als Senden konfigurierte SPI-Takt beim Übergang vom aktiven in den Leerlauf-Taktmodus auftreten. Andere ist das gleiche.
void SPI_Initialize_Master () { TRISC5 = 0; // Als Ausgabe setzen SSPSTAT = 0b11000000; // S. 74/234 SSPCON = 0b00100000; // S. 75/234 TRISC3 = 0; // Als Ausgang für Slave-Modus festlegen }
Für die folgende Funktion wird SPI_Write () geringfügig geändert. Die Datenübertragung erfolgt nach dem Löschen des Puffers, um eine perfekte Datenübertragung über SPI sicherzustellen.
void SPI_Write (Zeichen eingehend) { SSPBUF = eingehend; // Schreibe die vom Benutzer angegebenen Daten in den Puffer while (! SSPSTATbits.BF); }}
Der wichtige Teil des Programms ist der MCP4921-Treiber. Dies ist ein etwas kniffliger Teil, da der Befehl und die digitalen Daten zusammengestanzt werden, um vollständige 16-Bit-Daten über das SPI bereitzustellen. Diese Logik wird jedoch in den Codekommentaren deutlich gezeigt.
/ * Diese Funktion dient zur Umwandlung des digitalen Wertes in den analogen. * / void convert_DAC (vorzeichenloser int-Wert) { / * Schrittgröße = 2 ^ n, daher 12 Bit 2 ^ 12 = 4096 Für 5-V-Referenz ist der Schritt 5/4095 = 0,0012210012210012V oder 1 mV (ungefähr) * / vorzeichenloser int-Container;; unsigned int MSB; unsigned int LSB; / * Schritt: 1, die 12-Bit-Daten im Container gespeichert Angenommen, die Daten sind 4095, binär 1111 1111 1111 * / container = value; / * Schritt: 2 Erstellen von Dummy 8 Bit. Durch Teilen von 256 werden also die oberen 4 Bits in LSB LSB = 0000 1111 * / LSB = Container / 256 erfasst . / * Schritt: 3 Senden der Konfiguration durch Stanzen der 4-Bit-Daten. LSB = 0011 0000 ODER 0000 1111. Ergebnis ist 0011 1111 * / LSB = (0x30) - LSB; / * Schritt: 4 Der Container hat noch den 21-Bit-Wert. Extrahieren der unteren 8 Bits. 1111 1111 UND 1111 1111 1111. Ergebnis ist 1111 1111, was MSB * / MSB = 0xFF & container; / * Schritt: 4 Senden der 16-Bit-Daten durch Teilen in zwei Bytes. * / DAC_CS = 0; // CS ist während der Datenübertragung niedrig. Gemäß Datenblatt ist SPI_Write (LSB) erforderlich ; SPI_Write (MSB); DAC_CS = 1; }}
In der Hauptfunktion wird eine 'for-Schleife' verwendet, in der die digitalen Daten zum Erzeugen des Ausgangs von 1 V, 2 V, 3 V, 4 V und 5 V erzeugt werden. Der digitale Wert wird gegen die Ausgangsspannung / 0,0012210012210012 Millivolt berechnet.
void main () { system_init (); Introduction_Screen (); int number = 0; int Volt = 0; während (1) { für (Volt = 1; Volt <= MAX_VOLT; Volt ++) { Anzahl = Volt / 0,0012210012210012; clear_screen (); lcd_com (FIRST_LINE); lcd_puts ("DATA Sent: -"); lcd_print_number (Nummer); lcd_com (SECOND_LINE); lcd_puts ("Ausgabe: -"); lcd_print_number (Volt); lcd_puts ("V"); convert_DAC (Nummer); __delay_ms (300); } } }
Testen der Digital-Analog-Wandlung mit PIC
Die gebaute Schaltung wird mit einem Multimeter getestet. In den folgenden Bildern werden die Ausgangsspannung und die digitalen Daten auf dem LCD angezeigt. Das Multimeter zeigt einen genauen Messwert an.
Der vollständige Code mit einem funktionierenden Video ist unten beigefügt.