Operácie

MEMS cvičenie 2: Rozdiel medzi revíziami

Z SensorWiki

(1. Look-up table)
 
(41 medziľahlých úprav od rovnakého používateľa nie je zobrazených.)
Riadok 1: Riadok 1:
* Návod na cvičenia:  
+
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).
  
  
* Príklad na pripojenie analógového senzora: http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob007
+
== Potenciometrické snímače ==
* Riadiaca doska Acrob http://ap.urpi.fei.stuba.sk/sensorwiki/index.php/Acrob
+
 
 +
# 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.
 +
 
 +
 
 +
[[Súbor:MEMS02-SchemaZapojenia21.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
 
* 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>
 +
<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 -->
 +
  
 
<source lang="cpp">
 
<source lang="cpp">
#define SerialSpeed 9600  //typical values are 9600 or 115200
+
#define mySensor 0            // 0: potenciometer
#define SampFrequency 10  //sampling frequency in Hz (cycles per second)
+
                              // 3: senzor sily
#define positionSensor 5        //define your pin here
+
                              // 5: senzor ohybu
+
 
int mDelay;
 
 
int adcValue;
 
int adcValue;
 
float outputValue;
 
float outputValue;
  
 
void setup()
 
void setup()
{
+
{                             // monitor sa otvara dole vpravo
  Serial.begin(SerialSpeed);
+
  Serial.begin(9600);           // typicke rychlosti su 9600 alebo 115200
mDelay = 1000/SampFrequency; //calculate delay for proper sampling rate
 
 
}
 
}
 
   
 
   
 
void loop()
 
void loop()
 
{
 
{
adcValue = analogRead(positionSensor);
+
  adcValue = analogRead(mySensor); // read ADC value
/*  =============================================== */
+
 
outputValue = adcValue;  // replace this line with your code
+
  outputValue = adcValue;
/*  =============================================== */
+
    
Serial.print( outputValue ); //reads the analog port and prints value over serial
+
  Serial.println(outputValue);       // prints value over serial
Serial.print('\n');
+
 
  delay(mDelay); //delay in milliseconds
+
  delay(100);                       // delay in milliseconds
  
 
}
 
}
Riadok 37: Riadok 62:
  
  
 +
== Linearizácia prevodovej charakteristiky ==
  
  
  
 
+
=== 1. Look-up table ===
== 1. Look-up table ==
 
  
  
Riadok 48: Riadok 73:
  
 
  const PROGMEM int table[] = {11,12,15,...};
 
  const PROGMEM int table[] = {11,12,15,...};
 +
 +
return( table[adcValue] );
 
</source>
 
</source>
  
 
Viac info tu: https://www.arduino.cc/en/Reference/PROGMEM
 
Viac info tu: https://www.arduino.cc/en/Reference/PROGMEM
  
 +
=== 2. Po častiach lineárna náhrada ===
  
== 2. Po častiach lineárna náhrada ==
+
<source lang="cpp">
 +
  /* segment 1 */
 +
if (adcValue > x0) && (adcValue <= x1)
 +
  y = k1 * adcValue + q1;
  
<source lang="cpp">
+
  /* segment 2 */
if (adcValue > x1) && (adcValue <= x2)
+
if (adcValue > x1) && (adcValue <= x2)
   y = k2 & adcValue + q2;
+
   y = k2 * adcValue + q2;
  
 
  return(y)
 
  return(y)
 
</source>
 
</source>
  
 +
Dá sa použiť aj funkcia map v Arduine -  https://www.arduino.cc/reference/en/language/functions/math/map/
  
 +
=== 3. Aproximácia funkcie ===
  
== 3. Aproximácia funkcie ==
+
<source lang="cpp">
 +
  y = a2 * adcValue^2 + a1 * adcValue + a0;
 +
  return(y);
 +
</source>
  
  
Riadok 77: Riadok 113:
  
  
'''Odovzdať:'''
 
  
 +
 +
== Úlohy ==
 +
 +
'''Úlohy, ktoré treba odovzdať:'''
 +
 +
* Graf 1: prevodové charakteristiky
 
* Chyby podľa EN 60 770
 
* Chyby podľa EN 60 770
 
** Nepresnosť
 
** Nepresnosť
Riadok 85: Riadok 126:
 
** Hysteréza
 
** Hysteréza
 
** Neopakovateľnosť
 
** Neopakovateľnosť
* Graf 1: prevodová charakteristika
 
 
* Graf 2: chybové krivky (viď obr.)
 
* Graf 2: chybové krivky (viď obr.)
* Program pre mikroprocesor
+
* 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]]
 +
 +
Hodnotenie: 5 bodov
 +
 +
Deadline: <FONT COlor="red">'''8. 3. 2022 '''</font>
  
  
 +
* Tools: https://inkscape.org/sk/~sincoon/%E2%98%85knob-scale-generator
  
 
[[MEMS inteligentné senzory a aktuátory#Cvi.C4.8Denia|Návrat na zoznam cvičení...]]
 
[[MEMS inteligentné senzory a aktuátory#Cvi.C4.8Denia|Návrat na zoznam cvičení...]]
  
 
[[Category:MEMS]]
 
[[Category:MEMS]]

Aktuálna revízia z 09:22, 27. november 2022

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

  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


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

}


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

Example2-1.png

Hodnotenie: 5 bodov

Deadline: 8. 3. 2022


Návrat na zoznam cvičení...