- MCP4921 DAC (digitaalinen-analoginen muunnin)
- Tarvittavat komponentit
- Kaavamainen
- Koodin selitys
- Digitaalisen analogisen muunnoksen testaaminen PIC: n avulla
Digitaalinen ja analoginen on olennainen osa elektroniikkaa. Suurimmalla osalla laitteista on sekä ADC että DAC, ja niitä käytetään, kun on tarpeen muuntaa signaaleja joko analogisista digitaalisiksi tai digitaalisista analogisiksi. Myös reaalimaailman signaalit, kuten ääni ja valo, ovat luonteeltaan analogisia, joten aina kun näitä reaalimaailman signaaleja on käytettävä, digitaaliset signaalit on muunnettava analogisiksi, esimerkiksi äänen tuottamiseksi kaiuttimien avulla tai valonlähteen ohjaamiseksi.
Toinen DAC-tyyppi on PWM (Pulse Width Modulator). PWM ottaa digitaalisen sanan ja luo digitaalisen pulssin, jolla on vaihteleva pulssin leveys. Kun tämä signaali viedään suodattimen läpi, tulos on puhtaasti analoginen. Analogisella signaalilla voi olla monentyyppisiä tietoja signaalissa.
Tässä opetusohjelmassa liitämme DAC MCP4921: n Microchip PIC16F877A: n kanssa digitaaliseksi analogiseksi muuntamiseksi.
Tässä opetusohjelmassa muunnetaan digitaalinen signaali analogiseksi signaaliksi ja näytetään digitaalinen tuloarvo ja lähtöanalogiarvo 16x2 LCD-näytöllä. Se tarjoaa 1V, 2V, 3V, 4V ja 5V lopullisena analogialähdönä, joka osoitetaan lopussa annetussa videossa. Voit oppia DAC: sta tarkemmin oppaassamme DAC-liitännästä Raspberry Pi-, Arduino- ja STM32-levyjen kanssa.
DAC: ää voidaan käyttää monissa sovelluksissa, kuten moottorin ohjauksessa, LED-valojen kirkkauden säätämisessä, äänivahvistimessa, videokoodereissa, tiedonkeruujärjestelmissä jne. Ennen kuin siirryt suoraan liitäntäosaan, on tärkeää, että sinulla on yleiskatsaus MCP4921: stä.
MCP4921 DAC (digitaalinen-analoginen muunnin)
MCP4921 on 12-bittinen DAC, joten MCP4921 tarjoaa 12 bittiä lähtöresoluutiota. DAC-tarkkuus tarkoittaa digitaalisten bittien lukumäärää, jotka voidaan muuntaa analogiseksi signaaliksi. Kuinka monta arvoa voimme saavuttaa tällä perusteella, perustuu kaavaan. 12-bittinen on = 4096. Tämä tarkoittaa, että 12-bittinen resoluutio DAC voisi tuottaa 4096 erilaista lähtöä.
Tätä arvoa käyttämällä voidaan helposti laskea yhden analogisen askeljännite. Vaiheiden laskemiseksi tarvitaan referenssijännite. Koska laitteen logiikkajännite on 5 V, askeljännite on 5/4095 (4096-1, koska digitaalisen aloituskohta ei ole 1, se on 0), joka on 0,00122100122 millivoltia. Joten yhden bitin muutos muuttaa analogisen lähdön arvoksi 0,00122100122.
Joten se oli muunnososa. MCP4921 on 8-pin IC. Tappi kaavio ja kuvausta löytyy alla.
MCP4921 IC kommunikoi mikrokontrollerin SPI-protokollaa. SPI-tiedonsiirtoa varten laitteen on oltava isäntä, joka lähettää tietoja tai komentoja orjana kytkettyyn ulkoiseen laitteeseen. SPI-tietoliikennejärjestelmässä useita orjalaitteita voidaan liittää yhteen päälaitteeseen.
Tietojen ja komennon lähettämiseksi on tärkeää ymmärtää komentorekisteri.
Alla olevassa kuvassa näkyy komentorekisteri,
Komento rekisteri on 16-bittinen rekisteri. Bit-15 - bit-12 käytetään määrityskomentoon. Tietojen syöttö ja kokoonpano näkyvät selvästi yllä olevassa kuvassa. Tässä projektissa MCP4921: tä käytetään seuraavana kokoonpanona -
Bittinumero |
Kokoonpano |
Kokoonpanoarvo |
Bitti 15 |
DAC A |
0 |
Bitti 14 |
Puskuroimaton |
0 |
Bitti 13 |
1x (V OUT * D / 4096) |
1 |
Bitti 12 |
Lähdön virrankatkaisun ohjausbitti |
1 |
Joten binääri on 0011 yhdessä tietojen kanssa, jotka määritetään rekisterin D11 - D0-biteillä. 16-bittinen data 0011 xxxx xxxx xxxx on lähetettävä, jos MSB: n 4 ensimmäistä bittiä on kokoonpano ja loput LSB. Se on selkeämpi näkemällä kirjoituskäskyn ajoituskaavio.
Ajastuskaavion ja tietolomakkeen mukaan CS-nasta on alhainen koko komennon kirjoitusjakson ajan MCP4921: lle.
Nyt on aika liittää laite laitteistoon ja kirjoittaa koodit.
Tarvittavat komponentit
Tätä projektia varten tarvitaan seuraavat komponentit:
- MCP4921
- PIC16F877A
- 20 MHz: n kristalli
- A 16x2-merkkinen LCD-näyttö.
- 2k vastus -1 kpl
- 33pF-kondensaattorit - 2 kpl
- 4,7 kt vastus - 1 kpl
- Monimittari lähtöjännitteen mittaamiseen
- Leipälauta
- 5 V: n virtalähde, puhelimen laturi voi toimia.
- Paljon kytkentäjohtoja tai berg-johtoja.
- Mikrosirun ohjelmointiympäristö ohjelmointisarjalla ja IDE kääntäjällä
Kaavamainen
Piirikaavio DAC4921: n liitännästä PIC-mikrokontrolleriin on annettu alla:
Piiri on rakennettu leipä-
Koodin selitys
Täydellinen koodi on muuntaa digitaaliset signaalit analogisiksi kanssa PIC16F877A annetaan lopussa artikkelin. Kuten aina, meidän on ensin asetettava konfigurointibitit PIC-mikrokontrollerissa.
// PIC16F877A-määritysbittiasetukset // C-lähdekoodin määrityslausekkeet // CONFIG #pragma config FOSC = HS // Oskillaattorin valintabitit (HS-oskillaattori) #pragma config WDTE = POIS // Watchdog Timer Ota bitti käyttöön (WDT pois käytöstä) # pragma-konfiguraatio PWRTE = POIS // Käynnistysajastin Ota bitti käyttöön (PWRT pois käytöstä) #pragma-konfiguraatio BOREN = PÄÄLLÄ // Ruskea-out-nollaus Ota bitti käyttöön (BOR käytössä) #pragma-konfiguraatio LVP = POIS // Pienjännite (kertalähde)) Piirin sisäinen sarjaohjelmointi Aktivoi bitti (RB3 / PGM-nastalla on PGM-toiminto; matalajännitteinen ohjelmointi käytössä) #pragma config CPD = OFF // Data EEPROM Memory Code Protection bit (Data EEPROM code protection off) #pragma config WRT = POIS // Flash-ohjelmamuistin kirjoitus Salli bitit (Kirjoitussuojaus pois; kaikki ohjelmamuistit voidaan kirjoittaa EECON-ohjauksella) #pragma config CP = OFF // Flash-ohjelman muistikoodisuojabitti (koodisuojaus pois päältä)
Alla olevia koodirivejä käytetään LCD- ja SPI-otsikkotiedostojen integrointiin, myös XTAL-taajuus ja DAC: n CS-nastayhteys ilmoitetaan.
PIC SPI -opetusohjelma ja kirjasto löytyvät annetusta linkistä.
#sisältää
Funciton SPI_Initialize_Master () on modifioitu hieman erilainen kokoonpano tarvita tähän projektiin. Tällöin SSPSTAT-rekisteri on konfiguroitu siten, että syötetty data, josta on otettu näytteet datan lähtöajan lopussa, ja myös lähetykseen määritetty SPI-kello tapahtuvat siirtyessä aktiivisesta kellotilaan. Muu on sama.
void SPI_Initialize_Master () { TRISC5 = 0; // Aseta lähdöksi SSPSTAT = 0b11000000; // s. 74/234 SSPCON = 0b00100000; // s. 75/234 TRISC3 = 0; // Aseta lähtö orjatilan lähdöksi }
Lisäksi alla olevaa toimintoa varten SPI_Write () on hieman muokattu. Tiedonsiirto tapahtuu puskurin tyhjentämisen jälkeen täydellisen tiedonsiirron varmistamiseksi SPI: n kautta.
void SPI_Write (char incoming) { SSPBUF = saapuva; // Kirjoita käyttäjän antamat tiedot puskuriin while (! SSPSTATbits.BF); }
Tärkeä osa ohjelmaa on MCP4921-ohjain. Se on hieman hankala osa, kun komento ja digitaalinen data rei'itetään yhteen, jotta saadaan täydellinen 16-bittinen data SPI: n kautta. Tämä logiikka näkyy kuitenkin selvästi koodikommenteissa.
/ * Tämä toiminto on tarkoitettu digitaalisen arvon muuntamiseen analogiseksi. * / void convert_DAC (allekirjoittamaton int-arvo) { / * Vaiheen koko = 2 ^ n, siis 12-bittinen 2 ^ 12 = 4096 5 V: n viitteessä vaihe on 5/4095 = 0,0012210012210012V tai 1 mV (noin) * / allekirjoittamaton int-säilö; allekirjoittamaton MSB; allekirjoittamaton int LSB; / * Vaihe: 1, tallennettu 12-bittinen data säilöön Oletetaan, että data on 4095, binäärisenä 1111 1111 1111 * / container = arvo; / * Vaihe: 2 8-bittisen nuken luominen. Joten jakamalla 256, ylemmät 4 bittiä kaapataan LSB: ssä LSB = 0000 1111 * / LSB = container / 256; / * Vaihe: 3 Määrityksen lähettäminen 4-bittisen datan lävistämisellä. LSB = 0011 0000 TAI 0000 1111. Tulos on 0011 1111 * / LSB = (0x30) - LSB; / * Vaihe: 4 Säiliöllä on edelleen 21-bittinen arvo. Pura alemmat 8 bittiä. 1111 1111 ja 1111 1111 1111. Tulos on 1111 1111, joka on MSB * / MSB = 0xFF & kontti; / * Vaihe: 4 Lähetetään 16-bittiset tiedot jakamalla kaksi tavua. * / DAC_CS = 0; // CS on alhainen tiedonsiirron aikana. Datalehden mukaan vaaditaan SPI_Write (LSB); SPI_Write (MSB); DAC_CS = 1; }
Päätoiminnossa käytetään 'silmukkaa varten', jossa luodaan digitaalinen data 1 V, 2 V, 3 V, 4 V ja 5 V lähdön luomiseksi. Digitaaliarvo lasketaan lähtöjännitteen / 0,0012210012210012 millivoltin perusteella.
void main () { system_init (); esittelynäyttö (); int-luku = 0; int volt = 0; kun taas (1) { for (volt = 1; volt <= MAX_VOLT; volt ++) { numero = volt / 0.0012210012210012; tyhjennä_näyttö (); lcd_com (FIRST_LINE); lcd_puts ("DATA lähetetty: -"); lcd_print_numero (numero); lcd_com (SECOND_LINE); lcd_puts ("Tulos: -"); lcd_print_numero (voltti); lcd_puts ("V"); muuntaa_DAC (luku); __viive_ms (300); } } }
Digitaalisen analogisen muunnoksen testaaminen PIC: n avulla
Rakennettu piiri testataan Multi-meterillä. Alla olevissa kuvissa lähtöjännite ja digitaaliset tiedot näkyvät nestekidenäytössä. Monimittari näyttää tarkkaa lukemaa.
Täydellinen koodi toimivalla videolla on alla.