- MCP4921 DAC (digitaal naar analoog converter)
- Componenten vereist
- Schematisch
- Code Uitleg
- Testen van de digitaal naar analoog conversie met behulp van PIC
Digitaal en analoog is een integraal onderdeel van elektronica. De meeste apparaten hebben zowel ADC als DAC en worden gebruikt wanneer er signalen moeten worden geconverteerd van analoog naar digitaal of van digitaal naar analoog. Ook de signalen uit de echte wereld, zoals geluid en licht, zijn analoog van aard, dus wanneer deze signalen uit de echte wereld moeten worden gebruikt, moeten de digitale signalen worden omgezet naar analoog, bijvoorbeeld om geluid te produceren met luidsprekers of om een lichtbron te besturen.
Een ander type DAC is een Pulse Width Modulator (PWM). Een PWM neemt een digitaal woord en genereert een digitale puls met variabele pulsbreedte. Wanneer dit signaal door een filter wordt geleid, is het resultaat puur analoog. Een analoog signaal kan meerdere soorten gegevens in een signaal hebben.
In deze tutorial zullen we de DAC MCP4921 koppelen aan Microchip PIC16F877A voor digitaal naar analoog conversie.
Hier in deze tutorial zullen we het digitale signaal omzetten in een analoog signaal en de digitale ingangswaarde en de analoge uitgangswaarde weergeven op een 16x2 LCD. Het levert 1V, 2V, 3V, 4V en 5V als de uiteindelijke analoge uitvoer, wat wordt gedemonstreerd in de video aan het einde. U kunt meer over DAC leren in onze kostbare tutorial over DAC-interface met Raspberry Pi-, Arduino- en STM32-kaarten.
DAC kan in vele toepassingen worden gebruikt, zoals motorbesturing, helderheid van de LED-verlichting regelen, audioversterker, video-encoders, data-acquisitiesystemen enz. Voordat u direct naar het interface-gedeelte springt, is het belangrijk om een overzicht te hebben over MCP4921.
MCP4921 DAC (digitaal naar analoog converter)
MCP4921 is een 12 bits DAC, dus MCP4921 levert 12 bits uitvoerresolutie. DAC-resolutie betekent het aantal digitale bits dat kan worden omgezet in een analoog signaal. Hoeveel waarden we hieruit kunnen halen, is gebaseerd op de formule. Voor 12-bits is dit = 4096. Dit betekent dat een DAC met een resolutie van 12 bits 4096 verschillende uitgangen kan produceren.
Door deze waarde te gebruiken, kan men eenvoudig de enkele analoge stapspanning berekenen. Voor het berekenen van de stappen is de referentiespanning vereist. Omdat de logische spanning voor het apparaat 5V is, is de stapspanning 5/4095 (4096-1 omdat het startpunt voor digitaal niet 1 is, maar 0), wat 0,00122100122 millivolt is. Dus een verandering van 1 bit zal de analoge output veranderen met 0.00122100122.
Dus dat was het conversiegedeelte. De MCP4921 is een 8-pins IC. Het pin-diagram en de beschrijving vindt u hieronder.
De MCP4921 IC communiceert met de microcontroller via het SPI-protocol. Voor SPI-communicatie moet een apparaat master zijn, dat gegevens of opdrachten naar het externe apparaat verzendt dat als slaaf is aangesloten. In het SPI-communicatiesysteem kunnen meerdere slave-apparaten worden aangesloten op het enkele master-apparaat.
Om de gegevens en het commando in te dienen, is het belangrijk het commandoregister te begrijpen.
In de onderstaande afbeelding wordt het commandoregister getoond,
Het commandoregister is een 16-bits register. De bit-15 tot bit-12 wordt gebruikt voor het configuratiecommando. De gegevensinvoer en de configuratie wordt duidelijk weergegeven in de bovenstaande afbeelding. In dit project zal de MCP4921 worden gebruikt als de volgende configuratie-
Bit nummer |
Configuratie |
Configuratiewaarde |
Bit 15 |
DAC A |
0 |
Bit 14 |
Niet gebufferd |
0 |
Bit 13 |
1x (V UIT * D / 4096) |
1 |
Bit 12 |
Uitgangsvermogen besturingsbit |
1 |
Dus het binaire is 0011 samen met de gegevens die worden bepaald door de D11 tot D0 bits van het register. De 16-bits gegevens 0011 xxxx xxxx xxxx moeten worden ingediend, waarbij de eerste 4 bit van MSB de configuratie is en de rest de LSB. Het wordt duidelijker door het timingdiagram van de schrijfopdracht te zien.
Volgens het timingdiagram en het gegevensblad is de CS-pin laag gedurende de hele opdrachtschrijfperiode naar de MCP4921.
Nu is het tijd om het apparaat met de hardware te verbinden en de codes te schrijven.
Componenten vereist
Voor dit project zijn de volgende componenten vereist:
- MCP4921
- PIC16F877A
- 20 MHz kristal
- Een LCD-scherm van 16x2 tekens.
- 2k weerstand -1 st
- 33pF condensatoren - 2 st
- 4.7k weerstand - 1 st
- Een multimeter om de uitgangsspanning te meten
- Een breadboard
- 5V voeding, een telefoonoplader kan werken.
- Veel aansluitdraden of bergdraden.
- Microchip programmeeromgeving met Programmer kit en IDE met compiler
Schematisch
Het schakelschema voor het koppelen van de DAC4921 met de PIC-microcontroller wordt hieronder weergegeven:
Het circuit is gebouwd in Breadboard-
Code Uitleg
De volledige code voor het omzetten van digitale signalen naar analoog met PIC16F877A vindt u aan het einde van het artikel. Zoals altijd moeten we eerst de configuratiebits in de PIC-microcontroller instellen.
// PIC16F877A Configuratiebitinstellingen // 'C' source line config statements // CONFIG #pragma config FOSC = HS // Oscillator Selectie bits (HS oscillator) #pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT uitgeschakeld) # pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT uitgeschakeld) #pragma config BOREN = ON // Brown-out Reset Bit inschakelen (BOR ingeschakeld) #pragma config LVP = OFF // Laagspanning (enkele voeding) In-Circuit Serial Programming Enable bit (RB3 / PGM-pin heeft PGM-functie; laagspanningsprogrammering ingeschakeld) #pragma config CPD = OFF // Data EEPROM Geheugencodebeschermingsbit (Data EEPROM-codebescherming uitgeschakeld) #pragma config WRT = OFF // Flash Program Memory Write Enable bits (schrijfbeveiliging uitgeschakeld; alle programmageheugen kan worden geschreven door EECON-besturing) #pragma config CP = OFF // Flash Program Memory Code Protection bit (codebescherming uitgeschakeld)
De onderstaande coderegels worden gebruikt voor het integreren van LCD- en SPI-headerbestanden, ook de XTAL-frequentie en de CS-pinverbinding van de DAC worden aangegeven.
De PIC SPI tutorial en bibliotheek zijn te vinden op de gegeven link.
# omvatten
De functie SPI_Initialize_Master () is enigszins aangepast voor een andere configuratie die vereist is voor dit project. In dit geval is het SSPSTAT-register zo geconfigureerd dat de invoergegevens die zijn bemonsterd aan het einde van de gegevensuitvoertijd en de ook de SPI-klok die is geconfigureerd als Verzenden plaatsvindt bij de overgang van de actieve naar de niet-actieve kloktoestandmodus. Andere is hetzelfde.
ongeldig SPI_Initialize_Master () { TRISC5 = 0; // Stel in als uitvoer SSPSTAT = 0b11000000; // pg 74/234 SSPCON = 0b00100000; // pg 75/234 TRISC3 = 0; // Instellen als uitgang voor slavemodus }
Ook is voor de onderstaande functie de SPI_Write () enigszins gewijzigd. De gegevensoverdracht vindt plaats nadat de buffer is leeggemaakt om een perfecte gegevensoverdracht via SPI te garanderen.
void SPI_Write (inkomend teken) { SSPBUF = inkomend; // Schrijf de door de gebruiker gegeven gegevens in de buffer while (! SSPSTATbits.BF); }
Het belangrijkste onderdeel van het programma is de MCP4921-driver. Het is enigszins lastig omdat de opdracht en digitale gegevens samen worden geponst om volledige 16-bits gegevens over de SPI te leveren. Die logica wordt echter duidelijk weergegeven in de codecommentaar.
/ * Deze functie is voor het converteren van de digitale waarde naar de analoge. * / void convert_DAC (unsigned int value) { / * Step Size = 2 ^ n, dus 12bit 2 ^ 12 = 4096 Voor 5V-referentie is de stap 5/4095 = 0,0012210012210012V of 1mV (ongeveer) * / unsigned int container; unsigned int MSB; unsigned int LSB; / * Stap: 1, de 12-bits gegevens in de container opgeslagen Stel dat de gegevens 4095 zijn, in het binaire bestand 1111 1111 1111 * / container = waarde; / * Stap: 2 Dummy 8 bit maken. Dus door 256 te delen, worden de bovenste 4 bits vastgelegd in LSB LSB = 0000 1111 * / LSB = container / 256; / * Stap: 3 Verzenden van de configuratie met punching van de 4 bit data. LSB = 0011 0000 OF 0000 1111. Het resultaat is 0011 1111 * / LSB = (0x30) - LSB; / * Stap: 4 Container heeft nog steeds de 21-bits waarde. Extraheren van de onderste 8 bits. 1111 1111 EN 1111 1111 1111. Het resultaat is 1111 1111 wat MSB * / MSB = 0xFF & container; / * Stap: 4 Het verzenden van de 16 bits gegevens door deze in twee bytes te verdelen. * / DAC_CS = 0; // CS is laag tijdens gegevensoverdracht. Volgens het gegevensblad is het vereist SPI_Write (LSB); SPI_Write (MSB); DAC_CS = 1; }
In de hoofdfunctie wordt een 'for-lus' gebruikt waar de digitale gegevens voor het creëren van de uitvoer van 1V, 2V, 3V, 4V en 5V worden gemaakt. De digitale waarde wordt berekend tegen de uitgangsspanning / 0,0012210012210012 millivolt.
void main () { system_init (); introductie_scherm (); int nummer = 0; int volt = 0; while (1) { for (volt = 1; volt <= MAX_VOLT; volt ++) { nummer = volt / 0.0012210012210012; scherm wissen(); lcd_com (FIRST_LINE); lcd_puts ("DATA Verzonden: -"); lcd_print_number (nummer); lcd_com (SECOND_LINE); lcd_puts ("Uitvoer: -"); lcd_print_number (volt); lcd_puts ("V"); convert_DAC (getal); __delay_ms (300); } } }
Testen van de digitaal naar analoog conversie met behulp van PIC
Het gebouwde circuit is getest met behulp van een multimeter. In onderstaande afbeeldingen worden de uitgangsspanning en de digitale gegevens op het LCD-scherm weergegeven. De multimeter geeft nauwkeurige metingen weer.
Volledige code met een werkende video is hieronder bijgevoegd.