Operácie

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

Zo stránky SensorWiki

Balogh (diskusia | príspevky)
Vytvorená stránka „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ú charakter…“
 
Balogh (diskusia | príspevky)
dBez shrnutí editace
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
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 ==
== Potenciometrické snímače ==


Riadok 18: Riadok 9:
[[Súbor:MEMS02-SchemaZapojenia21.png|300px|thumb|center|Schéma zapojenia]]
[[Súbor:MEMS02-SchemaZapojenia21.png|300px|thumb|center|Schéma zapojenia]]


<!-- [[Súbor:MEMS02-SchemaZapojenia.png|300px|thumb|center|Schéma zapojenia]] -->
[[Súbor:MEMS02-SchemaZapojenia.png|300px|thumb|center|Schéma zapojenia]]


* Príklad na pripojenie analógového senzora: http://senzor.robotika.sk/sensorwiki/index.php/Acrob007
* Príklad na pripojenie analógového senzora: http://senzor.robotika.sk/sensorwiki/index.php/Acrob007
* Arduino homepage https://www.arduino.cc/
* Arduino homepage https://www.arduino.cc/
Na pridanie do TinkerCAD triedy (classroom) použite [https://www.tinkercad.com/joinclass/B5ZT5MYJJNZP tento link]. Ak od vás program pýta vstupný kód, je to B5ZT5MYJJNZP




<html>
== Meranie charakteristiky senzora mikroprocesorom s A/D prevodníkom ==
<iframe width="725" height="453" src="https://www.tinkercad.com/embed/6Pg8q4b7Kst?editbtn=1" frameborder="0" marginwidth="0" marginheight="0" scrolling="no"></iframe>
</html>
 
Ak sa vám nezobrazuje vložený simulátor správne, použite prosím, [https://www.tinkercad.com/things/6Pg8q4b7Kst tento link].
<!-- Note to self: generovane linky z TinkerCADu expiruju po 336 hodinach - 14 dni -->


Azda najjednoduchší program na meranie je tento


<source lang="cpp">
<source lang="cpp">
Riadok 60: Riadok 44:
}
}
</source>
</source>
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.





Verzia z 09:56, 23. február 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


Meranie charakteristiky senzora mikroprocesorom s A/D prevodníkom

Azda najjednoduchší program na meranie je tento

#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

}

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.


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);




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