Capteur de pression MPXV7002DP et tube de pitot

Bonjour a tous,

J'ai dans l'idée d'utiliser un capteur de pression MPXV7002 qui apparemment peut se brancher directement sur un pin Analog de la nono.

Mon soucis c'est que sur le datasheet, il est marqué sur la première page en haut à droite:

MPXV7002 Series
-2 to 2 kPa (-0.3 to 0.3 psi)
0.5 to 4.5 V Output

Sur l'abaque, c'est pareil on a bien 0.5v pour -2kPa et 4.5v pour 2kPa

Malheureusement plus loin dans le datasheet il y a un tableau avec indiqué:

Pressure Offset(3) MIN=2.25 TYP=2.5 MAX=2.75 Vdc

Full Scale Output(4) MIN=4.25 TYP=4.5 MAX=4.75 Vdc

Avec:

  1. Offset (Voff) is defined as the output voltage at the minimum rated pressure.
  2. Full Scale Output (VFSO) is defined as the output voltage at the maximum or full rated pressure.

Le problème que j'ai c'est que je compte utiliser la fonction map (la réponse du capteur est linéaire) pour récupérer les données et je ne sais pas trop quoi mettre dedans?

Et je n'ai pas le capteur entre les mains pour savoir si à -2 kPa j'ai bien 0.5v.

Est ce que si je fais directement un:

pressure_in_bit = analogRead(A0);
pressure_in_kPa = map(pressure_in_bit,0,1023,-2,2);

La valeur retournée sera bonne?

Merci pour vos réponses :wink:

abaque.jpg

john_lenfr:
...
Est ce que si je fais directement un:

pressure_in_bit = analogRead(A0);
pressure_in_kPa = map(pressure_in_bit,0,1023,-2,2);

La valeur retournée sera bonne?

Merci pour vos réponses :wink:

bonjour
ton capteur est un capteur differentiel qui te sort pour un equilibre 2.5V pour une alim de 5V (soit 512 sur une entree ana ref=5V)

ta fonction map ne va te renvoyer que 5 valeurs pour une lecture de 0-1023 , soit -2 , -1 ,0 ,1 et 2
tu aurais interet à utiliser un truc du genre :

pressure_in_kPa = map(pressure_in_bit,0,1023,-2250,2250);

voir meme d'affiner plus dans la mesure où ta sortie n'evolue qu'entre 0.5V et 4.75V
soit en lecture ana : entre ~ 100 et 970

Non car en fait il s'agit de la fonction qui va me donner un float:

float mapfloat(long x, long in_min, long in_max, long out_min, long out_max) {
  return (float)(x - in_min) * (out_max - out_min) / (float)(in_max - in_min) + out_min;
}

Et je fais donc un:

pressure_in_bit = analogRead(A0);
// Re-convert digital to analog
pressure_in_kPa = mapfloat(pressure_in_bit,0,1023,-2,2);

Donc de ce coté pas de problème.

C'est plus le fait de comprendre le datasheet qui m'inquiète

Artouste:
voir meme d'affiner plus dans la mesure où ta sortie n'evolue qu'entre 0.5V et 4.75V

Justement, comment tenir compte de ce paramètre dans mon map?
C'est cette question que je me pose depuis hier et n'arrive pas à résoudre le problème.

john_lenfr:
Non car en fait il s'agit de la fonction qui va me donner un float:

float mapfloat(long x, long in_min, long in_max, long out_min, long out_max) {

return (float)(x - in_min) * (out_max - out_min) / (float)(in_max - in_min) + out_min;
}




Et je fais donc un:


pressure_in_bit = analogRead(A0);
// Re-convert digital to analog
pressure_in_kPa = mapfloat(pressure_in_bit,0,1023,-2,2);




Donc de ce coté pas de problème.

C'est plus le fait de comprendre le datasheet qui m'inquiète

J'ai pas compris ta demo, mais si tu es sur de toi :grin:

Justement, comment tenir compte de ce paramètre dans mon map?
C'est cette question que je me pose depuis hier et n'arrive pas à résoudre le problème.

si tu veux rester sur une solution purement soft et avec du map
sachant que l'offset/valeur mini est 100 (valeur ana lue)
je ferais pour une echelle 0 100% :
valeur analue-100
ça te conditionne ton amplitude entre 0 (100-100) et 870 (970-100)
tu fais un map sur 0,870 ---> 0,100
un map 100,970 ---->0,100 doit fonctionner aussi

J'ai pas compris ta demo, mais si tu es sur de toi

Je n'ai pas donné de démo c'est juste qu'au lieu de renvoyer un int j'ai fait une fonction qui me renvoie un float (entre -2 et +2)
:wink:


Ce qu'il y a c'est que j'aurais bien aimé avoir 1023 pas entre 0.5 et 4.5v justement pour améliorer la résolution

Tu veux donc dire que comme ma référence est à 5V j'ai obligatoirement 5v <=> 1023 pas maxi.

Donc pour 0.5v j'aurais 102 et pour 4.5v j'aurais 921?

Donc je suis obligé de faire un map() borné entre 102 et 921 ?

Ce qui donnerais:

pressure_in_bit = analogRead(A0);
// Re-convert digital to analog
pressure_in_kPa = mapfloat(pressure_in_bit,102,921,-2,2);

?

john_lenfr:
Ce qu'il y a c'est que j'aurais bien aimé avoir 1023 pas entre 0.5 et 4.5v justement pour améliorer la résolution

en soft , pas de solution
en hard :

  • mettre une ref externe calée à max output (4.75V) , mais tu perd toujours l'offset
  • mettre en sortie du MPV 2 AOP , un pour caler l'offset à 0, l'autre pour amplifier de 4.75 à 5V
    ceci etant compte tenu de l'imprecision intrinseque du capteur qui peut atteindre +/-6.25% de VFss
    l'interet reel est limité

Ok donc j'oublie le recalage des offset.

Donc au final si je fais:

mapfloat(pressure_in_bit,102,921,-2,2);

J'aurais la bonne valeur théorique?

Et par rapport à la doc je n'ai pas compris ce que sont Offset (Voff) , Full Scale Output (VFSO) et VFss ?

Voff c'est la tension retournée par le capteur lorsque la pression différentielle est nulle
Vfss c'est la tension retournée lorsque la pression différentielle est au maximum (soit 2kPa)

Si Voff est la tension retournée par le capteur lorsque la pression différentielle est nulle alors que retourne le module entre 0.5 et 2.5v?

john_lenfr:
Ok donc j'oublie le recalage des offset.

Donc au final si je fais:

mapfloat(pressure_in_bit,102,921,-2,2);

J'aurais la bonne valeur théorique?

Et par rapport à la doc je n'ai pas compris ce que sont Offset (Voff) , Full Scale Output (VFSO) et VFss ?

attention aux dispersions
en theorie le signal de sortie peut varier entre 0.25V et 4.75V , soir rameneé à l'ADC une amplitude comprise entre 50 et 970
pas 102 et 921

john_lenfr:
Si Voff est la tension retournée par le capteur lorsque la pression différentielle est nulle alors que retourne le module entre 0.5 et 2.5v?

selon les dispersions un equilibre peut etre compris entre entre 2.25 et 2.75V
il faut verifier sur piece pour calibrer

Artouste:

john_lenfr:
Ok donc j'oublie le recalage des offset.

Donc au final si je fais:

mapfloat(pressure_in_bit,102,921,-2,2);

J'aurais la bonne valeur théorique?

Et par rapport à la doc je n'ai pas compris ce que sont Offset (Voff) , Full Scale Output (VFSO) et VFss ?

attention aux dispersions
en theorie le signal de sortie peut varier entre 0.25V et 4.75V , soir rameneé à l'ADC une amplitude comprise entre 50 et 970
pas 102 et 921

Oui mais dans ce cas faut pas que je mette de -2 à 2 car sinon je ne respecte plus l'abaque. Il faut aussi que je prévois le dépassement en allant au delà alors?

Artouste:

john_lenfr:
Si Voff est la tension retournée par le capteur lorsque la pression différentielle est nulle alors que retourne le module entre 0.5 et 2.5v?

selon les dispersions un equilibre peut etre compris entre entre 2.25 et 2.75V
il faut verifier sur piece pour calibrer

Je ne comprend pas cette remarque par rapport à ma question?

john_lenfr:

Artouste:

john_lenfr:
Si Voff est la tension retournée par le capteur lorsque la pression différentielle est nulle alors que retourne le module entre 0.5 et 2.5v?

selon les dispersions un equilibre peut etre compris entre entre 2.25 et 2.75V
il faut verifier sur piece pour calibrer

Je ne comprend pas cette remarque par rapport à ma question?

Alors c'est moi qui ne comprend pas la question :grin:
en se basant pour P1=P2=2.5V
entre 0.5V et 2.5V ça renvoi l'image de la pression relative negative P1/P2 et au dessus de 2.5V
l'image de la pression positive relative P1/P2

aaaaaaaaaaaahhhhhhhh ok! Suffisait que je regarde l'abaque avec mes 2 yeux :grin:
Donc entre 0.5 et 2.5 je suis dans la plage de -2kPa à 0 kPa (sans tenir compte des offsets)
Et entre 2.5 et 4.5v je suis dans la plage de 0 à 2kPa
C'est ça?

Et sinon je ne pense pas tenir compte des offsets, je vais garder la coube "TYPICAL" et faire mon map entre 102 et 921
Car si je tiens compte des offsets je suis perdu après. Et la réponse entre 0.25 et 4.75 ne serait pas correcte par rapport à l'abaque.

De toute façon les tests diront avec plus de précision ce qu'il en est mais pour débuter je pense que c'est pas mal comme ça:

mapfloat(pressure_in_bit,102,921,-2,2);

john_lenfr:
aaaaaaaaaaaahhhhhhhh ok! Suffisait que je regarde l'abaque avec mes 2 yeux :grin:
Donc entre 0.5 et 2.5 je suis dans la plage de -2kPa à 0 kPa (sans tenir compte des offsets)
Et entre 2.5 et 4.5v je suis dans la plage de 0 à 2kPa
C'est ça?

Et sinon je ne pense pas tenir compte des offsets, je vais garder la coube "TYPICAL" et faire mon map entre 102 et 921
Car si je tiens compte des offsets je suis perdu après. Et la réponse entre 0.25 et 4.75 ne serait pas correcte par rapport à l'abaque.

De toute façon les tests diront avec plus de précision ce qu'il en est mais pour débuter je pense que c'est pas mal comme ça:

mapfloat(pressure_in_bit,102,921,-2,2);

Voila c'est ça , en ayant toujours à l'esprit que c'est une mesure differentielle sur une etendue de +/- 2 kPa
le ?P max admissible entre P1 et P2 est de 75 kPa.
Ce type de capteur est surtout utilisé dans les respirateurs medicaux (inspiration/expiration)
il l'est aussi pour faire du "petit pitot" .
le plus simple pour ton map est une fois ton capteur en main de le centrer en prenant comme zero(equilibre) le Vout rendu sur paillase, les 2 pipes du MPX mis à P atmo.

Edit : je suis parti sur un modele MPXV7002DP
c'est bien le cas ? ce n'est pas un modele G ?
tu veux faire quoi avec ?

john_lenfr:
Et sinon je ne pense pas tenir compte des offsets,

Tu ne peux pas ne pas tenir compte de l'offset, il est là.
Par contre, tu peux faire une calibration en le mesurant lorsque les 2 entrées sont à la même pression et conserver cette valeur en mémoire pour la suite.
Suivant ce que tu veux en faire les +/-10% d'erreur que cela va ajouter peuvent être génants

fdufnews:

john_lenfr:
Et sinon je ne pense pas tenir compte des offsets,

Tu ne peux pas ne pas tenir compte de l'offset, il est là.
Par contre, tu peux faire une calibration en le mesurant lorsque les 2 entrées sont à la même pression et conserver cette valeur en mémoire pour la suite.
Suivant ce que tu veux en faire les +/-10% d'erreur que cela va ajouter peuvent être génants

Bonsoir fdufnews
oui , et meme mieux prevoir une etape de calbration (auto ou manuel) à P1=P2=P atmo et deriver de ce point "zero" les bornes extremes du mapping.

Voici l'objet du délit:
https://code.google.com/p/ardupilot-mega/wiki/Airspeed

oui , et meme mieux prévoir une étape de calibration (auto ou manuel) à P1=P2=P atmo et dériver de ce point "zéro" les bornes extrêmes du mapping.

Oui c'est ce que je voudrais faire avec possibilité de lancer l'init depuis un menu, stocker la valeur en EEPROM qui resterais tant qu'on ne demande pas de nouvelle init.

Le soucis c'est que je n'ai qu'une seule sortie sur le module donc comment vous voyez la partie initialisation?
Etes vous sur que cette etape soit nécessaire car sur le datasheet c'est indiqué:

Auto zero is defined as storing the zero pressure output reading and subtracting this from the
device's output during normal operations

je dois me pencher là dessus demain :slight_smile: