MEMS cvičenie 2: Rozdiel medzi revíziami
Zo stránky SensorWiki
dBez shrnutí editace |
|||
(3 medziľahlé úpravy od rovnakého používateľa nie sú zobrazené.) | |||
Riadok 1: | Riadok 1: | ||
Poznamky 2020: https://www.qsl.net/om3cph/sw/pot.html https://electronics.stackexchange.com/questions/231522/improving-the-linearity-of-a-potentiometer-after-loading | Poznamky 2020: https://www.qsl.net/om3cph/sw/pot.html https://electronics.stackexchange.com/questions/231522/improving-the-linearity-of-a-potentiometer-after-loading | ||
http://www.geofex.com/article_folders/potsecrets/potscret.htm | http://www.geofex.com/article_folders/potsecrets/potscret.htm | ||
-- | |||
Poznamky 2022: https://stackoverflow.com/questions/7091294/how-to-build-a-lookup-table-in-c-sdcc-compiler-with-linear-interpolation | |||
Na tomto cvičení je cieľom pripojiť odporový senzor k Arduinu a vylepšiť jeho prevodovú charakteristiku vybranou metódou a zlinearizovanú hodnotu zobraziť | Na tomto cvičení je cieľom pripojiť odporový senzor k Arduinu a vylepšiť jeho prevodovú charakteristiku vybranou metódou a zlinearizovanú hodnotu zobraziť | ||
Riadok 54: | Riadok 54: | ||
outputValue = adcValue; | outputValue = adcValue; | ||
Serial.println( | Serial.println(outputValue); // prints value over serial | ||
delay(100); // delay in milliseconds | delay(100); // delay in milliseconds | ||
Riadok 61: | Riadok 61: | ||
</source> | </source> | ||
Lepší kód na poloautomatické meranie | |||
<source lang="cpp"> | |||
// Meranie na potenciometrickej doske v.2024 | |||
// 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; | |||
unsigned int counter; | |||
void setup() | |||
{ | |||
Serial.begin(115200); | |||
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(13,HIGH); // Led ON = Ready | |||
while ( digitalRead(19)== 1) | |||
{/* wait here */} | |||
digitalWrite(13,LOW); // Led OFF = Measuring... | |||
/* 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 | |||
} | |||
</source> | |||
== Linearizácia prevodovej charakteristiky == | == Linearizácia prevodovej charakteristiky == | ||
Riadok 128: | Riadok 178: | ||
* Graf 2: chybové krivky (viď obr.) | * Graf 2: chybové krivky (viď obr.) | ||
* Program pre mikroprocesor na linearizáciu | * Program pre mikroprocesor na linearizáciu | ||
* Porovnať namerané výsledky s predošlými | |||
[[Súbor:Example2-1.png|500px]] | [[Súbor:Example2-1.png|500px]] |
Aktuálna revízia z 09:01, 21. február 2025
Poznamky 2020: https://www.qsl.net/om3cph/sw/pot.html https://electronics.stackexchange.com/questions/231522/improving-the-linearity-of-a-potentiometer-after-loading http://www.geofex.com/article_folders/potsecrets/potscret.htm
Poznamky 2022: https://stackoverflow.com/questions/7091294/how-to-build-a-lookup-table-in-c-sdcc-compiler-with-linear-interpolation
Na tomto cvičení je cieľom pripojiť odporový senzor k Arduinu a vylepšiť jeho prevodovú charakteristiku vybranou metódou a zlinearizovanú hodnotu zobraziť na nejakom miestnom displeji (LED, LCD a pod.) prípadne ju odoslať po sériovej linke do PC (v simulátore TinkerCAD).
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/
Na pridanie do TinkerCAD triedy (classroom) použite tento link. Ak od vás program pýta vstupný kód, je to B5ZT5MYJJNZP
Ak sa vám nezobrazuje vložený simulátor správne, použite prosím, tento link.
#define mySensor 0 // 0: potenciometer
// 3: senzor sily
// 5: senzor ohybu
int adcValue;
float outputValue;
void setup()
{ // monitor sa otvara dole vpravo
Serial.begin(9600); // typicke rychlosti su 9600 alebo 115200
}
void loop()
{
adcValue = analogRead(mySensor); // read ADC value
outputValue = adcValue;
Serial.println(outputValue); // prints value over serial
delay(100); // delay in milliseconds
}
Lepší kód na poloautomatické meranie
// Meranie na potenciometrickej doske v.2024
// 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;
unsigned int counter;
void setup()
{
Serial.begin(115200);
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(13,HIGH); // Led ON = Ready
while ( digitalRead(19)== 1)
{/* wait here */}
digitalWrite(13,LOW); // Led OFF = Measuring...
/* 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
}
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