[Programmation] PIC - fonction pow() et place mémoire
Répondre à la discussion
Affichage des résultats 1 à 14 sur 14

PIC - fonction pow() et place mémoire



  1. #1
    sandrecarpe

    PIC - fonction pow() et place mémoire


    ------

    Bonsoir à tous,

    Je suis en train de programmer un pic 8 bit (pic16f1777) pour un asservissement de température.
    J'ai une fonction qui fait deux trois calculs en faisant appel à la fonction pow() de <math.h>, et là, 25% d'espace programme bouffé !
    Okay faire des calculs sur des flottants sur un pic 8 bit a un coût, mais à ce point là ?

    Voici la fonction en question :

    Code:
    double servo_temperatureToNISTVoltage(double temperature){
    	//to convert LM35 temperature to thermoelectric voltage using NIST equations
    
    
    	const double c[6] = {
    		-0.176004136860e-1,
    		0.389212049750e-1,
    		0.185587700320e-4,
    		-0.994575928740e-7,
    		0.318409457190e-9,
    		-0.560728448890e-12
    	};
    
    
    	double voltage = 0;
    	uint8_t i = 0;
    	for(i = 0; i < 6; i++){
    
    		voltage += c[i]*pow(temperature, i);
    	}
    
    	voltage +=  a0*exp(a1*pow(temperature - a2, 2));
    
    	return voltage;
    
    }

    C'est bien la fonction pow() qui prend toute cette place. Si j'enlève le bout de code qui utilise cette fonction, je regagne mes 25% d'espace programme
    Pourquoi cette fonction prend autant de place ? Une telle implémentation sur un micro ce n'est pas bien pratique...
    Quelqu'un pourrait me fournir quelques explications ?


    Merci beaucoup !

    -----

  2. #2
    PA5CAL

    Re : PIC - fonction pow() et place mémoire

    Bonsoir

    La fonction pow() est conçue pour calculer le résultat d'un rationnel élevé à une puissance rationnelle (par exemple 12,34598,76) ces rationnels étant stockés sous forme de nombres flottants en double précision (double).

    Mais sa mise en œuvre est particulièrement coûteuse en ressources sur les micro-contrôleurs 8 bits, notamment sur ceux dépourvus de multiplication et de division câblées.

    Pour cette raison, utiliser cette fonction pour calculer des puissances entières est aberrant. Il serait grandement préférable d'utiliser de simples multiplications. Par exemple :

    Code:
      double pow_temp = temperature;
      uint8_t i = 0;
      double voltage = c[i];
      while(1) {
        voltage += c[++i]*pow_temp;
        if (i==5)
          break;
        pow_temp *= temperature;
      }
      pow_temp = temperature - a2;
      voltage +=  a0*exp(a1*pow_temp*pow_temp);

  3. #3
    sandrecarpe

    Re : PIC - fonction pow() et place mémoire

    Merci pour ta réponse.

    La fonction exp() à le même impacte. Afin de me passer de la fonction pow() et exp(), j'ai transformé ma fonction comme ça :

    Code:
    double servo_temperatureToNISTVoltage(double temperature){
    	//to convert LM35 temperature to thermoelectric voltage using NIST equations
    
    
    	const double c[6] = {
    		-0.176004136860e-1,
    		0.389212049750e-1,
    		0.185587700320e-4,
    		-0.994575928740e-7,
    		0.318409457190e-9,
    		-0.560728448890e-12
    	};
    
    
    	double voltage = 0;
    	uint8_t i = 0;
    	for(i = 0; i < 6; i++){
    
    		voltage += c[i]*power(temperature, i);
    	}
    
    	voltage +=  a0*power(EXP, a1*(temperature - a2)*(temperature - a2));
    
    	return voltage;
    
    }
    
    double power(double x, uint8_t n)
    {
        // initialize result by 1
        int pow = 1;
    
        // do till n is not zero
        while (n)
        {
            // if n is odd, multiply result by x
            if (n & 1)
                pow *= x;
    
            // divide n by 2
            n = n >> 1;
    
            // multiply x by itself
            x = x * x;
        }
    
        // return result
        return pow;
    }
    La fonction power() utilise la méthode d'exponentiation rapide (j'avoue avoir salement copier ça sur internet, mais pour le coup j'avais pas envie de regarder comment ça marche ). Ca à l'air d'être le meilleur algo pour ça
    J'avais choisis ce pic pour le détecteur de passage par zéro mais j'aurais peut-être mieux fait de partir sur un pic 16 bit avec FPU et faire mon propre détecteur de passage par 0

    EDIT : ah non pour l'exponentielle ça fonctionnera pas puisque ma fonction power() ne peut calculer que des puissances entières --'
    Dernière modification par sandrecarpe ; 17/06/2018 à 10h49.

  4. #4
    PA5CAL

    Re : PIC - fonction pow() et place mémoire

    Quelles sont les valeurs extrêmes de temperature (minimum et maximun), et quelle est la précision souhaitée pour le résultat du calcul ?

    Peux-tu également préciser les valeurs de a0, a1 et a2 ?
    Dernière modification par PA5CAL ; 17/06/2018 à 10h58.

  5. A voir en vidéo sur Futura
  6. #5
    sandrecarpe

    Re : PIC - fonction pow() et place mémoire

    Code:
    //coefficient thermocouple polynomial
    #define a0 (0.1185976)
    #define a1 (-0.1183432e-3)
    #define a2 (0.1269686e+3)
    Je pensais partir sur une interpolation polynomiale de cette fonction, je vais voir si ça donne un truc correct
    Je mesure une plage de température qui variera de la température ambiante d'une pièce (disons 15°C) jusqu'à 250°C. Avec une précision de 0.5°C (précision mini donnée par le LM35).

  7. #6
    paulfjujo

    Re : PIC - fonction pow() et place mémoire

    bonjour,

    Citation Envoyé par sandrecarpe Voir le message
    [CODE]... jusqu'à 250°C..

    à 250°C il va fondre ..ton capteur LM35 !
    c'est un thermocouple que tu veux etalonner ou le LM35 (relaticvement lineaire 10mV/°C ?)

    il existe des circuit integré étuudié pour , voir chez MAXIM MAX31855K
    Dernière modification par paulfjujo ; 17/06/2018 à 11h25.

  8. #7
    Gérard

    Re : PIC - fonction pow() et place mémoire

    0,5° de précision ne va pas être simple avec le LM35. Regarde le tableau page 8.
    http://www.ti.com/lit/ds/symlink/lm35.pdf

  9. #8
    PA5CAL

    Re : PIC - fonction pow() et place mémoire

    Ce que je demandais, c'est la précision escomptée du résultat du seul calcul, sans tenir compte de l'erreur déjà commise sur le mesure de la température.

    Cela permet de calibrer les coefficients de la fonction réalisant l'approximation du calcul ci-dessus.

  10. #9
    sandrecarpe

    Re : PIC - fonction pow() et place mémoire

    Citation Envoyé par paulfjujo Voir le message
    bonjour,
    à 250°C il va fondre ..ton capteur LM35 !
    Non lui il est pas dans le four !

    Le LM35 c'est pour la compensation, la "soudure froide". La mesure de température du four se fait avec un thermocouple. Mais il faut savoir que la partie électronique va se trouver pas loin du four, et la température ambiante pour l'électronique pourra atteindre sûrement quelques 50 ou 60°C en fonctionnement.

    Vous avez un autre CI à me proposer ? A vrai dire je ne sais pas vraiment si une précision de +/-1.5°C est grave. Je suis encore à l'étape de prototypage. Je suis partie sur cette solution parce qu'elle permet une meilleure précision que la méthode tout intégrée dans les CI comme ceux proposé par paulfjujo...mais à condition d'avoir une bonne référence de température !
    J'ai bien trouvé d'autres CI mais ils sont pas pratique à souder : AD7320

  11. #10
    sandrecarpe

    Re : PIC - fonction pow() et place mémoire

    Citation Envoyé par PA5CAL Voir le message
    Ce que je demandais, c'est la précision escomptée du résultat du seul calcul, sans tenir compte de l'erreur déjà commise sur le mesure de la température.

    Cela permet de calibrer les coefficients de la fonction réalisant l'approximation du calcul ci-dessus.
    Oups j'avais pas vu ton message.
    Dans l'hypothèse que je trouve une bonne référence de température pour obtenir une précision de 0.5°C, 3 chiffres significatif dans les calculs c'est pas mal non ?

  12. #11
    paulfjujo

    Re : PIC - fonction pow() et place mémoire

    Mais il faut savoir que la partie électronique va se trouver pas loin du four, et la température ambiante pour l'électronique pourra atteindre sûrement quelques 50 ou 60°C en fonctionnement.
    Le MAX31855 a une compensation de température interne ...


    tu peux toujours , prolonger la connection
    avec bornier compensé et cable compensé ... pour déporter l'electronique ..
    c'est courant en milieu industriel ( ou plutot c'etait courant !)
    ...d'ici à mettre un IOT ...et passer par le web !

    ou utiliser un transmetteur industriel local (dans la tete de sonde) Thermocouple / 4-20mA

  13. #12
    PA5CAL

    Re : PIC - fonction pow() et place mémoire

    Pour en revenir à ta fonction, j'ai regardé ce qu'elle donnait fonction avec les coefficients que tu as fournis. Il s'avère qu'elle est pratiquement linéaire, à quelques % près. Si tu souhaites juste avoir trois chiffres significatifs, alors une approximation polynomiale du second degré par morceaux (sur des plages de 50 unités de temperature) calculée en simple précision (float) apparaît comme très suffisante.
    Dernière modification par PA5CAL ; 17/06/2018 à 14h25.

  14. #13
    sandrecarpe

    Re : PIC - fonction pow() et place mémoire

    J'ai bien saisi qu'il y a deux types de solution assez courante :
    1 - prendre un CI qui s'occupe de tout, dont la compensation (c'est ce que tu me proposes)
    2 - Mesurer et traiter la tension du thermocouple, faire la compensation, et traiter tout ça numériquement

    J'ai choisi la solution n°2 pour les performances et les petits défis techniques qu'il y aurait. Avec tous les documents que j'ai lu, je conclus que cette solution reste la plus précise à condition de soigner sa référence de température. Comme beaucoup de solution intégrée que j'ai pu voir, la précision ne descend pas en dessous de +/-2°C. J'aimerais faire mieux que ça.

    Mettre toute l'électronique "dans le four" fait partie du défi. On veut vraiment qu'il s'utilise comme un four à gâteaux, on appuie sur un bouton et on attend...sauf qu'au lieu de mettre des gâteaux on mettra des PCB

    Citation Envoyé par PA5CAL Voir le message
    Pour en revenir à ta fonction, j'ai regardé ce qu'elle donnait fonction avec les coefficients que tu as fournis. Il s'avère qu'elle est pratiquement linéaire, à quelques % près. Si tu souhaites juste avoir trois chiffres significatifs, alors une approximation polynomiale du second degré par morceaux (sur des plages de 50 unités de temperature) calculée en simple précision (float) apparaît comme très suffisante.
    Super, merci pour ton retour, un coup de matlab et ce sera réglé !
    Dernière modification par sandrecarpe ; 17/06/2018 à 14h35.

  15. #14
    jiherve

    Re : PIC - fonction pow() et place mémoire

    Bonjour,
    pour compléter la remarque de PA5CAL tu peux tabuler la fonction, si elle est presque linéaire une interpolation du même bois suffira.
    Autrement on peut se passer de calculs flottants en ayant recours à des algorithmes de type CORDIC qui ne font intervenir que des additions/soustraction et des décalages avec de petites tables de constantes.
    Ou encore développer(en assembleur bien sur) sa propre librairie flottante qui n'embarquera que le strict nécessaire.
    JR
    l'électronique c'est pas du vaudou!

Discussions similaires

  1. [Outils/Fab/Comp] mise en place de batterie rechargeable pour VMU (carte mémoire Dreamcast)
    Par maxmoum24 dans le forum Électronique
    Réponses: 6
    Dernier message: 30/03/2016, 18h46
  2. linux : place de la mémoire d'une variable
    Par cosmoff dans le forum Programmation et langages, Algorithmique
    Réponses: 2
    Dernier message: 16/10/2015, 04h39
  3. Plus de place mémoire dans mon compilateur (GRRRRR)
    Par paolo123 dans le forum Électronique
    Réponses: 27
    Dernier message: 31/12/2011, 10h52
Découvrez nos comparatifs produits sur l'informatique et les technologies.