MEMS meranie s A/D prevodníkom: Rozdiel medzi revíziami
Zo stránky SensorWiki
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 | #define mySensor 4 // 4: potenciometer | ||
int adcValue; | int adcValue; | ||
Riadok 31: | Riadok 31: | ||
void setup() | void setup() | ||
{ | { | ||
Serial.begin( | 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. | 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
- Poskladajte si odporový senzor polohy so stupnicou (ak nemáte, použite senzor v TinkerCADe).
- Zmerajte prevodovú charakteristiku odporového senzora polohy pomocou ohmmetra (cvičenie 1).
- Senzor pripojte k A/D prevodníku mikropočítača a pomocou programu nižšie zmerajte prevodovú charakteristiku celého meracieho člena.
- Prevodovú charakteristiku zlinearizujte a doložte úspešnosť porovnaním metrologických parametrov.



- Príklad na pripojenie analógového senzora: http://senzor.robotika.sk/sensorwiki/index.php/Acrob007
- Arduino homepage https://www.arduino.cc/
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);
- 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
Ú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