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)
Riadok 23: Riadok 23:
Azda najjednoduchší program na meranie je tento
Azda najjednoduchší program na meranie je tento


<syntaxhighlight lang="arduino">
<syntaxhighlight lang="arduino" line>
#define mySensor 4           // 4: potenciometer
#define mySensor 4                 // 4: potenciometer


   int adcValue;
   int adcValue;
Riadok 31: Riadok 31:
void setup()
void setup()
{                               
{                               
  Serial.begin(9600);           // typicke rychlosti su 9600 alebo 115200
  Serial.begin(57600);               // typicke rychlosti su 9600 alebo 57600
}
}
   
   
Riadok 46: Riadok 46:
</syntaxhighlight>
</syntaxhighlight>


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).
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 ?? napr. nasledovne:


   outputValue = adcValue * 5 / 1023;
   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ú
Funkcia <tt>Serial.println()</tt> 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. ???? Baud.
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:
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:

Verzia z 10:31, 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(100);                        // 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 ?? 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 */

Linearizácia prevodovej charakteristiky

1. Look-up table

 #include <avr/pgmspace.h>

 const PROGMEM int table[] = {11,12,15,...};
 
 return( table[adcValue] );

Viac info tu: https://www.arduino.cc/en/Reference/PROGMEM

2. Po častiach lineárna náhrada

  /* segment 1 */
 if (adcValue > x0) && (adcValue <= x1)
   y = k1 * adcValue + q1;

  /* segment 2 */
if (adcValue > x1) && (adcValue <= x2)
   y = k2 * adcValue + q2;

 return(y)

Dá sa použiť aj funkcia map v Arduine - https://www.arduino.cc/reference/en/language/functions/math/map/

3. Aproximácia funkcie

   y = a2 * adcValue^2 + a1 * adcValue + a0;
   return(y);




Ú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í...