IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

[Arduino Due] Faire un voltmètre/ampèremètre spécial.


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 4
    Par défaut [Arduino Due] Faire un voltmètre/ampèremètre spécial.
    Bonjour, j'ai commencer à bosser sur un projet pour mon BTS mais me voila un peut en galère.

    Je vous explique :

    Je doit remplacer un multimètre/ampèremètre pour une entreprise. Le leur à une résolution de 10 bits. Ils m'ont donc fournis une Arduino Due (qui a donc une résolution de 12 bits) afin que je puisse leurs faire le programme etc. Pour le moment je n'ai pas plus d'infos intéressante a donner, rien sur l'utilisation si ce n'est les choses suivantes :

    Le multimètre à une entrée 3.3V, un 6V, une +16, une -16, une -16/+16 (soit 32V), et une 24 V. ça c'est pour les entrée en tension. Ils me demandent pour le moment de m'occuper juste de ça et on verra pour la suite après.

    J'utilise donc le logiciel IDE Arduino 1.7.10 car il est le seul a avoir les fonctions de l'arduino Due. Mon arduino due dispose de ceci comme processeur : "The Arduino Due is a microcontroller board based on the Atmel SAM3X8E ARM Cortex-M3 CPU" un peut plus d'info : 54 entrées/sorties digitales, 12 entrées analogiques, 4 UARTs et 2 sorties analogiques.

    Je me sert des entrées analogiques pour récupérer une tension qui sera adapté en 3.3 V quand avant d'arriver sur la carte, sinon elle fume. Donc en gros :

    Je récupère une tension en 3.3V, je doit l'analyser, la convertir en bonne tension (selon l'entrée utilisée) et ensuite ajouter un coefficient de correction (je n'ai pas trop compris pourquoi mais ils m'ont dit que ce sera sous la forme ax²+bx ou ax^3+bx²+c).

    Pour le moment j'ai fais fonctionner ceci sur une entrée, j'ai un potentiomètre connecté au 3.3 et a la masse de la carte, et qui a sa sortie sur A0 pour mes test.
    Dans mon programme, j'imagine que la tension est de 6V (alors qu'actuellement elle est en 3.3) j'ai donc le programme suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
    const int AI_A0 = A0;    // PIN d'entrée analogique sur le quel est attaché le potentiomètre
    const int AI_A1 = A1;    // PIN d'entrée analogique sur le quel est attaché le potentiomètre
    const int AI_A2 = A2;    // PIN d'entrée analogique sur le quel est attaché le potentiomètre
    const int AI_A3 = A3;    // PIN d'entrée analogique sur le quel est attaché le potentiomètre
    const int AI_A4 = A4;    // PIN d'entrée analogique sur le quel est attaché le potentiomètre
    const int AI_A5 = A5;    // PIN d'entrée analogique sur le quel est attaché le potentiomètre
    const int AI_A6 = A6;    // PIN d'entrée analogique sur le quel est attaché le potentiomètre
    const int AI_A7 = A7;    // PIN d'entrée analogique sur le quel est attaché le potentiomètre
    const int AI_A8 = A8;    // PIN d'entrée analogique sur le quel est attaché le potentiomètre
    const int AI_A9 = A9;    // PIN d'entrée analogique sur le quel est attaché le potentiomètre
    const int AI_A10 = A10;  // PIN d'entrée analogique sur le quel est attaché le potentiomètre
    const int AI_A11 = A11;  // PIN d'entrée analogique sur le quel est attaché le potentiomètre
     
    int sensorValue = 0 ;                                //Déclaration d'une variable en INT
    float V_A0 = 0;                                      //Déclaration d'une variable en flottante
    void setup() 
    {
    **Serial.begin(9600);                                // Initialise la communication série à 9600 Bauds.
    }
     
    void loop() {
    ***analogReadResolution(12);*************************//règle la résolution sur 12 bits
    **//Lis les valeurs analogiques du port AO : 
    **sensorValue*=*analogRead(AI_A0);                   //Donne à la variable les valeurs lue sur le port A0
     
    **// Affiche les mesures sur le moniteur série
    **V_A0*=*sensorValue;
    **Serial.print("A0_HEXA = " );                       //affiche "A0_HEXA="
    **Serial.print(sensorValue,HEX);                     //Affiche la valeur actuel du potentiomètre (sur une résolution de 12 bits)
    **Serial.print("\t A0_3.3V = ");                     //Affiche "VA0_3.3V ="
    **Serial.print(V_A0*(3.3/4096));                     //Affiche la valeur de V_A0 en 3.3V
    **Serial.print("\t\t A0_6V = ");                     //Affiche "VA0_6V = "
    **Serial.print(V_A0*(6.0/4096));                     //Affiche la valeur de V_A0 en 6V
    **Serial.print("\t A0_6V_Corr = ");                  //Affiche "A0_6V_corr = "
    **Serial.println(((V_A0*(6.0/4096))+0.1));           //Affiche la valeur de V_A0 en 6V + une correction
     
     
    **// Attendre 2 MS avant la prochaine boucle
    **// pour laisser le temps de convertir
    **// avant la prochaine lecture.
    **delay(2);
    **
    }
    des suggestions pour m'aider ?
    J'aimerai faire une boucle qui fais ce que j'ai fais sur un port, sur tous les ports, sans faire un copier coller 11 fois afin que le programme ne soit pas trop lourd (même si la carte à une grosse capacité). Je n'ai pas trop d'idée de comment faire.. peut être avec un compteur qui incrémente jusqu'à 12 puis qui repart a zero histoire de tout checker.

    Pour le moment pour voir les valeurs je me sert de la console de l'IDE. pas d'afficheur ni rien pour le moment.

    Merci à vous !

  2. #2
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 252
    Par défaut
    Salut,
    Citation Envoyé par Alex34000 Voir le message
    Le multimètre à une entrée 3.3V, un 6V, une +16, une -16, une -16/+16 (soit 32V), et une 24 V. ça c'est pour les entrée en tension. Ils me demandent pour le moment de m'occuper juste de ça et on verra pour la suite après.
    Très bizarre ton multimètre !? C'est qui le fabricant ? Photo ?

    Citation Envoyé par Alex34000 Voir le message
    Je me sert des entrées analogiques pour récupérer une tension qui sera adapté en 3.3 V quand avant d'arriver sur la carte, sinon elle fume.
    Si tu veux faire ça bien, je t'invite a regarder ton ADC de prés car (à quoi sert Vref par exemple ou quelle est l'impédance d'entrée) et pour qu'il soit efficace sur ses 12 bits, il faut que le signal mesuré atteigne la pleine échelle du convertisseur.
    Sur le net, tu trouveras un nombre incroyable de tuto ou d'exemple où des personnes mesures quelques Volts avec un ADC 10 bits référencé sur le 5V En faisant ça l'ADC 10 bits n'est utilisé que sur ces 4 premiers bits, autrement dit c'est pas très judicieux. La vraie manière de faire, c'est d'amplifier le signal d'entrée pour qu'il atteigne la référence de l'ADC et comme ça tu utilises pleinement toute la résolution de l'ADC !

    Citation Envoyé par Alex34000 Voir le message
    Je récupère une tension en 3.3V, je doit l'analyser, la convertir en bonne tension (selon l'entrée utilisée) et ensuite ajouter un coefficient de correction (je n'ai pas trop compris pourquoi mais ils m'ont dit que ce sera sous la forme ax²+bx ou ax^3+bx²+c).
    Ouais alors ça c'est bizarre car ça ne ressemble même pas a une compensation en température !? A éclaircir.

    Citation Envoyé par Alex34000 Voir le message
    des suggestions pour m'aider ?
    Intéresse toi aux interruptions de ton micro (le Timer et l'ADC)

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 4
    Par défaut
    En fait si tu veux, ils ont un voltmètre/ampèremètre fais maison. Il reçoit différentes tension d'entrée et fais ses calculs pour sortir des valeurs avec une résolution 10 bits.

    Le projet qu'ils m'ont donnés est de remplacer leurs carte qui est doté d'un PIC d'une résolution max de 10 bits, par une carte arduino Due qui a une résolution de 12 bits.

    La carte ne supportant pas le 6V et +, la tension d'entrée est adapté à l'aide de pont diviseur pour qu'il y ai au lieu du 6V, du 3.3, ou 3, ou 2.5 V (ça reste à définir). On se retrouve donc par exemple en port A2 avec 3.3V au lieu de 6V. à l'aide de produit en croix j'adapte ma tension et ensuite, je l'affiche une première fois (tension adapté en 3.3 ou autre) puis une deuxième fois (Tension original donc ici le 6V pour l'exemple) et une troisième fois (Tension 6v + coefficient d'ajustement ou je ne sais quoi, c'est pas moi qui décide ^^').

    Pour résumer j'ai une tension qui arrive de 3.3V, je sais que en vrai elle est censé être de 6V si elle arrive en 3.3 (donc si elle est a 2.5 a l'aide de mon produit en croix je connais sa valeur (qui sera inferieur à 6V)). Puis je l'affiche, avec une résolution de 12 bits, et je l'affiche encore avec leurs coefficient d'amélioration de mesure.

    Est-ce plus clair ?

    Et j'ai longuement chercher sur internet avant de venir ici ^^ je n'ai pas trouvé ce que je désire, c'est la raison de ma venue ici en tant que "novice" .

  4. #4
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 252
    Par défaut
    Citation Envoyé par Alex34000 Voir le message
    En fait si tu veux, ils ont un voltmètre/ampèremètre fais maison. Il reçoit différentes tension d'entrée et fais ses calculs pour sortir des valeurs avec une résolution 10 bits. [...] Le projet qu'ils m'ont donnés est de remplacer leurs carte qui est doté d'un PIC d'une résolution max de 10 bits, par une carte arduino Due qui a une résolution de 12 bits.
    Ok pour le contexte.

    Citation Envoyé par Alex34000 Voir le message
    La carte ne supportant pas le 6V et +, la tension d'entrée est adapté à l'aide de pont diviseur pour qu'il y ai au lieu du 6V, du 3.3, ou 3, ou 2.5 V (ça reste à définir).
    C'est en effet la bonne pratique et c'est là où il y a un premier piège. La formule d'un pont diviseur est valable à vide donc sans aucune charge dessus autrement dit lorsque tu ne tires aucun courant dessus.
    A partir du moment où tu vas relier ton pont diviseur a ton ADC tu vas t'apercevoir que la formule n'est plus vraiment exacte et souvent les gens la compense dans le soft pour corriger le problème (problème hardware en réalité). Il se passe en réalité quelque chose de très simple : Ton ADC tire du courant car il n'a pas une impédance énorme en entrée et la formule du pont diviseur n'est plus exacte même en prenant de résistance de précision.

    2- Solutions pour éviter de mesurer moins bien qu'avant
    1) Regarder dans la datasheet qu'elle est l'impédance d'entrée de l'ADC ou alors qu'elle courant il demande et refaire le calcul du pont diviseur avec ces données.

    2) Mettre un AOP câblé en suiveur entre la sortie du pont diviseur et l'ADC car un AOP a une impédance immense en entrée, il ne tire donc quasiment aucun courant dans le pont diviseur et il a assez de pêche pour fournir le courant que réclame l'entrée de l'ADC sans en être perturbé.

    Citation Envoyé par Alex34000 Voir le message
    On se retrouve donc par exemple en port A2 avec 3.3V au lieu de 6V. à l'aide de produit en croix j'adapte ma tension et ensuite, je l'affiche une première fois (tension adapté en 3.3 ou autre) puis une deuxième fois (Tension original donc ici le 6V pour l'exemple) et une troisième fois (Tension 6v + coefficient d'ajustement ou je ne sais quoi, c'est pas moi qui décide ^^').

    Pour résumer j'ai une tension qui arrive de 3.3V, je sais que en vrai elle est censé être de 6V si elle arrive en 3.3 (donc si elle est a 2.5 a l'aide de mon produit en croix je connais sa valeur (qui sera inferieur à 6V)). Puis je l'affiche, avec une résolution de 12 bits, et je l'affiche encore avec leurs coefficient d'amélioration de mesure.
    Je comprends, enfin je pense !
    Tu as des armes en traitement du signal pour améliorer la mesure "et dégommer le PIC actuel", tu peux cadencer ton ADC avec un Timer pour qu'il prenne des mesures a intervalle régulier et tu pourras faire une moyenne de l'ensemble des valeurs mesurés (que tu auras mis dans un tableau). Afficher les Vmaxi et Vmini rencontré comme sur les appareils de mesure pros. Les delta entre Vmaxi et Vmini pour mesurer un bruit/ondulation résiduelle/ripple. Faire un calcul de valeur RMS au cas où le signal mesuré est sinusoïdale, donc une mesure en AC et pas en DC. Voir encore plus.... ce n'est que du calcul discret ensuite.

    Citation Envoyé par Alex34000 Voir le message
    Est-ce plus clair ?
    Penche toi sur les interruptions avec ton micro et gaffe à Vref de l'ADC surtout si tu as un AOP quelque part.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2016
    Messages : 4
    Par défaut
    2) Mettre un AOP câblé en suiveur entre la sortie du pont diviseur et l'ADC car un AOP a une impédance immense en entrée, il ne tire donc quasiment aucun courant dans le pont diviseur et il a assez de pêche pour fournir le courant que réclame l'entrée de l'ADC sans en être perturbé.
    Je me suis renseigner sur les montages actuels, et en effet il y a des AOP donc cette solution me convient parfaitement, je n'y avais pas pensé ^^'.

    Tu as des armes en traitement du signal pour améliorer la mesure "et dégommer le PIC actuel", tu peux cadencer ton ADC avec un Timer pour qu'il prenne des mesures a intervalle régulier et tu pourras faire une moyenne de l'ensemble des valeurs mesurés (que tu auras mis dans un tableau). Afficher les Vmaxi et Vmini rencontré comme sur les appareils de mesure pros. Les delta entre Vmaxi et Vmini pour mesurer un bruit/ondulation résiduelle/ripple. Faire un calcul de valeur RMS au cas où le signal mesuré est sinusoïdale, donc une mesure en AC et pas en DC. Voir encore plus.... ce n'est que du calcul discret ensuite.
    Très intéressant. De ce qui m'a été dit (je les ai contacter), il y a deux possibilité, faire une moyenne d'un ensemble de valeur, ou corriger un défaut grâce à cette fameuse formule. Tout dépend de la précision des résultat obtenue de base. Personnellement je trouve la moyenne plus simple à mettre en œuvre niveau programmation, même si je n'ai qu'une petite idée de comment faire...

    Penche toi sur les interruptions avec ton micro et gaffe à Vref de l'ADC surtout si tu as un AOP quelque part.
    Les interruptions, OUI !! je pensais justement faire des relevés et au bout d'un certain nombre, interrompre, faire la moyenne, afficher, et recommencer.

    Par contre je ne voie pas ce que tu veux me dire par rapport à Vref. (je suis peut être mal réveillé ^^')

  6. #6
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 252
    Par défaut
    Citation Envoyé par Alex34000 Voir le message
    Je me suis renseigner sur les montages actuels, et en effet il y a des AOP donc cette solution me convient parfaitement, je n'y avais pas pensé ^^'.
    On peut faire quelque chose de très au point avec des AOP (si ils sont bien choisies et dimensionnés évidemment)

    Citation Envoyé par Alex34000 Voir le message
    Très intéressant. De ce qui m'a été dit (je les ai contacter), il y a deux possibilité, faire une moyenne d'un ensemble de valeur, ou corriger un défaut grâce à cette fameuse formule. Tout dépend de la précision des résultat obtenue de base. Personnellement je trouve la moyenne plus simple à mettre en œuvre niveau programmation, même si je n'ai qu'une petite idée de comment faire...
    Je ne comprends pas trop cette équation. Peu être qu'on parle d'un filtre numérique, c'est possible, mais il y a d'autres manières de l'expliquer qu'une formule sans dire à quoi serve les a, b et c !!!

    Citation Envoyé par Alex34000 Voir le message
    Les interruptions, OUI !! je pensais justement faire des relevés et au bout d'un certain nombre, interrompre, faire la moyenne, afficher, et recommencer.
    Voilà ! Tu as tout compris, il faut décorréler l'affichage, l'acquisition et le traitement/calcul
    - acquisition + traitement/calcul => priorité 1 dans l'interruption
    - affichage => priorité 2 donc dans le programme principal qui n'a pour rôle que d'afficher (sous entendu, si l'affichage est interrompu quelques millisecondes personne ne le verra par contre si c'était l'acquisition qui était interrompu alors ça voulait dire perte de données )

    Citation Envoyé par Alex34000 Voir le message
    Par contre je ne voie pas ce que tu veux me dire par rapport à Vref. (je suis peut être mal réveillé ^^')
    C'est assez subtil.
    Un ADC a souvent trois manières d'être référencé :
    - VCC,
    - Vref du micro,
    - Une Vref externe que tu implantes a côté du micro.

    Si tu te dis, allez je vais référencer mon ADC 12 bits a VCC qui vaudrait 3.3V.
    Cela implique que 1 bit = 3.3/((2^12)-1) = 800µV environ
    Mais cela est vrai si tu considères que ton +3.3V est hyper hyper stable ! En vrai c'est jamais le cas pire encore dès fois le 3.3V et moins stable que les 800µV eux mêmes alors il faut être conscient que tout bouge et varie au rythme de l'instabilité de l'alimentation.

    Dans certain cas c'est très emmerdant car si toute l'électronique ainsi que l'ADC bouge légèrement et que tu mesures la tension d'une pile 1.5V par exemple et bien ton affichage n'est pas stable. L’électronique bouge au rythme de son alimentation mais la pile 1.5V, elle, est stable !

    Par contre dans d'autre cas ce n'est pas grave du tout. Si ton ADC lit une sortie analogique d'un capteur, qui serait alimenté par le même 3.3V alors tout bouge et varie en même temps (si la tension est de 3.4V alors elle l'est tout autant sur le capteur que sur le micro donc rien ne gène)

    Donc méfie toi de ce que tu vas mesurer.

    Vref du micro est assez costaux pour alimenter des AOP par exemple. J'ai déjà fait ça sur certain de mes projets : un micro alimenté en 3.3V, son ADC référencé sur une Vref interne de 2.5V (hyper stable) et les AOP d'amplifications ou suiveur eux aussi alimentés par la Vref interne de 2.5V. J'ai donc stabilisé ma chaîne de mesure et même si mon 3.3V est tout pourri (genre alimentation a découpage avec des ondulations résiduelles de la mort) ça reste parfaitement stable !!!

    Je ne sais pas si j'ai été clair avec cette histoire de Vref ?

Discussions similaires

  1. [Débutant] Arduino Due DAC et PWM sous MAtlab SImulink
    Par MedBtba dans le forum Simulink
    Réponses: 0
    Dernier message: 02/02/2016, 12h12
  2. Réponses: 2
    Dernier message: 07/11/2015, 16h14
  3. Comment faire un URL rewriting spécial ?
    Par Facel dans le forum Apache
    Réponses: 12
    Dernier message: 27/12/2012, 09h43
  4. autoriser un seul utilisateur à faire un copier collage spécial valeur
    Par fafa7777 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 06/06/2008, 10h43
  5. Réponses: 6
    Dernier message: 16/09/2005, 10h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo