Partage
  • Partager sur Facebook
  • Partager sur Twitter

mapper une valeur analogique

26 juin 2019 à 14:57:52

Bonjour,

Dans le but de relever la tension aux bornes d'une batterie (mesure effectuée au voltmètre: 4.6V), je fais appel à une fonction qui lit la valeur analogique en A6 et la convertie pour être dans une fourchette entre 0 et 5V.

Voici la 1ere fonction que j'ai écrite:

     Int ValAnalog=analogRead(A6) ;
     Float Vout =map(ValAnalog,0,1023,0,5.0) ;
     return Vout ;

Le résultat retourné et affiché avec serial.print est alors 4.0 V

J'ai donc essayé de faire le produit en croix "manuellement":

Int ValAnalog=analogRead(A6) ;

      Float Vout =(ValAnalog*5.0 /1023) ;

      return Vout ;

J'obtiens alors 4.4 V

1) Pourquoi la fonction map ne gère t elle pas la décimale? ai-je oublié quelque chose ?

2) Pourquoi y a t il une différence entre la valeur réelle (voltmètre) et la mesure? si j'applique un coefficient correcteur, suis je sûr qu'il est linéaire et que la valeur sera correctement corrigée même quand la batterie se décharge? 

 Merci pour vos conseils

  • Partager sur Facebook
  • Partager sur Twitter
26 juin 2019 à 17:31:02

Salut.

La fonction map ne renvoie que des int. En cas de décimale elle tronque la partie décimale donc c'est normal qu'elle renvoie 4.

Avec des millivolts ça devrait le faire.

int Vout = map(ValAnalog, 0, 1023, 0, 5000);

@+

-
Edité par LuckyFifi 26 juin 2019 à 17:33:20

  • Partager sur Facebook
  • Partager sur Twitter
26 juin 2019 à 17:55:50

Je vais essayer mais j'avais testé

float Vout = map(ValAnalog, 0, 1023, 0, 5000)/1000;

et j'avais le même résultat

Merci pour la piste en tous cas

  • Partager sur Facebook
  • Partager sur Twitter
26 juin 2019 à 22:41:25

Tu as beau mettre float devant Vout, ça ne changera rien puisque map revoie un entier et que tu divises par un entier, impliquant une division entière.

Essaie avec ceci et ça devrait marcher:

float Vout = map(ValAnalog, 0, 1023, 0, 5000)/1000.0;



  • Partager sur Facebook
  • Partager sur Twitter
28 juin 2019 à 13:12:53

Bonjour. Tu peux créer ta propre fonction Map :

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

ou

double mapf(double val, double in_min, double in_max, double out_min, double out_max) {
    return (val - in_min) * (out_max - out_min) / (in_max - in_min) + out_min;
}

Mais perso, je ne l'ai pas testé.

-
Edité par pkem 28 juin 2019 à 13:20:03

  • Partager sur Facebook
  • Partager sur Twitter