Operácie

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

Zo stránky SensorWiki

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


<source lang="cpp">
<source lang="cpp">
#define mySensor 0           // 0: potenciometer
#define mySensor 4           // 4: potenciometer
                              // 3: senzor sily
                              // 5: senzor ohybu


int adcValue;
  int adcValue;
float outputValue;
float outputValue;


void setup()
void setup()
{                              // monitor sa otvara dole vpravo
{                               
  Serial.begin(9600);          // typicke rychlosti su 9600 alebo 115200
  Serial.begin(9600);          // typicke rychlosti su 9600 alebo 115200
}
}
Riadok 38: Riadok 36:
void loop()
void loop()
{
{
   adcValue = analogRead(mySensor); // read ADC value
   adcValue = analogRead(mySensor); // read ADC value
    
    
   outputValue = adcValue;
   outputValue = adcValue;           // information processing (if necessary)
    
    
   Serial.println(outputValue);       // prints value over serial
   Serial.println(outputValue);     // prints result over serial
 
delay(100);                      // delay in milliseconds


delay(100);                        // delay in milliseconds
}
}
</source>
</source>
Riadok 57: Riadok 54:
sme nastavili funkciou Serial.begin, t.j. ???? Baud.
sme nastavili funkciou Serial.begin, t.j. ???? 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:


Lepší kód na poloautomatické meranie


<source lang="cpp">
<highlight lang="cpp">
  /* odmeraj N hodnot a vypocitaj priemer */
  sensorValue = 0;
    for ( int i=1; i<=64; i++)
      sensorValue += analogRead(A4);
  sensorValue = sensorValue / 64;
</highlight>
 
Hint: viete, prečo je lepšie počítať priemer zo 16, 32 alebo 64 hodnôt a nie z 10 alebo 100?


// Meranie na potenciometrickej doske v.2024
Ď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)
// Tlacitko je na A5 a zapiseme nim meranie
// Potenciometer je na A4 a da sa citat 0/1023
//  pricom ak zmenim prepinacom charakteristiku, tak
//  tym ze je to napatovy delic, funguje stale rovnako


unsigned long int sensorValue;
<highlight lang="cpp">
unsigned      int counter;


void setup()  
void setup()  
{
{
   Serial.begin(115200);
   ...
    
    
   pinMode(LED_BUILTIN, OUTPUT);
   pinMode(LED_BUILTIN, OUTPUT);
Riadok 85: Riadok 85:
void loop()  
void loop()  
{
{
   digitalWrite(13,HIGH); // Led ON = Ready
   digitalWrite(LED_BUILTIN,HIGH);           // Led ON = Ready
   while ( digitalRead(19)== 1)  
 
    {/* wait here */}
   while ( digitalRead(PUSHBUTTON)== 1)       // Wait for press
        {   /* just wait here */   }
    
    
   digitalWrite(13,LOW); // Led OFF = Measuring...
   digitalWrite(LED_BUITLIN,LOW);             // Led OFF = Measuring...
 
  /* odmeraj hodnotu a posli */


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


  Serial.print(counter++);
  Serial.print(",");
  Serial.println(sensorValue);
 
   delay(500);        // delay in between reads for stability
   delay(500);        // delay in between reads for stability
 
}
}


 
</highlight>
</source>


== Linearizácia prevodovej charakteristiky ==
== Linearizácia prevodovej charakteristiky ==

Verzia z 10:19, 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(9600);           // typicke rychlosti su 9600 alebo 115200
}
 
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. ???? 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:


<highlight lang="cpp">

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

</highlight>

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)

<highlight lang="cpp">

void setup() {

 ...
 
 pinMode(LED_BUILTIN, OUTPUT);
 pinMode(18, INPUT);
 pinMode(19, INPUT);
 Serial.println("*** MISA measurement (press Red PB to start): ***\n\n");
 counter = 1;

}

void loop() {

 digitalWrite(LED_BUILTIN,HIGH);            // Led ON = Ready
 while ( digitalRead(PUSHBUTTON)== 1)       // Wait for press
       {    /* just wait here */    }
 
 digitalWrite(LED_BUITLIN,LOW);             // Led OFF = Measuring...
 /* odmeraj hodnotu a posli */
 ....
 delay(500);        // delay in between reads for stability

}

</highlight>

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