- MCP4921 DAC (digital till analog omvandlare)
- Komponenter krävs
- Schematisk
- Kodförklaring
- Testa digital till analog konvertering med PIC
Digital och analog är en integrerad del av elektronik. De flesta enheter har både ADC och DAC och de används när det finns behov av att konvertera signaler antingen från analog till digital eller digital till analog. Också de verkliga världssignalerna som ljud och ljus är analoga till sin natur, så när dessa verkliga signaler måste användas måste de digitala signalerna konverteras till analoga, till exempel för att producera ljud med hjälp av högtalare eller för att styra en ljuskälla.
En annan typ av DAC är en PWM (Pulse Width Modulator). En PWM tar ett digitalt ord och genererar en digital puls med variabel pulsbredd. När denna signal skickas genom ett filter blir resultatet rent analogt. En analog signal kan ha flera typer av data i en signal.
I denna handledning kommer vi att ansluta DAC MCP4921 med Microchip PIC16F877A för digital till analog konvertering.
Här i den här handledningen kommer vi att konvertera den digitala signalen till en analog signal och visa det digitala ingångsvärdet och det analoga utgångsvärdet på 16x2 LCD. Det kommer att ge 1V, 2V, 3V, 4V och 5V som den slutliga analoga utgången som visas i videon som ges i slutet. Du kan lära dig mer om DAC i vår värdefulla handledning om DAC-gränssnitt med Raspberry Pi, Arduino och STM32-kort.
DAC kan användas i många applikationer som motorstyrning, LED-lampor, ljusförstärkare, videokodare, datainsamlingssystem osv. Innan du hoppar direkt till gränssnittsdelen är det viktigt att ha en översikt över MCP4921.
MCP4921 DAC (digital till analog omvandlare)
MCP4921 är en 12-bitars DAC, så MCP4921 kommer att ge 12 bitar utgångsupplösning. DAC-upplösning betyder antal digitala bitar som kan omvandlas till analog signal. Hur många värden vi kan uppnå utifrån detta baseras på formeln. För 12-bitars är det = 4096. Det betyder att 12-bitars upplösning DAC kan producera 4096 olika utgångar.
Genom att använda detta värde kan man enkelt beräkna den enstaka analoga stegspänningen. För beräkning av stegen krävs referensspänning. Eftersom enhetens logiska spänning är 5V är stegspänningen 5/4095 (4096-1 eftersom startpunkten för digital inte är 1, det är 0), vilket är 0,00122100122 millivolt. Så, en ändring på 1 bit kommer att ändra den analoga utgången med 0,00122100122.
Så det var konverteringsdelen. Den MCP4921 är en 8-polig IC. Den stiftschema och beskrivningen kan hittas nedan.
Den MCP4921 IC kommunicerar med mikro av SPI-protokollet. För SPI-kommunikation måste en enhet vara master, som skickar data eller kommando till den externa enheten som är ansluten som en slav. I SPI-kommunikationssystem kan flera slavenheter anslutas till den enda masterenheten.
För att skicka in data och kommandot är det viktigt att förstå kommandoregistret.
I bilden nedan visas kommandoregistret,
Den kommandoregistret är en 16-bitars register. Bit-15 till bit-12 används för konfigurationskommandot. Datainmatningen och konfigurationen visas tydligt i bilden ovan. I detta projekt kommer MCP4921 att användas som följande konfiguration-
Bitnummer |
Konfiguration |
Konfigurationsvärde |
Bit 15 |
DAC A |
0 |
Bit 14 |
Obuffert |
0 |
Bit 13 |
1x (V OUT * D / 4096) |
1 |
Bit 12 |
Utgångsavstängningskontrollbit |
1 |
Så binär är 0011 tillsammans med data som bestäms av D11 till DO bitarna i registret. 16-bitarsdata 0011 xxxx xxxx xxxx måste skickas in där de första 4-bitarna av MSB är konfigurationen och resten är LSB. Det blir tydligare genom att se tidsdiagrammet för skrivkommandot.
Enligt tidtabellsdiagrammet och databladet är CS-stiftet lågt för hela kommandos skrivperiod till MCP4921.
Nu är det dags att ansluta enheten till hårdvaran och skriva koder.
Komponenter krävs
För detta projekt krävs följande komponenter -
- MCP4921
- PIC16F877A
- 20 MHz kristall
- En LCD-skärm på 16x2 tecken.
- 2k motstånd -1 st
- 33pF kondensatorer - 2 st
- 4,7 k motstånd - 1 st
- En multimeter för att mäta utspänningen
- En brädbräda
- 5V strömförsörjning, en telefonladdare kan fungera.
- Massor av anslutningsledningar eller bergtrådar.
- Programmeringsmiljö för mikrochips med programmerarsats och IDE med kompilator
Schematisk
Kretsschema för gränssnitt mellan DAC4921 och PIC Microcontroller ges nedan:
Kretsen är konstruerad i brödbräda-
Kodförklaring
Komplett kod för att konvertera digitala signaler till analoga med PIC16F877A ges i slutet av artikeln. Som alltid måste vi först ställa in konfigurationsbitarna i PIC-mikrokontrollern.
// PIC16F877A Configuration Bit Settings // 'C' source line config statements // CONFIG #pragma config FOSC = HS // Oscillator Selection bits (HS oscillator) # pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled) # pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled) #pragma config BOREN = ON // Brown-out Reset Enable bit (BOR enabled ) #pragma config LVP = OFF // Low-Voltage (Single-Supply)) Seriell programmering i kretsen aktiverar bit (RB3 / PGM-stift har PGM-funktion; lågspänningsprogrammering aktiverad) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = OFF // Flash Program Memory Write Aktivera bitar (skrivskydd av; allt programminne kan skrivas till av EECON-kontroll) #pragma config CP = OFF // Flash Program Memory Code Protection bit (Code protection off)
Nedanstående kodrader används för att integrera LCD- och SPI-huvudfiler, även XTAL-frekvensen och DAC: s CS-pin-anslutning deklareras.
PIC SPI-handboken och biblioteket finns på den givna länken.
#omfatta
Funktion SPI_Initialize_Master () modifieras något för en annan konfiguration som krävs för detta projekt. I detta fall är SSPSTAT-registret konfigurerat på ett sådant sätt att ingångsdata samplade vid slutet av datautmatningstiden och även SPI-klockan konfigurerad som sändning sker vid övergången från aktivt till viloläge klockläge. Annat är detsamma.
ogiltig SPI_Initialize_Master () { TRISC5 = 0; // Ställ in som utgång SSPSTAT = 0b11000000; // sid 74/234 SSPCON = 0b00100000; // sid 75/234 TRISC3 = 0; // Ställ in som utgång för slavläge }
För nedanstående funktion ändras SPI_Write () också något. Dataöverföring kommer att ske efter att bufferten har rensats för att säkerställa perfekt dataöverföring över SPI.
ogiltigt SPI_Write (char inkommande) { SSPBUF = inkommande; // Skriv användardata i buffert medan (! SSPSTATbits.BF); }
Den viktiga delen av programmet är MCP4921-drivrutinen. Det är lite knepigt eftersom kommandot och digitala data stansas ihop för att tillhandahålla fullständig 16-bitars data över SPI. Den logiken visas dock tydligt i kodkommentarerna.
/ * Denna funktion är för att konvertera det digitala värdet till det analoga. * / void convert_DAC (osignerat int-värde) { / * Stegstorlek = 2 ^ n, därför 12bit 2 ^ 12 = 4096 För 5V-referens blir steget 5/4095 = 0,0012210012210012V eller 1mV (ungefär) * / osignerad int-behållare; osignerad int MSB; osignerad int LSB; / * Steg: 1, lagrade 12-bitarsdata i behållaren Antag att data är 4095, i binär 1111 1111 1111 * / container = värde; / * Steg: 2 Skapa Dummy 8 bitar. Så genom att dela 256 fångas övre 4 bitar i LSB LSB = 0000 1111 * / LSB = behållare / 256; / * Steg: 3 Skicka konfigurationen med stansning av 4-bitarsdata. LSB = 0011 0000 ELLER 0000 1111. Resultatet är 0011 1111 * / LSB = (0x30) - LSB; / * Steg: 4 Behållaren har fortfarande 21-bitarsvärdet. Extrahera de nedre åtta bitarna. 1111 1111 OCH 1111 1111 1111. Resultatet är 1111 1111 vilket är MSB * / MSB = 0xFF & container; / * Steg: 4 Skicka 16 bitars data genom att dela i två byte. * / DAC_CS = 0; // CS är låg under dataöverföring. Enligt databladet krävs SPI_Write (LSB); SPI_Write (MSB); DAC_CS = 1; }
I huvudfunktionen används en 'for loop' där digital data för att skapa utgången 1V, 2V, 3V, 4V och 5V skapas. Det digitala värdet beräknas mot utspänningen / 0,0012210012210012 millivolt.
ogiltigt huvud () { system_init (); introduktionsskärm (); int antal = 0; int volt = 0; medan (1) { för (volt = 1; volt <= MAX_VOLT; volt ++) { nummer = volt / 0,0012210012210012; rensa skärmen(); lcd_com (FIRST_LINE); lcd_puts ("DATA Sent: -"); lcd_print_number (nummer); lcd_com (SECOND_LINE); lcd_puts ("Output: -"); lcd_print_number (volt); lcd_puts ("V"); convert_DAC (antal); __fördröjning_ms (300); } } }
Testa digital till analog konvertering med PIC
Den inbyggda kretsen testas med Multi-meter. I bilderna nedan visas utgångsspänningen och digitala data på LCD-skärmen. Multi-mätaren visar noggrann läsning.
Komplett kod med en fungerande video bifogas nedan.