MEMS meranie s A/D prevodníkom: Rozdiel medzi revíziami
Zo stránky SensorWiki
dBez shrnutí editace |
|||
Riadok 24: | Riadok 24: | ||
<source lang="cpp"> | <source lang="cpp"> | ||
#define mySensor | #define mySensor 4 // 4: potenciometer | ||
int adcValue; | int adcValue; | ||
float outputValue; | float outputValue; | ||
void setup() | void setup() | ||
{ | { | ||
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); | Serial.println(outputValue); // prints result over serial | ||
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: | |||
< | <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() | void setup() | ||
{ | { | ||
... | |||
pinMode(LED_BUILTIN, OUTPUT); | pinMode(LED_BUILTIN, OUTPUT); | ||
Riadok 85: | Riadok 85: | ||
void loop() | void loop() | ||
{ | { | ||
digitalWrite( | digitalWrite(LED_BUILTIN,HIGH); // Led ON = Ready | ||
while ( digitalRead( | |||
while ( digitalRead(PUSHBUTTON)== 1) // Wait for press | |||
{ /* just wait here */ } | |||
digitalWrite( | digitalWrite(LED_BUITLIN,LOW); // Led OFF = Measuring... | ||
/* odmeraj hodnotu a posli */ | |||
.... | |||
delay(500); // delay in between reads for stability | delay(500); // delay in between reads for stability | ||
} | } | ||
</highlight> | |||
</ | |||
== Linearizácia prevodovej charakteristiky == | == Linearizácia prevodovej charakteristiky == |
Verzia z 10:19, 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(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);
- 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