- MCP4921 DAC (digitális-analóg átalakító)
- Szükséges alkatrészek
- Vázlatos
- Kód Magyarázat
- A digitális analóg átalakítás tesztelése PIC használatával
A digitális és az analóg az elektronika szerves része. A legtöbb eszköz rendelkezik ADC-vel és DAC-tal is, és akkor használják őket, amikor szükség van jelek analógról digitálisra vagy digitálisról analógra konvertálására. A valós jelek, például a hang és a fény is analóg jellegűek, így amikor ezeket a valós jeleket kell használni, a digitális jeleket analógra kell alakítani, például hangszórók előállításához vagy egy fényforrás vezérléséhez.
A DAC másik típusa az impulzusszélesség-modulátor (PWM). A PWM digitális szót vesz fel, és változó impulzusszélességű digitális impulzust generál. Amikor ezt a jelet áthaladják egy szűrőn, az eredmény teljesen analóg lesz. Az analóg jelnek többféle adata lehet egy jelben.
Ebben az oktatóanyagban a DAC MCP4921-et összekapcsoljuk a Microchip PIC16F877A-val a digitális-analóg átalakításhoz.
Ebben az oktatóanyagban a digitális jelet analóg jellé alakítjuk, és a bemenő digitális értéket és a kimeneti analóg értéket 16x2 LCD-n jelenítjük meg. 1 V, 2 V, 3 V, 4 V és 5 V feszültséget szolgáltat végső analóg kimenetként, amelyet a végén bemutatott videó mutat be. A DAC-ról többet megtudhat a Raspberry Pi, Arduino és STM32 táblákkal való interakcióról szóló értékes oktatóanyagunkban.
A DAC számos alkalmazásban használható, például motorvezérlésben, a LED-es lámpák fényerejének szabályozásában, hangerősítőben, videokódolókban, adatgyűjtő rendszerekben stb. Mielőtt közvetlenül az interfészre ugrana, fontos, hogy áttekintést kapjon az MCP4921-ről.
MCP4921 DAC (digitális-analóg átalakító)
Az MCP4921 egy 12 bites DAC, így az MCP4921 12 bites kimeneti felbontást biztosít. A DAC felbontás jelentése digitális bitek száma, amelyek analóg jellé alakíthatók. Az, hogy ebből hány értéket érhetünk el, a képleten alapul. 12 bites esetén ez = 4096. Ez azt jelenti, hogy a 12 bites felbontású DAC 4096 különböző kimenetet produkálhat.
Ennek az értéknek a használatával könnyen kiszámolható az egy analóg lépésfeszültség. A lépések kiszámításához a referenciafeszültségre van szükség. Mivel az eszköz logikai feszültsége 5V, a lépésfeszültség 5/4095 (4096-1, mert a digitális kezdőpontja nem 1, ez 0), ami 0,00122100122 millivolt. Tehát egy 1 bites változás megváltoztatja az analóg kimenetet 0,00122100122 értékkel.
Tehát ez volt a konverziós rész. Az MCP4921 egy 8 tűs IC. A tűs diagram és a leírás az alábbiakban található.
Az MCP4921 IC az SPI protokollal kommunikál a mikrovezérlővel. Az SPI kommunikációhoz egy eszköznek master-nek kell lennie, amely adatokat vagy parancsokat küld a slave-ként csatlakoztatott külső eszközhöz. Az SPI kommunikációs rendszerben több szolga eszköz csatlakoztatható egyetlen Master eszközhöz.
Az adatok és a parancs elküldéséhez fontos a parancsregiszter megértése.
Az alábbi képen a parancsregiszter látható,
A parancsregiszter egy 16 bites regiszter. A 15-től 12-ig bit a konfigurációs parancshoz használható. Az adatbevitel és a konfiguráció egyértelműen látható a fenti képen. Ebben a projektben az MCP4921 lesz a következő konfigurációs
Bit szám |
Konfiguráció |
Konfigurációs érték |
15. bit |
DAC A |
0 |
14. bit |
Páratlan |
0 |
13. bit |
1x (V OUT * D / 4096) |
1 |
12. bit |
Kimeneti áramkimaradás vezérlő bit |
1 |
Tehát a bináris 0011 az adatokkal együtt, amelyeket a regisztráció D11 – D0 bitjei határoznak meg. A 16 bites 0011 xxxx xxxx xxxx adatokat be kell nyújtani, ahol az MSB első 4 bitje a konfiguráció, a többi pedig az LSB. Az írásparancs időzítési diagramjának megismerésével világosabb lesz.
Az időzítési diagram és az adatlap szerint a CS tű alacsony az MCP4921 parancs teljes írási időszakában.
Itt az ideje, hogy összekapcsoljuk az eszközt a hardverrel és megírjuk a kódokat.
Szükséges alkatrészek
Ehhez a projekthez a következő összetevők szükségesek:
- MCP4921
- PIC16F877A
- 20 MHz kristály
- A 16x2 karakteres LCD kijelző.
- 2k ellenállás -1 pc
- 33pF kondenzátorok - 2 db
- 4.7k ellenállás - 1 db
- Több méter a kimeneti feszültség mérésére
- Egy kenyérdeszka
- 5 V-os tápegység, A telefonos töltő működhet.
- Sok összekapcsoló vezeték vagy berg vezeték.
- Mikrochip programozási környezet Programmer készlettel és IDE fordítóval
Vázlatos
A DAC4921 és a PIC mikrovezérlő összekapcsolásának áramköri diagramja az alábbiakban látható:
Az áramkört kenyérlemez-
Kód Magyarázat
A digitális jelek analógá alakításához a PIC16F877A teljes kódja a cikk végén található. Mint mindig, először is be kell állítanunk a konfigurációs biteket a PIC mikrovezérlőben.
// PIC16F877A konfigurációs bitbeállítások // 'C' forrássor konfigurációs utasításai // CONFIG #pragma config FOSC = HS // oszcillátor kiválasztó bitjei (HS oszcillátor) #pragma config WDTE = KI // Watchdog időzítő bit engedélyezése (WDT letiltva) # pragma config PWRTE = OFF // Bekapcsolási időzítő bit engedélyezése (PWRT letiltva) # pragma config BOREN = BE // Brown-out Reset bit engedélyezése (BOR engedélyezve) #pragma config LVP = OFF // Alacsony feszültség (egyszeres táp)) Áramkörön belüli soros programozás engedélyezési bitje (az RB3 / PGM csapnak PGM funkciója van; alacsony feszültségű programozás engedélyezve) #pragma config CPD = OFF // Data EEPROM memóriakód védelmi bit (Data EEPROM kód védelem ki) #pragma config WRT = KI // Flash programmemória írása Bitek engedélyezése (Írásvédelem kikapcsolva; az összes programmemóriát írhatja az EECON vezérlés )
Az alábbi kódsorok az LCD és az SPI fejlécfájlok integrálására szolgálnak, az XTAL frekvencia és a DAC CS tűkapcsolata is meg van adva.
A PIC SPI oktatóprogram és könyvtár a megadott linken található.
#include
Funciton az SPI_Initialize_Master () kissé módosítva van a projekthez szükséges más konfigurációhoz. Ebben az esetben az SSPSTAT regiszter úgy van konfigurálva, hogy az adatkimeneti idő végén mintavételezett bemeneti adatok, valamint az Átadásként konfigurált SPI óra az aktív állapotból az alapjárati állapot módba való átmenetkor következzen be. Más ugyanaz.
void SPI_Initialize_Master () { TRISC5 = 0; // Beállítás kimenetként SSPSTAT = 0b11000000; // pp 74/234 SSPCON = 0b00100000; pg 75/234 TRISC3 = 0; // Beállítás kimenetként slave módhoz }
Az alábbi függvény esetében az SPI_Write () is kissé módosul. Az adatátvitel a puffer törlése után következik be a tökéletes adatátvitel érdekében az SPI-n keresztül.
void SPI_Write (char bejövő) { SSPBUF = bejövő; // Írja be a felhasználó által megadott adatokat a pufferbe, míg (! SSPSTATbits.BF); }
A program fontos része az MCP4921 illesztőprogram. Ez kissé trükkös, mivel a parancs és a digitális adatok össze vannak lyukasztva, hogy teljes 16 bites adatokat nyújtsanak az SPI-n keresztül. Ez a logika azonban egyértelműen megmutatkozik a kód megjegyzéseiben.
/ * Ez a funkció a digitális érték analógra konvertálására szolgál. * / Void convert_DAC (unsigned int érték) { / * lépés Méret = 2 ^ n, Ezért 12bit 2 ^ 12 = 4096 5V referencia, a lépés lesz 5/4095 = 0.0012210012210012V vagy 1mV (kb) * / unsigned int konténer; aláíratlan int MSB; aláíratlan int LSB; / * Lépés: 1, a 12 bites adatokat a tárolóba tárolta. Tegyük fel, hogy az adat 4095, bináris 1111 1111 1111 * / tároló = érték; / * Lépés: 2 8 bites Dummy létrehozása. Tehát a 256 felosztásával a felső 4 bitet rögzítjük az LSB-ben: LSB = 0000 1111 * / LSB = tartály / 256; / * Lépés: 3 A konfiguráció elküldése a 4 bites adatok lyukasztásával. LSB = 0011 0000 VAGY 0000 1111. Az eredmény: 0011 1111 * / LSB = (0x30) - LSB; / * Lépés: 4 A konténer továbbra is rendelkezik a 21 bites értékkel. Az alsó 8 bit kibontása. 1111 1111 és 1111 1111 1111. Az eredmény 1111 1111, amely MSB * / MSB = 0xFF és konténer; / * Lépés: 4 A 16 bites adatok elküldése két bájtra osztással. * / DAC_CS = 0; // A CS alacsony az adatátvitel során. Az adatlap szerint SPI_Write (LSB) szükséges; SPI_Write (MSB); DAC_CS = 1; }
A fő funkcióban egy „for loop” -ot használnak, ahol az 1V, 2V, 3V, 4V és 5V kimenetének létrehozására szolgáló digitális adatok jönnek létre. A digitális értéket a kimeneti feszültség / 0,0012210012210012 millivolt alapján számítják ki.
void main () { system_init (); bevezető_képernyő (); int szám = 0; int volt = 0; míg (1) { for (volt = 1; volt <= MAX_VOLT; volt ++) { szám = volt / 0,0012210012210012; clear_screen (); lcd_com (FIRST_LINE); lcd_puts ("Elküldött adatok: -"); lcd_print_szám (szám); lcd_com (SECOND_LINE); lcd_puts ("Kimenet: -"); lcd_print_szám (volt); lcd_puts ("V"); convert_DAC (szám); __késlelt_ms (300); } } }
A digitális analóg átalakítás tesztelése PIC használatával
Az épített áramkört többmérővel tesztelik. Az alábbi képeken a kimeneti feszültség és a digitális adatok láthatók az LCD-n. A több méteres mérőórák szoros leolvasást mutatnak.
A teljes kód egy működő videóval alább található.