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 :

Mesure de puissance


Sujet :

Arduino

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2025
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2025
    Messages : 3
    Par défaut Mesure de puissance
    Bonjour,

    je ne parviens pas à faire marcher mon code pour effectuer la mesure de puissances en temps réel car je dois juste avec la tension sans avoir le courant voici le code ci-dessous. Pouvez vous m'aider?

    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
    int pinPuissanceDirecte = A5; // Entrée analogique pour la puissance directe
    int pinPuissanceReflechie = A4; // Entrée analogique pour la puissance réfléchie
    float maxPuissance = 0.0; // Puissance maximale en watts
    float maxTension = 5.0; // Tension maximale du signal analogique
    int resolution = 1023; // Résolution de l'ADC
    float somme_Puissance = 0.0;
    float Max = 0.9;
    float min = 0.1;
     
    // Variables
    float puissanceDirecte = 0.0; // Puissance directe mesurée
    float puissanceReflechie = 0.0; // Puissance réfléchie mesurée
     
    void setup()
    {
    lcd.init();
    lcd.backlight();
    lcd.clear ();
    }
     
    void loop()
    {
    if(entre_en_lecture == false|| entre_en_lecture == true) { // si Mode manuel ou Atuo
    // Lecture des valeurs analogiques
    int lectureDirecte = analogRead(pinPuissanceDirecte);
    int lectureReflechie = analogRead(pinPuissanceReflechie);
    puissanceDirecte = (lectureDirecte * maxTension / resolution) * (maxPuissance / maxTension)* Max;
    puissanceReflechie = (lectureReflechie * maxTension / resolution) * (maxPuissance / maxTension)*min;
    }}

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2022
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 21
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2022
    Messages : 322
    Par défaut
    Bonjour,
    marcher mon code
    Moi le mien il cours super vite
    Un code d'erreur ? Une sortie bizarre ? Une erreur de calcul ?

    Pour transmettre du code :
    https://club.developpez.com/regles/#LIII-E



    Mistral me génère ca par exemple :
    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    #include <LiquidCrystal_I2C.h>
     
    // Initialisation de l'affichage LCD
    LiquidCrystal_I2C lcd(0x27, 16, 2);
     
    int pinPuissanceDirecte = A5; // Entrée analogique pour la puissance directe
    int pinPuissanceReflechie = A4; // Entrée analogique pour la puissance réfléchie
    float maxPuissance = 0.0; // Puissance maximale en watts
    float maxTension = 5.0; // Tension maximale du signal analogique
    int resolution = 1023; // Résolution de l'ADC
    float somme_Puissance = 0.0;
    float Max = 0.9;
    float min = 0.1;
     
    // Variables
    float puissanceDirecte = 0.0; // Puissance directe mesurée
    float puissanceReflechie = 0.0; // Puissance réfléchie mesurée
    bool entre_en_lecture = true; // Variable pour contrôler la lecture
     
    void setup()
    {
      lcd.init();
      lcd.backlight();
      lcd.clear();
      Serial.begin(9600); // Initialisation de la communication série pour le débogage
    }
     
    void loop()
    {
      if (entre_en_lecture) { // Si Mode manuel ou Auto
        // Lecture des valeurs analogiques
        int lectureDirecte = analogRead(pinPuissanceDirecte);
        int lectureReflechie = analogRead(pinPuissanceReflechie);
     
        // Calcul de la puissance directe et réfléchie
        puissanceDirecte = (lectureDirecte * maxTension / resolution) * (maxPuissance / maxTension) * Max;
        puissanceReflechie = (lectureReflechie * maxTension / resolution) * (maxPuissance / maxTension) * min;
     
        // Affichage des valeurs sur l'écran LCD
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("P Dir: ");
        lcd.print(puissanceDirecte);
        lcd.setCursor(0, 1);
        lcd.print("P Ref: ");
        lcd.print(puissanceReflechie);
     
        // Affichage des valeurs sur le moniteur série pour le débogage
        Serial.print("Puissance Directe: ");
        Serial.println(puissanceDirecte);
        Serial.print("Puissance Reflechie: ");
        Serial.println(puissanceReflechie);
      }
     
      delay(1000); // Attente d'une seconde avant la prochaine lecture
    }

  3. #3
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2004
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2004
    Messages : 539
    Par défaut
    Plein de remarques:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int resolution = 1023; // Résolution de l'ADC
    Pas exactement, pour un ADC 10 bits, c'est 1024

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(entre_en_lecture == false|| entre_en_lecture == true){// si Mode manuel ou Atuo
    Je ne vois pas où est déclarée cette variable. Sinon, vu qu'il s'agit d'une variable ne pouvant prendre 2 valeurs, true et false, la condition "entre_en_lecture == false|| entre_en_lecture == true" sera toujours vraie, donc le if ne sert à rien puisque le code qui suit sera systématiquement exécuté.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    puissanceDirecte = (lectureDirecte * maxTension / resolution) * (maxPuissance / maxTension)* Max;
    Ca sert à quoi de multiplier et de diviser par maxTension?

  4. #4
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 625
    Par défaut
    Bonjour jackk,

    Citation Envoyé par jackk Voir le message
    ...int resolution = 1023; // Résolution de l'ADC.
    Pas exactement, pour un ADC 10 bits, c'est 1024
    C'est exact si on n'écrit pas que la valeur Vmax (souvent Vcc) correspond à 1023, auquel cas il n'y aurait que 1023 niveaux 0..1022 pour couvrir [0..Vcc[ le niveau 1023 signifiant que Vcc est atteint et même vraisemblablement dépassé. Dans le cas de l'utilisation de 1024, 1023 correspond 1023/1024 Vref (plus précisément [1023/1024 Vref, Vref[ .

    Ceci étant, vu la précision des CAN des MPU et le fait que diviser par 1024 n'est qu'un décalage, le choix est vite fait

    Salut

  5. #5
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2004
    Messages
    539
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Juin 2004
    Messages : 539
    Par défaut
    je ne comprends pas trop ce que tu veux dire. Tu penses qu'il faut laisser 1023?
    Même si au final, ça ne changera pas grand chose, autant utiliser des valeurs correctes et c'est à priori plutôt 1024.

    Dans le cas de l'utilisation de 1024, 1023 correspond 1023/1024 Vref (plus précisément [1023/1024 Vref, Vref[
    Tout à fait.
    et la valeur 0 correspond à l'intervalle [0, 1/1024 Vref[.
    Il y a donc bien 1024 valeurs différentes et le quantum égal à Vref / 1024.

    C'est d'ailleurs parfaitement confirmé par la doc de l'ATmega328 qui donne la valeur calculée par l'ADC comme étant égale à Vin x 1024 / Vref

  6. #6
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    13 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 13 196
    Billets dans le blog
    47
    Par défaut
    Bonjour,

    Le quantum (la résolution en Volt) est bien q = Vref / 1024.

    La formule qui donne N=f(Vin) ou Vin=g(N) est de toute façon une formule approchée de la fonction de transfert (avec la forme "en escalier").

  7. #7
    Membre Expert

    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2013
    Messages
    1 625
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2013
    Messages : 1 625
    Par défaut
    Bonjour jackk,

    Citation Envoyé par jackk Voir le message
    ...C'est d'ailleurs parfaitement confirmé par la doc de l'ATmega328 qui donne la valeur calculée par l'ADC comme étant égale à Vin x 1024 / Vref
    Ce qui donne n = Vin x 1024 / Vref soit Vin = n x Vref / 1024. Or cette doc mentionne ailleurs que 1023 correspond à Vref, ce qui n'est pas très cohérent d'autant que l'habitude est de prendre la valeur de début de palier : 0V pour n=0 et non Vref /2048 (milieu de palier).

    J'utilise bien sûr 1024, plus par efficacité qu'autre chose (ces MPU n'ont pas de division et on peut travailler en entiers sans division pour peu que l'on soit en mV : Vm = Vin = n x (Vref x 125) / 128).

    Par exemple, en 5 V cela pourrait donner uint16_t Vm = 5*n - ((15*n) >> 7); Il y a des petits sauts de 1mV toutes les 9 valeurs environ mais la précision étant près de 5 mV il est possible de considérer être sous la portée du radar .

    Salut.

Discussions similaires

  1. Réponses: 5
    Dernier message: 26/12/2023, 12h43
  2. Réponses: 0
    Dernier message: 22/03/2023, 01h34
  3. Réponses: 6
    Dernier message: 21/10/2020, 07h09
  4. Réponses: 4
    Dernier message: 18/07/2008, 14h19
  5. Besoin d'aide pour l'I.A. d'un puissance 4
    Par Anonymous dans le forum C
    Réponses: 2
    Dernier message: 25/04/2002, 17h05

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