Operácie

MEMS meranie s A/D prevodníkom: Rozdiel medzi revíziami

Zo stránky SensorWiki

Balogh (diskusia | príspevky)
Balogh (diskusia | príspevky)
dBez shrnutí editace
Riadok 47: Riadok 47:


Funkcia <tt>analogRead()</tt> zavolá A/D prevodník integrovaný na čipe, ktorý prevedie vstupné napätie v rozsahu 0 - 5 V na celé číslo v rozsahu 0 - 1023 (zodpovedajúce 10-bitovému prevodníku).
Funkcia <tt>analogRead()</tt> zavolá A/D prevodník integrovaný na čipe, ktorý prevedie vstupné napätie v rozsahu 0 - 5 V na celé číslo v rozsahu 0 - 1023 (zodpovedajúce 10-bitovému prevodníku).
Ak chceme zobraziť hodnotu napätia a nie číslo z prevodníka, zmeníme kód na riadku ?? napr. nasledovne:
Ak chceme zobraziť hodnotu napätia a nie číslo z prevodníka, zmeníme kód na riadku 15 napr. nasledovne:


   outputValue = adcValue * 5 / 1023;
   outputValue = adcValue * 5 / 1023;
Riadok 94: Riadok 94:


</syntaxhighlight>
</syntaxhighlight>
== Linearizácia prevodovej charakteristiky ==
=== 1. Look-up table ===
<source lang="cpp">
#include <avr/pgmspace.h>
const PROGMEM int table[] = {11,12,15,...};
return( table[adcValue] );
</source>
Viac info tu: https://www.arduino.cc/en/Reference/PROGMEM
=== 2. Po častiach lineárna náhrada ===
<source lang="cpp">
  /* segment 1 */
if (adcValue > x0) && (adcValue <= x1)
  y = k1 * adcValue + q1;
  /* segment 2 */
if (adcValue > x1) && (adcValue <= x2)
  y = k2 * adcValue + q2;
return(y)
</source>
Dá sa použiť aj funkcia map v Arduine -  https://www.arduino.cc/reference/en/language/functions/math/map/
=== 3. Aproximácia funkcie ===
<source lang="cpp">
  y = a2 * adcValue^2 + a1 * adcValue + a0;
  return(y);
</source>
* http://terpconnect.umd.edu/~toh/spectrum/CurveFitting.html
* https://www.gnu.org/software/octave/doc/interpreter/Polynomial-Interpolation.html
* http://octave.sourceforge.net/optim/function/leasqr.html
* http://octave.sourceforge.net/optim/function/expfit.html
* https://www.gnu.org/software/gsl/manual/html_node/Example-programs-for-Nonlinear-Least_002dSquares-Fitting.html
* https://www.gnu.org/software/octave/doc/interpreter/One_002ddimensional-Interpolation.html#One_002ddimensional-Interpolation




Riadok 169: Riadok 118:
Deadline: <FONT COlor="red">'''8. 3. 2022 '''</font>
Deadline: <FONT COlor="red">'''8. 3. 2022 '''</font>


* Tools: https://inkscape.org/sk/~sincoon/%E2%98%85knob-scale-generator


[[MEMS inteligentné senzory a aktuátory#Cvi.C4.8Denia|Návrat na zoznam cvičení...]]
[[MEMS inteligentné senzory a aktuátory#Cvi.C4.8Denia|Návrat na zoznam cvičení...]]


[[Category:MEMS]]
[[Category:MEMS]]

Verzia z 10:41, 23. február 2025

Note: v 2025

Potenciometrické snímače

  1. Poskladajte si odporový senzor polohy so stupnicou (ak nemáte, použite senzor v TinkerCADe).
  2. Zmerajte prevodovú charakteristiku odporového senzora polohy pomocou ohmmetra (cvičenie 1).
  3. Senzor pripojte k A/D prevodníku mikropočítača a pomocou programu nižšie zmerajte prevodovú charakteristiku celého meracieho člena.
  4. Prevodovú charakteristiku zlinearizujte a doložte úspešnosť porovnaním metrologických parametrov.


Schéma zapojenia
Schéma zapojenia
Postupnosť prevodov


Meranie charakteristiky senzora mikroprocesorom s A/D prevodníkom

Azda najjednoduchší program na meranie je tento

#define mySensor 4                  // 4: potenciometer

  int adcValue;
float outputValue;

void setup()
{                              
 Serial.begin(57600);               // typicke rychlosti su  9600 alebo 57600
}
 
void loop()
{
  adcValue = analogRead(mySensor);  // read ADC value
  
  outputValue = adcValue;           // information processing (if necessary)
  
  Serial.println(outputValue);      // prints result over serial

 delay(500);                        // delay in milliseconds
}

Funkcia analogRead() zavolá A/D prevodník integrovaný na čipe, ktorý prevedie vstupné napätie v rozsahu 0 - 5 V na celé číslo v rozsahu 0 - 1023 (zodpovedajúce 10-bitovému prevodníku). Ak chceme zobraziť hodnotu napätia a nie číslo z prevodníka, zmeníme kód na riadku 15 napr. nasledovne:

 outputValue = adcValue * 5 / 1023;

Funkcia Serial.println() potom vyšle výsledné číslo po sériovej linke do PC, kde si ich odchytíme v terminálovom okne. Pozor, prenosová rýchlosť v termináli musí byť zhodná s tou, ktorú sme nastavili funkciou Serial.begin, t.j. 57 600 Baud.

Uvedený kód môžeme ďalej vylepšovať - napríklad odstránime časť šumu na vstupe tak, že meranie spravíme viackrát a spriemerujeme. Napríklad takto:


  /* odmeraj N hodnot a vypocitaj priemer */
  sensorValue = 0;
    for ( int i=1; i<=64; i++) 
      sensorValue += analogRead(A4);
  sensorValue = sensorValue / 64;

Hint: viete, prečo je lepšie počítať priemer zo 16, 32 alebo 64 hodnôt a nie z 10 alebo 100?

Ďalšie zlepšenie by mohlo byť pridanie indikácie pripravenosti na meranie LED diódou a spustenie samotného merania tlačidlom (je pripojené na A5, resp. D19)

/* Zadefinovanie tlacitka */
#define PUSHBUTTON 19


/* Do casti setup() treba pridat konfiguraciu a uvodny vypis */
  
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(PUSHBUTTON, INPUT);

  Serial.println("*** MISA measurement (press Red PB to start): ***\n\n");


/* Do casti loop(), ktora sa opakuje pridame indikaciu LED a cakanie na tlacitko */

  digitalWrite(LED_BUILTIN,HIGH);            // Led ON = Ready

  while ( digitalRead(PUSHBUTTON)== 1)       // Wait for press
        {    /* just wait here */    }
  
  digitalWrite(LED_BUITLIN,LOW);             // Led OFF = Measuring...

  /* a tu uz nasleduje meranie a odoslanie hodnoty */


Úlohy

Úlohy, ktoré treba odovzdať:

  • Graf 1: prevodové charakteristiky
  • Chyby podľa EN 60 770
    • Nepresnosť
    • Meraná chyba
    • Nelinearita
    • Hysteréza
    • Neopakovateľnosť
  • Graf 2: chybové krivky (viď obr.)
  • Program pre mikroprocesor na linearizáciu
  • Porovnať namerané výsledky s predošlými

Hodnotenie: 5 bodov

Deadline: 8. 3. 2022


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