Operácie

A/D prevodník: Rozdiel medzi revíziami

Zo stránky SensorWiki

Balogh (diskusia | príspevky)
Balogh (diskusia | príspevky)
dBez shrnutí editace
 
(2 medziľahlé úpravy od rovnakého používateľa nie sú zobrazené.)
Riadok 7: Riadok 7:
# Zistite, čo sa stane, ak budete merať nezapojený vstup ("zo vzduchu").
# Zistite, čo sa stane, ak budete merať nezapojený vstup ("zo vzduchu").
# Oboznámte sa s programom SerialPlot a zobrazte časový priebeh nameranej veličiny.
# Oboznámte sa s programom SerialPlot a zobrazte časový priebeh nameranej veličiny.
# Napokon pomocou potenciometra ovládajte intenzitu svitu niektorej LED diódy.
# Napokon pomocou potenciometra ovládajte intenzitu svitu niektorej LED diódy alebo polohu servomotorčeka.
 


=== Rekapitulácia ===
=== Rekapitulácia ===
Riadok 62: Riadok 63:


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>
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]].
<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 ===
=== Software ===
Riadok 70: Riadok 73:


<tabs>
<tabs>
<tab name="AVR C-code"><source lang="c++" style="background: LightYellow;">
<tab name="AVR C-code"><syntaxhighlight lang="c++" style="background: LightYellow;">
#include <avr/io.h>
#include <avr/io.h>
#include "adc.h"
#include "adc.h"
Riadok 91: Riadok 94:




</source></tab>
</syntaxhighlight></tab>
<tab name="adc.h"><source lang="c++" style="background: LightYellow;">
<tab name="adc.h"><syntaxhighlight lang="c++" style="background: LightYellow;">
#include <avr/io.h>
#include <avr/io.h>


Riadok 98: Riadok 101:


unsigned int adc_read(char a_pin);
unsigned int adc_read(char a_pin);
</source></tab>
</syntaxhighlight></tab>
<tab name="adc.c"><source lang="c++" style="background: LightYellow;">
<tab name="adc.c"><syntaxhighlight lang="c++" style="background: LightYellow;">
#include <avr/io.h>
#include <avr/io.h>


... zvysok najdete v prednaske ...
... zvysok najdete v prednaske ...


</source></tab>
</syntaxhighlight></tab>
<tab name="Arduino code"><source lang="arduino" style="background: #9dd1e1;">
<tab name="Arduino code"><syntaxhighlight lang="arduino" style="background: #9dd1e1;">


#define aPin A0
#define aPin A0
Riadok 121: Riadok 124:
   delay(100);
   delay(100);
}
}
</source></tab>
</syntaxhighlight></tab>
</tabs>
</tabs>



Aktuálna revízia z 09:28, 7. apríl 2025

A/D prevodník

Úlohy

  1. 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.
  2. 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).
  3. Zistite, čo sa stane, ak budete merať nezapojený vstup ("zo vzduchu").
  4. Oboznámte sa s programom SerialPlot a zobrazte časový priebeh nameranej veličiny.
  5. Napokon pomocou potenciometra ovládajte intenzitu svitu niektorej LED diódy alebo polohu servomotorčeka.


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

Terminal 1.9b

Serial Plot 0.11.0


Literatúra:


TODO: prerobit na verziu 2022:



Návrat na zoznam cvičení...