A/D prevodník: Rozdiel medzi revíziami
Zo stránky SensorWiki
Bez shrnutí editace |
|||
(19 medziľahlých úprav od rovnakého používateľa nie je zobrazených.) | |||
Riadok 1: | Riadok 1: | ||
== A/D prevodník == | |||
=== Úlohy === | |||
# Zapojte si na doštičke potenciometer s vývodom na niektorý z analógových vstupov. Môžete tiež vyskúšať fotorezistor, alebo termistor. | |||
# Doplňte program o jednoduchý A/D prevod a zobrazte hodnotu z potenciometra na sériovom termináli (a príp. aj na LCD displej). | |||
# Zistite, čo sa stane, ak budete merať nezapojený vstup ("zo vzduchu"). | |||
# Oboznámte sa s programom SerialPlot a zobrazte časový priebeh nameranej veličiny. | |||
# Napokon pomocou potenciometra ovládajte intenzitu svitu niektorej LED diódy. | |||
=== Rekapitulácia === | |||
<!-- | |||
Máte k dispozícii vývojovú dosku '''Acrob''' s procesorom ATmega328 ([http://ap.urpi.fei.stuba.sk/mmp/ATmega328.pdf datasheet]). | |||
--> | |||
V tejto úlohe sa predpokladá znalosť funkcie A/D prevodníka z prednášky. Na posledných dvoch slajdoch máte pripravené funkcie na inicializáciu a načítanie výsledku prevodu. Preto sa v tomto návode nebudeme zaoberať týmito funkciami. | |||
=== | [[Súbor:MIPS_AD-Suciastky.jpg|300px|right]] | ||
=== Hardware === | |||
Ako vstup do A/D prevodníka môžete použiť niektorý zo štyroch uvedených príkladov: | |||
* obyčajný odporový delič, ktorým môžeme detekovať napríklad pokles napätia napájacej batérie | |||
* potenciometer alebo trimer, ktorý máte v MISP kite | |||
* fotorezistor, ale ten slúži len na orientačné merania, pretože nemáme referenčný zdroj osvetlenia | |||
* termistor, ktorý tiež vieme využiť len orientačne, hoci k nemu by sme vedeli vypočítať teplotu podľa [http://senzor.robotika.sk/mmp/2322640.pdf datasheetu] (pozri tiež [https://en.wikipedia.org/wiki/Steinhart%E2%80%93Hart_equation Stienhart-Hartovu rovnicu]). | |||
<div style='text-align: center;'> | |||
[[Súbor:MIPS_ADC-Schema01.png|800px]]<BR> | |||
''Schéma pripojenia vstupov k A/D prevodníku. Ak vám nepomôže, použite [[Media:MIPS_ADC-Schema02.png|zapojovací diagram]]'' | |||
</div> | |||
=== A/D prevodník === | === A/D prevodník === | ||
Riadok 28: | Riadok 45: | ||
</math> | </math> | ||
<!-- | |||
Vstupy A/D prevodníka na Acrob doske sú zapojené takto (pozri aj obrázok [[:Media:Connectors.png]]): | Vstupy A/D prevodníka na Acrob doske sú zapojené takto (pozri aj obrázok [[:Media:Connectors.png]]): | ||
Riadok 37: | Riadok 55: | ||
Vref 1110 vnútorná referencia 1,1 V | Vref 1110 vnútorná referencia 1,1 V | ||
GND 1111 vnútorná zem 0 V | GND 1111 vnútorná zem 0 V | ||
--> | |||
Ako zdroj referenčného napätia použijeme priamo napájacie napätie 5V oddelené tlmivkou a filtrované paralelným kondenzátorom 100n (pozri [https://store.arduino.cc/arduino-uno-rev3 interaktívnu schému zapojenia]). Zodpovedajúce bity REFS1, REFS0 v registri ADMUX sú teda 01. | |||
Ako zdroj referenčného napätia použijeme priamo napájacie napätie 5V oddelené tlmivkou a filtrované paralelným kondenzátorom 100n. Zodpovedajúce bity REFS1, REFS0 v registri ADMUX sú teda 01. | |||
Zdroj hodinového signálu pre A/D prevodník musí byť v rozsahu 50 až 200 kHz! | Zdroj hodinového signálu pre A/D prevodník musí byť v rozsahu 50 až 200 kHz! | ||
Príklad najjednoduchšieho SW ovládaného A/D prevodu je uvedená v tomto príklade - pozri [[AVR A/D example.c]] | Príklad najjednoduchšieho SW ovládaného A/D prevodu je uvedená v tomto príklade - pozri [[AVR A/D example.c]] | ||
<BR><BR> | |||
<FONT Color = "red">'''Poznámka k výpočtu:'''</FONT> ak chcete naozaj prepočítavať AD hodnotu na napätie, nezaobídete sa bez reálnych čísiel typu float, resp. double. Neodporúčame to, pretože tým neúmerne narastie veľkosť kódu, ale ak to naozaj potrebujete, prečítajte si návod, ako upozorniť kompilátor, že chcete prilinkovať aj knižnicu pre prácu s reálnymi číslami: [[Typy premenných v avr-gcc]]. | |||
<BR><BR> | |||
<BR><BR> | |||
=== Software === | |||
Ukážkový program pre prevod napätia na číslo pomocou zabudovaného A/D prevodníka. Obslužné funkcie sú deklarované v knižnici, definície si doplňte sami z prednášky. | |||
<tabs> | |||
<tab name="AVR C-code"><source lang="c++" style="background: LightYellow;"> | |||
#include <avr/io.h> | |||
#include "adc.h" | |||
int main(void) | |||
{ | |||
unsigned int measuredValue; | |||
adc_init(); // Init A/D converter | |||
while (1) | |||
{ | |||
measuredValue = adc_read(0); | |||
/* tu s nou nieco spravime, napr. na LCD, UART,... */ | |||
} | |||
return(0); | |||
} | |||
</source></tab> | |||
<tab name="adc.h"><source lang="c++" style="background: LightYellow;"> | |||
#include <avr/io.h> | |||
void adc_init(void); // A/D converter initialization | |||
unsigned int adc_read(char a_pin); | |||
</source></tab> | |||
<tab name="adc.c"><source lang="c++" style="background: LightYellow;"> | |||
#include <avr/io.h> | |||
... zvysok najdete v prednaske ... | |||
</source></tab> | |||
<tab name="Arduino code"><source lang="arduino" style="background: #9dd1e1;"> | |||
#define aPin A0 | |||
int sensorValue = 0; // analog value | |||
void setup() | |||
{ | |||
Serial.begin(9600); | |||
} | |||
void loop() { | |||
sensorValue = analogRead(aPin); // sample signal | |||
Serial.println(sensorValue); | |||
delay(100); | |||
} | |||
</source></tab> | |||
</tabs> | |||
=== Vizualizácia === | === Vizualizácia === | ||
Riadok 51: | Riadok 132: | ||
maticu do Matlabu a tam nakresliť graf, priebeh, čo treba... | maticu do Matlabu a tam nakresliť graf, priebeh, čo treba... | ||
Iná možnosť je použiť napr. program | Iná možnosť je použiť napr. program SerialPlot, ktorý kreslí prichádzajúce data | ||
priamo ako graf. | priamo ako graf. | ||
Download: [ | Download: [https://serialplot.ozderya.net/downloads/serialplot-0.11.0-win32.exe SerialPlot 0.11.0] | ||
<!-- | <!-- | ||
Riadok 65: | Riadok 146: | ||
Príklad: [[AVR StampPlotExample.c]] | Príklad: [[AVR StampPlotExample.c]] | ||
Manual: [[Stamp Plot Manual]] | Manual: [[Stamp Plot Manual]] | ||
Alebo SerialChart Download: [http://code.google.com/p/serialchart/ SerialChart 1.0] | |||
--> | |||
Riadok 81: | Riadok 158: | ||
[[Obrázok:Icon_Terminal.png]] [http://braypp.googlepages.com/Terminal20080315.zip Terminal 1.9b] | [[Obrázok:Icon_Terminal.png]] [http://braypp.googlepages.com/Terminal20080315.zip Terminal 1.9b] | ||
[[ | [[Súbor:IconSerialPlotter.png|40px]] [https://hackaday.io/project/5334-serialplot-realtime-plotting-software Serial Plot 0.11.0] | ||
<!-- | <!-- | ||
[[Obrázok:Icon_SerialChart.png]] [http://code.google.com/p/serialchart/ SerialChart 1.0] | |||
[[Obrázok:Icon_StampPlotLite.png]] [http://www.parallax.com/Portals/0/Downloads/sw/spl.zip StampPlot Lite 1.7] | [[Obrázok:Icon_StampPlotLite.png]] [http://www.parallax.com/Portals/0/Downloads/sw/spl.zip StampPlot Lite 1.7] | ||
--> | --> | ||
Literatúra: | |||
* [http://www.atmel.com/dyn/resources/prod_documents/DOC2559.PDF AVR120: Characterization and Calibration of the ADC on an AVR] | |||
* [http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=56429 Newbie's Guide to AVR A/D Converter] | |||
* [https://www.arnabkumardas.com/arduino-tutorial/adc-concept/ Základná terminológia týkajúca sa ADC] | |||
'''TODO: prerobit na verziu 2022:''' | |||
* prekontrolovat, ci je vsetko platne a pridat nieco z tohoto: | |||
* pridat obsluhu cez prerusenie | |||
* sampling - pridat timer a vzorkovat v presnych casoch | |||
* pridat Moving Average odtialto https://stackoverflow.com/questions/28820904/how-to-efficiently-compute-average-on-the-fly-moving-average aj s vyuzitim delenia 4,16 a pod. cez >> | |||
Riadok 91: | Riadok 183: | ||
[[Mikropočítačové systémy (MIPS)#Cvičenia|Návrat na zoznam cvičení...]] | |||
[[Category:AVR]][[Category:MMP]][[Category:DVPS]] | [[Category:AVR]][[Category:MIPS]][[Category:MMP]][[Category:DVPS]] |
Aktuálna revízia z 07:54, 14. apríl 2022
A/D prevodník
Úlohy
- Zapojte si na doštičke potenciometer s vývodom na niektorý z analógových vstupov. Môžete tiež vyskúšať fotorezistor, alebo termistor.
- Doplňte program o jednoduchý A/D prevod a zobrazte hodnotu z potenciometra na sériovom termináli (a príp. aj na LCD displej).
- Zistite, čo sa stane, ak budete merať nezapojený vstup ("zo vzduchu").
- Oboznámte sa s programom SerialPlot a zobrazte časový priebeh nameranej veličiny.
- Napokon pomocou potenciometra ovládajte intenzitu svitu niektorej LED diódy.
Rekapitulácia
V tejto úlohe sa predpokladá znalosť funkcie A/D prevodníka z prednášky. Na posledných dvoch slajdoch máte pripravené funkcie na inicializáciu a načítanie výsledku prevodu. Preto sa v tomto návode nebudeme zaoberať týmito funkciami.
Hardware
Ako vstup do A/D prevodníka môžete použiť niektorý zo štyroch uvedených príkladov:
- obyčajný odporový delič, ktorým môžeme detekovať napríklad pokles napätia napájacej batérie
- potenciometer alebo trimer, ktorý máte v MISP kite
- fotorezistor, ale ten slúži len na orientačné merania, pretože nemáme referenčný zdroj osvetlenia
- termistor, ktorý tiež vieme využiť len orientačne, hoci k nemu by sme vedeli vypočítať teplotu podľa datasheetu (pozri tiež Stienhart-Hartovu rovnicu).
Schéma pripojenia vstupov k A/D prevodníku. Ak vám nepomôže, použite zapojovací diagram
A/D prevodník
Pre nameranú hodnotu N platí vzťah
Ako zdroj referenčného napätia použijeme priamo napájacie napätie 5V oddelené tlmivkou a filtrované paralelným kondenzátorom 100n (pozri interaktívnu schému zapojenia). Zodpovedajúce bity REFS1, REFS0 v registri ADMUX sú teda 01.
Zdroj hodinového signálu pre A/D prevodník musí byť v rozsahu 50 až 200 kHz!
Príklad najjednoduchšieho SW ovládaného A/D prevodu je uvedená v tomto príklade - pozri AVR A/D example.c
Poznámka k výpočtu: ak chcete naozaj prepočítavať AD hodnotu na napätie, nezaobídete sa bez reálnych čísiel typu float, resp. double. Neodporúčame to, pretože tým neúmerne narastie veľkosť kódu, ale ak to naozaj potrebujete, prečítajte si návod, ako upozorniť kompilátor, že chcete prilinkovať aj knižnicu pre prácu s reálnymi číslami: Typy premenných v avr-gcc.
Software
Ukážkový program pre prevod napätia na číslo pomocou zabudovaného A/D prevodníka. Obslužné funkcie sú deklarované v knižnici, definície si doplňte sami z prednášky.
#include <avr/io.h>
#include "adc.h"
int main(void)
{
unsigned int measuredValue;
adc_init(); // Init A/D converter
while (1)
{
measuredValue = adc_read(0);
/* tu s nou nieco spravime, napr. na LCD, UART,... */
}
return(0);
}
#include <avr/io.h>
void adc_init(void); // A/D converter initialization
unsigned int adc_read(char a_pin);
#include <avr/io.h>
... zvysok najdete v prednaske ...
#define aPin A0
int sensorValue = 0; // analog value
void setup()
{
Serial.begin(9600);
}
void loop() {
sensorValue = analogRead(aPin); // sample signal
Serial.println(sensorValue);
delay(100);
}
Vizualizácia
Vizualizáciu dát môžeme robiť rozlične. Jeden z možných spôsobov je vypisovať po sériovej linke v pravidelných intervaloch holé data a tie potom uložiť ako maticu do Matlabu a tam nakresliť graf, priebeh, čo treba...
Iná možnosť je použiť napr. program SerialPlot, ktorý kreslí prichádzajúce data priamo ako graf.
Download: SerialPlot 0.11.0
Download
Literatúra:
- AVR120: Characterization and Calibration of the ADC on an AVR
- Newbie's Guide to AVR A/D Converter
- Základná terminológia týkajúca sa ADC
TODO: prerobit na verziu 2022:
- prekontrolovat, ci je vsetko platne a pridat nieco z tohoto:
- pridat obsluhu cez prerusenie
- sampling - pridat timer a vzorkovat v presnych casoch
- pridat Moving Average odtialto https://stackoverflow.com/questions/28820904/how-to-efficiently-compute-average-on-the-fly-moving-average aj s vyuzitim delenia 4,16 a pod. cez >>