A/D prevodník: Rozdiel medzi revíziami
Z SensorWiki
(→A/D prevodník) |
|||
(22 medziľahlých úprav od rovnakého používateľa nie je zobrazených.) | |||
Riadok 1: | Riadok 1: | ||
== A/D prevodník == | == 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 === | === Rekapitulácia === | ||
+ | |||
+ | <!-- | ||
Máte k dispozícii vývojovú dosku '''Acrob''' s procesorom ATmega328 ([http://ap.urpi.fei.stuba.sk/mmp/ATmega328.pdf datasheet]). | 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 | + | 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 25: | 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 34: | 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]] | ||
+ | |||
+ | |||
+ | === 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 48: | Riadok 129: | ||
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 SerialPlot, ktorý kreslí prichádzajúce data | ||
+ | priamo ako graf. | ||
+ | |||
+ | Download: [https://serialplot.ozderya.net/downloads/serialplot-0.11.0-win32.exe SerialPlot 0.11.0] | ||
+ | |||
+ | <!-- | ||
Iná možnosť je použiť napr. program StampPlot, ktorý kreslí prichádzajúce data | Iná možnosť je použiť napr. program StampPlot, ktorý kreslí prichádzajúce data | ||
priamo ako graf, s výnimkou reťazcov, ktoré začínajú znakom '!', tie považuje za | priamo ako graf, s výnimkou reťazcov, ktoré začínajú znakom '!', tie považuje za | ||
Riadok 58: | Riadok 145: | ||
+ | Alebo SerialChart Download: [http://code.google.com/p/serialchart/ SerialChart 1.0] | ||
− | + | --> | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
Riadok 74: | Riadok 155: | ||
[[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 80: | Riadok 180: | ||
+ | [[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]] |
Verzia zo dňa a času 12:07, 15. apríl 2021
Obsah
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
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 >>