Répondre à la discussion
Affichage des résultats 1 à 17 sur 17

PIC - Fonction courant min d'une courbe

  1. #1
    BroTech03

    PIC - Fonction courant min d'une courbe

    Bonjour à tous,

    J'ai un circuit sur lequel je récupère un courant (lecture d'une tension sur le pic grâce à un shunt) d'après une commande de température.
    Je souhaites réaliser une fonction qui me retourne le point de courant minimum sur une courbe Température(Courant).

    Pour celà, je pensais procéder de la manière suivante :
    1- Lors de l'appel de la fonction, je définis un nombre de points. A partir desquels je viens remplir un tableau (colonne 1 : consigne T°C et colonne 2 : lecture courant)
    Ensuite, je récupère le point en température, dans le tableau, pour lequel le courant est minimum.

    2- Je réalise, autour de ce point, une boucle dé/incrémentant la température pour atteindre le courant le plus faible de la courbe. Enfin, je retourne le point en T°C pour lequel le courant est le plus faible.

    Code:
    unsigned long Ctrl_Tdeg ( int Pts_Tdeg )
    {
        unsigned long Tab_I[Pts_Tdeg+1][2] = {0};         // Définir un tableau de deux colonnes contenant le courant mesuré suivant la consigne de température   
        unsigned long I_Min = I_Mesure;                   // Entrée analogique I_Mesure => #define I_Mesure ANSELBbits.ANSB3 = 1;
        unsigned long TdegI_Min;
        unsigned Pas = 10;
         
        // Boucle 1 : on enregistre dans le tableau le courant mesuré 
        for (int i=0;i<=Pts_Tdeg;i++)
        {
            Tab_I[i][0] = Config_Tdeg(15+(i*(50/Pts_Tdeg)));		// Appel la fonction Config_Tdeg( unsigned long Tdeg_Consigne) qui envoie la consigne de température sur le circuit pour 15°C à 65°C
            Tab_I[i][1] = I_Mesure;
            if (Tab_I[i][1] < I_Min) 
            {
                TdegI_Min = Tab_I[i][0];
                I_Min = Tab_I[i][1];
            }
        }
    
    
    // Boucle 2 : Pour un nombre de points en température, on connait le point de courant minimum. On va donc incrémenter/décrementer pour se rapprocher de la valeur minimum de la courbe
        do
        {
            do
            {
                TdegI_Min += ((50/Pts_Tdeg)/Pas);
                I_Min = I_Mesure; 
            }
            while (I_Mesure < I_Min)       
           
            do
            {
                TdegI_Min -= ((50/Pts_Tdeg)/Pas);
                I_Min = I_Mesure;            
            }
            while (I_Mesure < I_Min)
    	Pas = Pas / 5;
                
        }
        while((Pas >= (1/2)) && ((15) < TdegI_Min < (65)))     
        return ( TdegI_Min );
    }
    Pouvez m'aider sur la définition des variables qui me retournent des erreurs et votre avis pour optimiser/corriger le code.

    Merci d'avance.

    -----


  2. Publicité
  3. #2
    jacknicklaus

    Re : PIC - Fonction courant min d'une courbe

    tu pourrais déjà joindre les erreurs en question,s on n'a pas tous envie de créer un projet bidon avec ton code pour le compiler et le débugger.

    Sinon, ceci ne marche pas :
    Code:
    ((15) < TdegI_Min < (65))
    l'opérateur < est binaire, et retourne un booléen VRAI/FAUX.
    DOnc après le calcul du 1er opérateur, ton expression devient (par exemple)
    Code:
    (FAUX < 65)
    ce qui n'est sans doute pas ce que tu veux. Tu dois écrire
    Code:
    (15 < TdegI_Min) && (TdegI_Min < 65)
    There are more things in heaven and earth, Horatio, Than are dreamt of in your philosophy.

  4. #3
    BroTech03

    Re : PIC - Fonction courant min d'une courbe

    Merci jacknicklaus, je vais modifier ma condition.

    Dans la boucle principale, j'ai :
    Code:
    Ctrl_Tdeg( 10 );
    8: warning: (361) function declared implicit int

    Dans la fonction, j'obtiens à l'ouverture de la fonction :
    Essai_Fonction.c:18: error: (984) type redeclared
    Essai_Fonction.c:18: error: (1098) conflicting declarations for variable "Ctrl_Tdeg" (Essai_Fonction.c:17)

  5. #4
    Jack

    Re : PIC - Fonction courant min d'une courbe

    8: warning: (361) function declared implicit int
    Logique, puisque ta fonction ést définie comme retournant un" unsigned long" et que tu ne retournes rien dans la fonction.

    Dans la fonction, j'obtiens à l'ouverture de la fonction :
    Ca veut dire quoi "à l'ouverture de la fonction" ?
    Dernière modification par Jack ; 20/01/2018 à 11h27.

  6. #5
    BroTech03

    Re : PIC - Fonction courant min d'une courbe

    Logique, puisque ta fonction ést définie comme retournant un" unsigned long" et que tu ne retournes rien dans la fonction.
    Pourtant, j'ai bien déclaré à la fin de ma fonction :
    Code:
    return ( TdegI_Min );
    Code:
    unsigned long Tab_I[Pts_Tdeg+1][2] = {0};
    Cette ligne me retourne l'erreur suivante :
    Essai_Fonction.c:20: error: (188) constant expression required
    La variable Pts_Tdeg m'apporte cette erreur lorsque je l'ajoute dans la déclaration du tableau.

    Code:
    unsigned long I_Min = I_Mesure;
    error: (255) not a member of the struct/union ""
    error: (182) illegal conversion between types
    I_Mesure est déclaré : I_Mesure => #define I_Mesure ANSELBbits.ANSB3 = 1;

    Merci pour vos retours.

  7. #6
    Jack

    Re : PIC - Fonction courant min d'une courbe

    Pourtant, j'ai bien déclaré à la fin de ma fonction :
    Ah oui, je n'avais pas vu qu'il s'agisait de la même fonction
    Cette ligne me retourne l'erreur suivante :
    Essai_Fonction.c:20: error: (188) constant expression required
    Pts_Tdeg étant une variable et que ton compilateur ne reconnais les tableaux à dimension variable. En C, c'est possible, mais pas en C++.
    I_Mesure est déclaré : I_Mesure => #define I_Mesure ANSELBbits.ANSB3 = 1;
    I_Mesure est de type unsigned long. Il faudrait savoir de quel type est ANSELBbits.ANSB3, probablement une structure, et plus précisément un bitfield.

  8. #7
    Chanur

    Re : PIC - Fonction courant min d'une courbe

    Bonjour

    S'il te plait, BroTech03, tu pourrais nous donner l'ensemble du code que tu essaies de compiler, et pas seulement un petit bout et l'ensemble des messages du compilateur et pas les égrener un par un ?

    Par exemple, tu affirmes que
    I_Mesure est déclaré : I_Mesure => #define I_Mesure ANSELBbits.ANSB3 = 1;
    ALors que dans ton code, la seule fois où on vois ça, c'est dans un commentaire.
    Si ce commentaire correspond effectivement à ce qui est déclaré, c'est clairement faux, mais comment veux-tu que nous le devinions ?

    Par définition, #define fait un remplacement, avant la compilation, d'un mot donné par une suite de caractères
    Ici, ça donnerait, par exemple :
    Code:
    while (ANSELBbits.ANSB3 = 1; < I_Min)
    Qui n'a absolument aucun sens (le point virgule est complètement déplacé, on ne sait pas si ANSELBbits est déclaré, ni comment, ni si c'est une structure qui a un champ ANSB3 ou pas ... on doit deviner !)

    Ou encore, tu nous dis :
    Dans la boucle principale, j'ai :
    Code:
    Ctrl_Tdeg( 10 );
    8: warning: (361) function declared implicit int[/CODE]
    Comme si ta fonction n'était pas encore déclarée quand tu l'appelle (mais on ne peut pas le savoir, le code source étant secret) puis :

    Dans la fonction, j'obtiens à l'ouverture de la fonction :
    Essai_Fonction.c:18: error: (984) type redeclared
    Essai_Fonction.c:18: error: (1098) conflicting declarations for variable "Ctrl_Tdeg" (Essai_Fonction.c:17)
    Ca veut dire quoi "dans la fonction, à l'ouverture de la fonction" ? A la première ligne de sa définition ? Si c'est le cas, ça confirme que tu l'appelles dans ton main sans l'avoir déclarée au préalable. Le compilateur lui affecte par défaut une valeur de retour int en te signalant que ce n'est pas bien de déclarer implicitement les fonctions et se retrouve avec une déclaration différente lors de la définition de la fonction et te signale donc que tu la redéclares.

    Mais ça, c'est ce que j'imagine : j'interprète des messages d'erreur sans connaître le source correspondant : j'ai assez peu de chances de tomber juste ...
    Dernière modification par Chanur ; 20/01/2018 à 19h49.
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  9. #8
    BroTech03

    Re : PIC - Fonction courant min d'une courbe

    J'ai extrait de mon code seulement la fonction pour résoudre les erreurs (je l'ai fait pour faciliter la discussion):
    Fichier Def_Essai.h :
    Code:
    void Config_Tdeg ( unsigned long Tdeg);
    unsigned long Ctrl_Tdeg ( int Pts_Tdeg );
    
    #define I_Mesure ANSELBbits.ANSB3 = 1;
    Fichier Essai_Fonction.c :
    Code:
    #include <xc.h>                        
    #include <pic16f18345.h>
    #include "Def_Essai.h"
    
    void main ()
    {
        Ctrl_Tdeg( 10 );
             
        
    }
    
    void Config_Tdeg( unsigned long Temp)
    {
        
    }
    
    unsigned long Ctrl_Tdeg ( int Pts_Tdeg )
    {
        unsigned long Tab_I[Pts_Tdeg+1][2] = {0};         // Définir un tableau de deux colonnes contenant le courant mesuré suivant la consigne de température   
        unsigned long I_Min = I_Mesure;                   // Entrée analogique I_Mesure => #define I_Mesure ANSELBbits.ANSB3 = 1;
        unsigned long TdegI_Min;
        unsigned Pas = 10;
         
        // Boucle 1 : on enregistre dans le tableau le courant mesuré 
        for (int i=0;i<=Pts_Tdeg;i++)
        {
            Tab_I[i][0] = Config_Tdeg(15+(i*(50/Pts_Tdeg)));		// Appel la fonction Config_Tdeg( unsigned long Tdeg_Consigne) qui envoie la consigne de température sur le circuit pour 15°C à 65°C
            Tab_I[i][1] = I_Mesure;
            if (Tab_I[i][1] < I_Min) 
            {
                TdegI_Min = Tab_I[i][0];
                I_Min = Tab_I[i][1];
            }
        }
    
    
    // Boucle 2 : Pour un nombre de points en température, on connait le point de courant minimum. On va donc incrémenter/décrementer pour se rapprocher de la valeur minimum de la courbe
        do
        {
            do
            {
                TdegI_Min += ((50/Pts_Tdeg)/Pas);
                I_Min = I_Mesure; 
            }
            while (I_Mesure < I_Min)       
           
            do
            {
                TdegI_Min -= ((50/Pts_Tdeg)/Pas);
                I_Min = I_Mesure;            
            }
            while (I_Mesure < I_Min)
    	Pas = Pas / 5;
                
        }
        while(Pas >= (1/2))     
        return ( TdegI_Min );
    }
    Et voici les erreurs que cela me génère :
    (La ligne 20 correspond à la première ligne de code de la fonction)
    Essai_Fonction.c:20: error: (188) constant expression required
    Essai_Fonction.c:21: error: (255) not a member of the struct/union ""
    Essai_Fonction.c:21: error: (182) illegal conversion between types
    int -> volatile union S144
    Essai_Fonction.c:21: error: (182) illegal conversion between types
    volatile union S144 -> unsigned long
    Essai_Fonction.c:21: error: (181) non-scalar types can't be converted to other types
    Essai_Fonction.c:28: warning: (373) implicit signed to unsigned conversion
    Essai_Fonction.c:28: warning: (373) implicit signed to unsigned conversion
    Essai_Fonction.c:28: error: (182) illegal conversion between types
    void -> unsigned long
    Essai_Fonction.c:28: error: (181) non-scalar types can't be converted to other types
    Essai_Fonction.c:29: warning: (373) implicit signed to unsigned conversion
    Essai_Fonction.c:29: error: (255) not a member of the struct/union ""
    Essai_Fonction.c:29: error: (182) illegal conversion between types
    int -> volatile union S144
    Essai_Fonction.c:29: error: (182) illegal conversion between types
    volatile union S144 -> unsigned long
    Essai_Fonction.c:29: error: (181) non-scalar types can't be converted to other types
    Essai_Fonction.c:30: warning: (373) implicit signed to unsigned conversion
    Essai_Fonction.c:32: warning: (373) implicit signed to unsigned conversion
    Essai_Fonction.c:33: warning: (373) implicit signed to unsigned conversion
    Essai_Fonction.c:43: warning: (373) implicit signed to unsigned conversion
    Essai_Fonction.c:44: error: (255) not a member of the struct/union ""
    Essai_Fonction.c:44: error: (182) illegal conversion between types
    int -> volatile union S144
    Essai_Fonction.c:44: error: (182) illegal conversion between types
    volatile union S144 -> unsigned long
    Essai_Fonction.c:44: error: (181) non-scalar types can't be converted to other types
    Essai_Fonction.c:46: error: (255) not a member of the struct/union ""
    Essai_Fonction.c:46: error: (182) illegal conversion between types
    int -> volatile union S144
    Essai_Fonction.c:46: error: (312) ")" expected
    Essai_Fonction.c:46: error: (199) logical type required
    NOT volatile union S144
    Essai_Fonction.c:46: error: (195) expression syntax
    Essai_Fonction.c:51: advisory: (1) too many errors (21)
    (908) exit status = 1
    Je m’excuse pour mon amateurisme mais je débutes.

  10. #9
    Jack

    Re : PIC - Fonction courant min d'une courbe

    Tu eux commencer à modifier les erreurs dont j'ai parlé.

  11. #10
    Chanur

    Re : PIC - Fonction courant min d'une courbe

    Code:
    Essai_Fonction.c:20: error: (188) constant expression required
        En C, les dimensions d'un tableau sont forcément des constantes. Mais tu déclares "unsigned long Tab_I[Pts_Tdeg+1][2]"
        3 possibilités au choix :
            => compiler en C++
            => remplacer le tableau par un tableau de taille fixe
            => utiliser une allocation dynamique
    Essai_Fonction.c:21: error: (255) not a member of the struct/union ""
    Essai_Fonction.c:21: error: (182) illegal conversion between types int -> volatile union S144
    Essai_Fonction.c:21: error: (182) illegal conversion between types volatile union S144 -> unsigned long
    Essai_Fonction.c:21: error: (181) non-scalar types can't be converted to other types
     Le #define du fichier Def_Essai.h est absurde : Tu dis au compilateur de remplacer la chaine de caractères "I_Mesure" par la chaine de caractères "ANSELBbits.ANSB3 = 1;"
        Donc ta déclaration devient :
        unsigned long I_Min = ANSELBbits.ANSB3 = 1;;
            Comme je ne connais pas "ANSELBbits" je ne peux pas t'en dire beaucoup plus, mais manifestement ANSELBbits.ANSB3 ne peut pas recevoir une valeur de type int ni être convertie en unsigned long
            De toutes façons, à quoi sert ce #define ??? Je ne comprends pas ce que tu cherches à faire.
    Essai_Fonction.c:28: warning: (373) implicit signed to unsigned conversion
    Essai_Fonction.c:28: warning: (373) implicit signed to unsigned conversion
    Essai_Fonction.c:28: error: (182) illegal conversion between types void -> unsigned long
    Essai_Fonction.c:28: error: (181) non-scalar types can't be converted to other types
        Tu mélanges les entiers signés et non signés, ce qui n'est pas très sain
        (au passage, tu sais que 50/Pts_Tdeg est une division entre deux entiers dont le résultat est un entier, n'est-ce pas ? En particulier si Pts_Tdeg est supérieur à 50, ça vaut 0)
     La fonction Config_Tdeg est déclarée de type void (elle ne retourne aucune valeur) donc tu ne peux pas utiliser sa valeur de retour
    Essai_Fonction.c:29: warning: (373) implicit signed to unsigned conversion
    Essai_Fonction.c:29: error: (255) not a member of the struct/union ""
    Essai_Fonction.c:29: error: (182) illegal conversion between types int -> volatile union S144
    Essai_Fonction.c:29: error: (182) illegal conversion between types volatile union S144 -> unsigned long
    Essai_Fonction.c:29: error: (181) non-scalar types can't be converted to other types
        Même erreur qu'à la ligne 21 : ton #define donne :
        Tab_I[i][1] = ANSELBbits.ANSB3 = 1;;
    Essai_Fonction.c:30: warning: (373) implicit signed to unsigned conversion
    Essai_Fonction.c:32: warning: (373) implicit signed to unsigned conversion
    Essai_Fonction.c:33: warning: (373) implicit signed to unsigned conversion
    Essai_Fonction.c:43: warning: (373) implicit signed to unsigned conversion
        Je ne sais pas très bien pourquoi. Il me semble que toutes les variables concernées sont unsigned et que le compilateur soit un peu dans les choux à cause des erreurs dans tes déclarations précédentes
        A ce stade, il est plus prudent de commencer par corriger les erreurs précédentes et recompiler
    Essai_Fonction.c:44: error: (255) not a member of the struct/union ""
    Essai_Fonction.c:44: error: (182) illegal conversion between types int -> volatile union S144
    Essai_Fonction.c:44: error: (182) illegal conversion between types volatile union S144 -> unsigned long
    Essai_Fonction.c:44: error: (181) non-scalar types can't be converted to other types
        Même erreur qu'à la ligne 21
    Essai_Fonction.c:46: error: (255) not a member of the struct/union "" 
    Essai_Fonction.c:46: error: (182) illegal conversion between types int -> volatile union S144
    Essai_Fonction.c:46: error: (312) ")" expected
    Essai_Fonction.c:46: error: (199) logical type required NOT volatile union S144
    Essai_Fonction.c:46: error: (195) expression syntax
        Idem, en pire : le point-virgule au milieu de l'expression logique devient une pure erreur de syntaxe :
        while (ANSELBbits.ANSB3 = 1; < I_Min)
    Essai_Fonction.c:51: advisory: (1) too many errors (21)
        Je suis entièrement d'accord avec le compilateur sur ce point.
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  12. #11
    Jack

    Re : PIC - Fonction courant min d'une courbe

    En C, les dimensions d'un tableau sont forcément des constantes. Mais tu déclares "unsigned long Tab_I[Pts_Tdeg+1][2]" 3 possibilités au choix :
    => compiler en C++
    Pas possible du tout en C++
    En C les tableaux à taille variable sont possibles à partir de C99.

  13. #12
    Chanur

    Re : PIC - Fonction courant min d'une courbe

    Citation Envoyé par Jack Voir le message
    Pas possible du tout en C++
    Ah ? pourquoi ?


    Citation Envoyé par Jack Voir le message
    En C les tableaux à taille variable sont possibles à partir de C99.
    Merci de cette précision. Comme personnellement, je suis passé du C ANSI au C++, je n'ai pas suivi le détail de l'évolution.
    Ce qui se conçoit bien s'énonce clairement ; et les mots pour le dire arrivent aisément.

  14. #13
    Jack

    Re : PIC - Fonction courant min d'une courbe

    Citation Envoyé par Chanur Voir le message
    Ah ? pourquoi ?
    Parce que la norme ne le permet pas. C'est pour cela qu'il existe les std::array.

  15. #14
    BroTech03

    Re : PIC - Fonction courant min d'une courbe

    Désolé pour le temps de réponse. Je viens de finir de reprendre les différentes erreurs.
    J'ai toujours des doutes sur :
    - les conflits entre int et float
    - les boucles do...while succesives qui me renvoient des messages "unexpected token : do..."

    Je penses avoir pris en compte toutes vos remarques. Pouvez vous m'aider à améliorer ce code par rapport à mon idée de départ.

    Code:
    #include <xc.h>                        
    #include <pic16f18345.h>
    #include "Def_Essai.h"
    #define _XTAL_FREQ 8000000
    
    void main ()
    {
        TRISCbits.TRISC1 = 1;
        ANSELCbits.ANSC1 = 1;           // utilisation de l'entrée RC1 comme entrée analogique (ANC1)(désactivation du buffer numérique d'entré)
        
        Ctrl_Tdeg( );
             
    }
    
    void Config_Tdeg( unsigned long Temp )
    {
        
    }
    
    int Lecture_ADC (void)
    {   
        // Initialisation de l'ADC
        ADCON1bits.ADFM = 1;                      
        ADCON1bits.ADCS = 0b101;                    
        ADCON1bits.ADNREF = 0;                      	
        ADCON1bits.ADPREF = 0b00;                   
    
        // Lecture d'une broche d'entrée analogique
        ADCON0bits.CHS = 0b01001;                   
        ADCON0bits.ADON = 1;                       
    
        __delay_us(5);                              
    
        ADCON0bits.GO = 1;                          
        while(ADCON0bits.GO==1);                    
        return((ADRESH<<8)+ADRESL);               
    }
    
    int Ctrl_Tdeg ( void )
    {
        int Tab_I[11][2] = {0};                     // Définition d'un tableau de taille fixe  (Colonne 0 : Tdeg et colonne 1 : I)
        int I_Min = Lecture_ADC();        
        int TdegI_Min;
        float Pas = 5;
         
        // Boucle 1 : on enregistre dans le tableau le courant mesuré 
        for (int i=0;i<=10;i++)
        {
            Config_Tdeg(15+(i*(50/10)));            // Appel la fonction Config_Tdeg( unsigned long Tdeg_Consigne) qui envoie la consigne de température sur le circuit pour 15°C à 65°C
            Tab_I[i][0] = (15+(i*(50/10)));		
            Tab_I[i][1] = Lecture_ADC();
            if (Tab_I[i][1] < I_Min) 
            {
                TdegI_Min = Tab_I[i][0];
                I_Min = Tab_I[i][1];
            }
        }
    
        // Boucle 2 : Pour un nombre de points en température, on connait le point de courant minimum. On va donc incrémenter/décrementer pour se rapprocher de la valeur minimum de la courbe
        do
        {
            do
            {
                TdegI_Min += ((50/10)/Pas);
                I_Min = Lecture_ADC(); 
            }
            while (Lecture_ADC() < I_Min);       
           
            do
            {
                TdegI_Min -= ((50/10)/Pas);
                I_Min = Lecture_ADC();            
            }
            while (Lecture_ADC() < I_Min);
        }
        while((Pas >= (1/2)) && (15 < TdegI_Min) && (TdegI_Min < 65)) ;    
        return ( TdegI_Min );
    }
    Résultat de compilation :
    BUILD SUCCESSFUL (total time: 366ms)
    Merci pour votre aide.

  16. #15
    BroTech03

    Re : PIC - Fonction courant min d'une courbe

    Quelqu'un pour me faire un retour sur le code ?
    Svp. Merci

  17. #16
    BroTech03

    Re : PIC - Fonction courant min d'une courbe

    Svp quelqu'un peut il me faire un retour.

  18. #17
    BroTech03

    Re : PIC - Fonction courant min d'une courbe

    Bon je présume que l'on fermer la discussion si il n'y a pas de retours ?

Discussions similaires

  1. [Master (M1-M2)] Détermination de l'amplitude d'un courant courbe I/V
    Par Meiosis dans le forum Exercices en biologie
    Réponses: 2
    Dernier message: 28/02/2016, 23h48
  2. Lecture d'une courbe de puissance moteur courant continu
    Par bblanchon dans le forum Électronique
    Réponses: 8
    Dernier message: 22/11/2012, 05h51
  3. Détermination d'une fonction exponentielle décroissante en fonction de sa courbe
    Par Julio15 dans le forum Mathématiques du collège et du lycée
    Réponses: 15
    Dernier message: 24/05/2012, 21h59
  4. courbe courant tension d'une lampe
    Par yvan30 dans le forum Électronique
    Réponses: 18
    Dernier message: 28/02/2010, 10h51
  5. Réponses: 2
    Dernier message: 11/09/2008, 18h14