Číslicovo-analógový prevodník (DAC): Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
|||
Riadok 13: | Riadok 13: | ||
2. Druhá možnosť je použiť špecializovaný integrovaný obvod, ktorý pripojíme k mikropočítaču buď cez zbernicu I2C. Takýchto obvodov existuje veľa, často k nim existuje už aj fungujúca knižnica napr. [[Zbernica i2c: PCF8591|PCF5891]] - 1x 8-bit DAC, alebo [https://www.adafruit.com/product/4470 MCP4728] - 4x 12-bit DAC. Druhou často používanou zbernicou je SPI, aj k nej je možno nájsť podobné prevodníky, napr. [http://ww1.microchip.com/downloads/en/devicedoc/21897b.pdf MCP4921] - 1x 12-bit SPI DAC, alebo [https://datasheets.maximintegrated.com/en/ds/MAX5171BOB.pdf MAX5715] - 4x 12-Bit SPI DAC. | 2. Druhá možnosť je použiť špecializovaný integrovaný obvod, ktorý pripojíme k mikropočítaču buď cez zbernicu I2C. Takýchto obvodov existuje veľa, často k nim existuje už aj fungujúca knižnica napr. [[Zbernica i2c: PCF8591|PCF5891]] - 1x 8-bit DAC, alebo [https://www.adafruit.com/product/4470 MCP4728] - 4x 12-bit DAC. Druhou často používanou zbernicou je SPI, aj k nej je možno nájsť podobné prevodníky, napr. [http://ww1.microchip.com/downloads/en/devicedoc/21897b.pdf MCP4921] - 1x 12-bit SPI DAC, alebo [https://datasheets.maximintegrated.com/en/ds/MAX5171BOB.pdf MAX5715] - 4x 12-Bit SPI DAC. | ||
Túto možnosť podrobne preskúmame na jednom z ďalších cvičení, kde sa budeme venovať externému modulu s čipom [Zbernica i2c: PCF8591|PCF5891]]. | |||
Verzia z 23:47, 21. marec 2021
Ak potrebujeme previesť číslicový signál na analógový, tak máme niekoľko možností.
1. Najjednoduchší spôsob je využiť D/A prevodník priamo na čipe mikropočítača. To však, žiaľ, nie je prípad procesoru ATmega328P, s ktorým tento semester pracujeme. Ale ak by ste si mohli vybrať, aj priamo v rodine mikroprocesorov AVR sa nájdu takéto typy - napr. procesor ATtiny214 z rodiny ATtiny[REF 1].
2. Druhá možnosť je použiť špecializovaný integrovaný obvod, ktorý pripojíme k mikropočítaču buď cez zbernicu I2C. Takýchto obvodov existuje veľa, často k nim existuje už aj fungujúca knižnica napr. PCF5891 - 1x 8-bit DAC, alebo MCP4728 - 4x 12-bit DAC. Druhou často používanou zbernicou je SPI, aj k nej je možno nájsť podobné prevodníky, napr. MCP4921 - 1x 12-bit SPI DAC, alebo MAX5715 - 4x 12-Bit SPI DAC.
Túto možnosť podrobne preskúmame na jednom z ďalších cvičení, kde sa budeme venovať externému modulu s čipom [Zbernica i2c: PCF8591|PCF5891]].
3. Tretia možnosť je postaviť si vlastný D/A prevodník z presných rezistorov, tzv. R-2R siete[REF 2].
Jej principiálna schéma zapojenia je na nasledovnom obrázku, podrobný princíp funkcie je veľmi dobre vysvetlený v citovanom odkaze.
4. No a posledná možnosť, ktorej sa budeme venovať aj na cvičení je využiť šírkovo modulovaný signál PWM
V niektorých aplikáciach potrebujeme premenlivú šírku impulzu, v iných nás viac zaujíma stredná hodnota napätia, impulzy sa naopak snažíme vyfiltrovať. Dôležité sú dva parametre: frekvencia a tzv. plnenie (pozri obr.).
je doba, počas ktorej je výstup v log. 1 a je čas v log. nule. Celková perióda signálu je .
Plnenie (duty cycle) je pre obdĺžnikový signál definované ako
A výstupné napätie
Ako vidno, výstupné napätie môžeme meniť zmenou periódy .
Ak je T_on 0, V_out je tiež 0, ak je T_on T_total, potom V_out je maximalne.
Brute force: softvérové PWM
Ak si spravíme svoje vlastné počítadlo time
, tak vieme spraviť šírkovo modulovaný výstup na ľubovoľnom pine procesora čisto softvérovými prostriedkami. Daňou za toto riešenie je, že procesor nerobí nič iné, len počíta čas na prepnutie stavu. Nasledovný program je ukážkou takéhoto prístupu, ovládame LED diódu zapojenú na PORTD.7 (Adrudino D7).
#include <avr/io.h>
#include <util/delay.h>
/* Pripojenie periferii k vyvojovej doske Arduino: */
#define LED2 PD7 // externa LED dioda
#define LED2_ON (PORTD |= (1<<LED2))
#define LED2_OFF (PORTD &= ~(1<<LED2))
int main(void)
{
/* SETUP */
DDRD = (1<<LED2); // PORTD: LED2 na PD7 je output
/* LOOP */
unsigned char duty = 250;
while(1)
{
// nase vlastne pocitadlo pocita stale dokola, rychlost dana delay
for (int time=0;time<255;time++)
{
if (time > duty)
LED2_ON;
else
LED2_OFF;
_delay_us(200);
}
} /* end of while */
return(0);
}
/* predosly program doplnime o premennu smer (+1/-1) a budeme hodnotu 'duty' postupne
zvacsovat a po dosiahnuti maxima (255) zasa zmensovat (-1) az po nulu. A takto stale
dookola dosiahneme znamy efekt "dychajucej" LED diody */
unsigned char smer = 1; // doplnujuca premenna
/* toto musime doplnit do hlavnej slucky */
if (duty == 255)
smer = -1;
if (duty == 0 )
smer = 1;
duty = duty+smer;
Dýchajúcu LED diódu ako prví použili vo firme Apple na počítači iBook G3 a dali si tento dizajnový prvok aj patentovať[REF 3]. Podrobný výskum a verné napodobnenie tohoto efektu nájdete aj v článku Avitala Pekkera[REF 4]
Generovanie PWM pomocou 16-bitového počítadla a časovača T1
Vyššie uvedený prístup je síce možný, ale vysoko neefektívny. Preto si v tejto časti ukážeme to isté, ale zrealizované pomocou zabudovanej periférie - niektorého počítadla. Najvýhodnejšie by na to bolo počítadlo T1, ktoré so svojim 16-bitovým rozlíšením umožňuje naozaj presné generovanie impulzov požadovanej šírky. Žiaľ, na našej doštičke sme si výstupy obsadili displejom a preto musíme preskočiť celú túto kapitolku a použijeme T0.
Zadanie
- Naprogramujte PWM tak, aby generovalo impulzy 1Hz, 1:1 (kontrola LED diódou pripojenou na Dx)
- Naprogramujte PWM tak, aby generovalo impulzy {1,0ms 1,5ms 2,0ms} s periódou opakovania 50Hz (kontrola pripojením serva)
Úlohy
- Vyskúšajte ukážkový program (vyžaduje pripojený LCD modul s tlačítkami - S1 a S2 menia striedu nahor / nadol, S3 a S4 ovládajú žltú LED na doske) - Media:AcrobExamplePWM.hex
- Program doplňte podľa pokynov asistenta a odsimulujte.
Pozn.: Treba vypnúť optimalizáciu! (Project/Project options Pozri obr.) - Doplňte chýbajúce časti programu tak, aby LED blikala s frekvenciou 1 s.
- Vyskúšajte na svojej doske.
T1: režim PWM
V režime PWM (Pulse Width Modulation) môžeme použiť T1 ako 8,9 alebo 10-bitový, voľnobežný PWM generátor. Timer/Counter 1 funguje ako počítadlo, ktoré ráta najprv smerom nahor od 0x0000 až po vybraný TOP (8bit -> 0x00FF, 9bit -> 0x01FF, 10bit -> 0x03FF), tam sa otočí a počíta zasa smerom nadol až po 0x0000 a toto sa opakuje stále dokola.
Keď sa hodnota počítadla zhoduje s obsahom porovnávacívch registrov (OCR1A, OCR1B), zmení sa aj hodnota na výstupných pinoch OCA1 a OCB1 nasledovne:
COM1X1 COM1X0 Čo urobí s OCX1 0 0 nič 0 1 nič 1 0 smerom nahor: 0 pri zhode smerom nadol: 1 pri zhode 1 1 smerom nahor: 1 pri zhode smerom nadol: 0 pri zhode
V registri TCCR1A musíme nastaviť:
COM1A1 -> bit7 COM1A0 -> bit6 COM1B1 -> bit5 COM1B0 -> bit4
To, ktorý režim PWM chceme používať sa nastavuje bitmi PWM10 (bit0 v TCCR1A) a PWM11 (bit1 v TCCR1A) takto:
PWM11 PWM10 Režim 0 0 PWM zakázané 0 1 8-bit PWM 1 0 9-bit PWM 1 1 10-bit PWM
Príklad:
Na obrázku je priebeh PWM signálu s plnením 25% tak ako opúšťa procesor (červený) a po vyfiltrovaní RC členom (zelený). Perióda PWM je 3,56 ms (281,25 Hz), je 0,9 ms, je 2,65 ms. (zelený priebeh) je 100 us. Osciloskop: 500us/d., 2.00V/d. Parametre: Timer0, mode 8-bit Fast PWM, Prescaler 1:256, OCR0A = 63.
Literatúra
- ↑ Victor Berzan: Getting Started with DAC. Application Note TB3210, Microchip Technology, 2018.
- ↑ Alan Wolke Tutorial: Digital to Analog Conversion – The R-2R DAC. Textronix Blog, June 23, 2015
- ↑ Breathing status LED indicator. US patent No. US6658577B2, Apple Inc., 2002
- ↑ Avital Pekker: A closer look at Apple's breathing light. Personal blog, 2016
Doplnková literatúra:
- Newbie's Guide to AVR Timers
- The traps when using interrupts
- Ako používať časovače v AVR C
- PWM tutorial
- Prednáška o prerušeniach (Ing. Chamraz)