Conversion A/N : Utilisation de ADRESH+ADRESL
Répondre à la discussion
Page 1 sur 3 12 DernièreDernière
Affichage des résultats 1 à 30 sur 89

Conversion A/N : Utilisation de ADRESH+ADRESL



  1. #1
    jorg1n

    Conversion A/N : Utilisation de ADRESH+ADRESL


    ------

    Bonjour,

    Le principe de mon sujet est de mesurée la température à l'aide d'un LM335Z. Et je récupère la tension, qui varie entre 2,33V et 3,43V (pour une température allant de -40 à +70°C) sur l'entrée analogique AN0. Je sais comment récupérer le résultat de la conversion quand c'est sur 8bits:
    Code:
    Van0=(float)(ADRESH)*q;
    Mais comment on fait si on veut récupérer le résultat sur 10 bits, avec donc ADRESH et ADRESL?

    Je vous remercie d'avance
    Nicolas

    -----

  2. #2
    invite74b5b8f7

    Re : Conversion A/N : Utilisation de ADRESH+ADRESL

    Salut,

    Il manque un peu des infos (que contiennent ADRESH et ADRESL?quel processeur ou convertisseur?) Est ce que tu as besoin d´aide pour récupérer les données d´un convertisseur ou simplement pour "ordonner" tes 10bits?

    Sinon: pour "ordonner" 10 bits, c´est les 2 bits de poids forts multipliés par 256 (2^8) plus les 8 bits de poids faibles

    Si par exemple dans ADRESH tu as juste tes 2 bits de poids forts et dans ADRESL tes 8 autres bits alors tu fais:
    Van0 = (float)(ADRESH*256 + ADRESL)*q;
    (si q est bien comme je l´ais compris ton facteur pour avoir un résultat en degrés par exemple)

  3. #3
    jorg1n

    Re : Conversion A/N : Utilisation de ADRESH+ADRESL

    C'est vrai, j'ai pas donnée beaucoup d'informations:
    j'utilise un PIC 18F4525, la justification est faite à droite(Bit ADFM de ADCON2 est à 1),j'utilise donc le convertisseur 10bits du PIC 18F4525.
    Mais je crois que tu m'as donné la réponse...je vais mettre ça en application et je vous tiens au courant.

    Encore merci lil-vince

    Nicolas

  4. #4
    jorg1n

    Re : Conversion A/N : Utilisation de ADRESH+ADRESL

    Bon, j'ai un autre petit problème, pour verifier que je réalise bien la conversion, j'ai fais un petit test d'affichage sur LED(je n'ai pas d'afficheur LCD...)
    et donc après la conversion je réalise ce calcul:
    Code:
    Van0=(float)(ADRESH*256 + ADRESL)*q;			// calcul la tension sur AN0
    pour déterminer la tension présente sur AN0. Avec q=4.88000e-3.
    Et a la suite de cela je fais un petit test:
    Code:
    if(Van0>=2.93 && Van0<=2.98)
    	{
    	RA3=0;
    	RA4=1;
    	RA5=0;
    	BUZZER=0;
    	}
    
    if(Van0>2.98 && Van0<=3.03)
    	{
    	RA3=0;
    	RA4=0;
    	RA5=1;
    	BUZZER=0;
    	}
    
    if(Van0>3.03)
    	{
    	RA3=0;
    	RA4=0;
    	RA5=0;
    	BUZZER=1;
    	}
    
    if(Van0<2.93)
    	{
    	RA3=1;
    	RA4=0;
    	RA5=0;
    	BUZZER=0;
    	}
    Avec RA3 RA4 et RA5 des DEL et BUZZER....un buzzer,mais lorsque je fais cela, je n'ai que RA3=1 alors que j'ai fait varier la température...

    Normalement j'ai
    -40°C < T°C < +70°C
    2,33V < Van0< 3,43V
    478 < van0 (EN BASE 10) < 703
    1 1101 1110 < vAN0 (en BINAIRE) < 10 1011 1111
    et inversement...

    Je pense que le principe est bon mais c'est "q"...est il bon?

    q=Vcc/(2^n-1)=5/(2^10-1)=5/(1024-1)=4,88mV

    Vous en pensez quoi....
    Merci d'avance
    Nicolas

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

    Re : Conversion A/N : Utilisation de ADRESH+ADRESL

    Ton calcul de Q est bon (d´ailleurs simple à vérifier: 478*4,88e-3 = 2,33 et pareil pour 703)

    Ta LED RA3 est toujours allumées ou seulememt quand Van0 <2,93 ?

    Par contre si le buzzer ne marche pas, ca vient d´ailleurs (ou peut-être d´ailleurs ET des paranthèses)

    Essaye de mettre des paranthèses pour tes opérateurs && (j´ai déjà eu ce problème: pas de paranthèses autour des opérateurs et ca ne marche pas et avec paranthèses ca marche!):

    if((Van0>2.98) && (Van0<=3.03))

  7. #6
    Seb.26

    Re : Conversion A/N : Utilisation de ADRESH+ADRESL

    Pour ton problème, des
    if( ... )
    {
    ...
    }
    else if( ... )
    {
    ...
    }
    else
    {
    ...
    }
    ne font jamais de mal ... mais le problème n'est pas là je pense ...
    Dernière modification par Seb.26 ; 12/02/2008 à 11h56.

  8. #7
    invite74b5b8f7

    Re : Conversion A/N : Utilisation de ADRESH+ADRESL

    Peut-être aussi que ca vient de ta conversion en float?
    Ca fait un moment que j´en ais plus fait, mais si Van0 est un float, le fait de multiplier ADRES(H et L) par q devrait suffire, non?

  9. #8
    invite74b5b8f7

    Re : Conversion A/N : Utilisation de ADRESH+ADRESL

    Pourquoi t´as enlevé tes questions SEb.26? elles n´étaient pas bêtes (je t´ai grillé )

    Est-ce que ton A/D travail bien sur une plage de 0 à 5V?
    (d´après ce que je viens de lire vite fait: VCFG1 et VCFG0 = 0 dans le registre ADCON1)

    Sinon, tu n´as aucun moyen de voir ce que tu récupère en sortie de ton convertisseur? Ca serait bien de pouvoir vérifier tes 478 et 703 déjà...
    Il faut toujours essayer de cerner le problème-> si par exemple tu penses que c´est ton q qui est faux, tu l´enlève et tu fais tes tests en comparant les valeurs de Van0 par rapport à 478 et 703, etc...

  10. #9
    jorg1n

    Re : Conversion A/N : Utilisation de ADRESH+ADRESL

    Bon j'ai fais les petites modifications ( en ce qui concerne les parenthèses...)...
    J'ai fais un test aussi, j'ai fait comme calcul:
    Code:
    Van0=(float)(ADRESH*256 + ADRESL)*q*1.2;			// calcul la tension sur AN0
    Et la j'ai la LED RA5 qui s'allume... et si je multiplie par 2, j'ai le buzzer qui s'allume, donc la conversion fonctionne...mais il y a un décalage.
    Est-ce que ton A/D travail bien sur une plage de 0 à 5V?
    (d´après ce que je viens de lire vite fait: VCFG1 et VCFG0 = 0 dans le registre ADCON1)
    Les références de tensions sont bien vdd et vss d'où les valeurs de VCFG1 et VCFG0.
    Sinon, tu n´as aucun moyen de voir ce que tu récupère en sortie de ton convertisseur? Ca serait bien de pouvoir vérifier tes 478 et 703 déjà...
    Je n'ai aucun moyen...

    Je sens que je suis pres du but!!!!mais....

    Encore merci

    Nicolas

  11. #10
    Seb.26

    Re : Conversion A/N : Utilisation de ADRESH+ADRESL

    Essaye de decomposer ( pour voir... )
    Van0 = (float)ADRESH;
    Van0 = Van0*256 + (float)ADRESL;
    Van0 = Van0*q;
    Ou alors teste ton code sur un PC pour voir ( ton compilo est ANSI ? )

    [Edit] T'es sûr que c'est ADRESH*256+ADRESL qu'il faut faire ??? ... c'est pas plutôt (ADRESH<<2) | (ADRESL&0x03) ...

    Tu as quoi comme uCPU ?
    Dernière modification par Seb.26 ; 12/02/2008 à 12h55.

  12. #11
    jorg1n

    Re : Conversion A/N : Utilisation de ADRESH+ADRESL

    Mon µC est un 18F4525...
    je vais essayer de décomposer...
    Pour ADRESH*256, je ne sais pas, c'est lil vince qui me la dit
    je vous tiens au courant
    encore merci
    Nicolas

  13. #12
    invite74b5b8f7

    Re : Conversion A/N : Utilisation de ADRESH+ADRESL

    c'est pas plutôt (ADRESH<<2) | (ADRESL&0x03)
    Pour moi c´est la même chose...
    Tu as quoi comme uCPU ?
    j'utilise un PIC 18F4525,
    Moi j´essayerais de travailler d´abord avec des entiers pour la récupération des données du convertisseur...

  14. #13
    invite74b5b8f7

    Re : Conversion A/N : Utilisation de ADRESH+ADRESL

    Et tu mets juste un seuil, par exemple si Van0< 600 diode RA1 allumée et si Van0>600 diode RA2 comme ca tu vois pour quelle température t´as 600 en sortie du convertisseur, etc....

  15. #14
    Seb.26

    Re : Conversion A/N : Utilisation de ADRESH+ADRESL

    Citation Envoyé par jorg1n Voir le message
    Mon µC est un 18F4525...
    je vais essayer de décomposer...
    Pour ADRESH*256, je ne sais pas, c'est lil vince qui me la dit
    je vous tiens au courant
    encore merci
    Nicolas
    Si tu veux, mais AMA le problème est en amont, tu as mis quoi comme ADFM ?

  16. #15
    Seb.26

    Re : Conversion A/N : Utilisation de ADRESH+ADRESL

    Citation Envoyé par lil-vince Voir le message
    Pour moi c´est la même chose...
    Alors il va falloir remettre le nez dans K&R ... "ADRESH*256 + ADRESL" n'a rien à voir avec "(ADRESH<<2) | (ADRESL&0x03)"

    ... Mais c'est l'un ou l'autre de toute façon ( en fonction de ADFM ) ... Mais comme je le soupçonne de ne pas avoir modifié ADFM, il doit être par defaut réglé pour une lecture 8bits ... donc "ADRESH*256 + ADRESL" donne n'importe quoi ...

    ...à suivre...

  17. #16
    jorg1n

    Re : Conversion A/N : Utilisation de ADRESH+ADRESL

    En ADFM, j'ai mis 1, pour la justification a droite...
    Voila mon programme entier:
    Code:
    /***************************************************************************
    **************************PROGRAMME PRINCIPAL*******************************
    ***************************************************************************/
    //fichier de declaration des registres internes du microcontroleur
    #include <p18f4525.h>
    #include <delays.h>
    #include <adc.h>
    #include <stdlib.h>
    
    //Déclaration des PORTXbits.RXX utilisés
    #define BUZZER PORTBbits.RB3
    #define RA5 PORTAbits.RA5 
    #define RA4 PORTAbits.RA4 
    #define RA3 PORTAbits.RA3
    
    //Déclaration des quantum
    #define q 4.880e-3	// quantum pour un CAN 10bits 0v-5v
    
    //Configuration Bits
    #pragma config OSC = HS			//OSCILLATOR
    #pragma const config FCMENB = OFF	//Fail Safe Clock Monitor Disabled
    #pragma const config IESOB = OFF	//Internal External Osc. Switch Disabled
    #pragma config PWRT = OFF		//Power Up Timer Disabled
    #pragma const config BOR = BOHW 	//Brown Out Reset Enabled in HW, SBOREN disabled
    #pragma const config BORV = 20		//Brown Out Voltage : 2.0V
    #pragma config WDT = OFF		//WATCHDOG HW Disabled - SW Controlled
    #pragma config DEBUG = OFF		//DEBUG Disabled
    #pragma config LVP = OFF		//Low Voltage Programming Disabled
    
    //Sous programmes
    void init_uc(void);
    void conv_AD_TBatt(void);
    void calculTemp(void);
    
    //Déclarations des variables
    float Tbatt=0.00;
    float Van0=0.00;
    
    /***************************************************************************
    *********************Programme Principal************************************
    ***************************************************************************/
    void main (void)
    {
    init_uc();				//Appel SP Initialisation du microcontroleur
    
    while(1)
    {
    conv_AD_TBatt();
    
    if(Van0>3.00)
    	{
    	RA3=0;
    	RA4=0;
    	RA5=0;
    	BUZZER=1;
    	}
    
    if(Van0<=3.00)
    	{
    	RA3=0;
    	RA4=1;
    	RA5=0;
    	BUZZER=0;
    	}
    
    }//Fin While(1)
    }//Fin Programme Principal
    
    /***************************************************************************
    Nom   : void init_uc(void)
    Role  : Configuration et initialisation des Ports E/S
    ----------------------------------------------------------------------------
    Contraintes           : Aucune
    Donnees en entree     : Aucune
    Donnees en sortie     : Aucune
    Donnees glob. modif.  : Aucune
    *****************************************************************************/
    void init_uc(void)
    {
     ADCON1=0x0E;					// Configuration AN0 en analogique--reste en numérique
     TRISA=0x01;					// PORTA en sortie sauf RA0
     TRISB=0xC7;					// RB0->RB2 & RB6-RB7 en entrée -- reste en sortie
     TRISC=0x00;					// PORTC en sortie
     TRISD=0x00;					// PORTD en sortie
     TRISE=0x00;					// PORTE en sortie
    
     PORTA=0x00;					//
     PORTB=0x00;					///
     PORTC=0x00;					////Initialisation à 0 des Ports
     PORTD=0x00; 					///
     PORTE=0x00;					//
    }
    
    /***************************************************************************
    Nom   : void conv_AD_TBatt(void)
    Role  : 
    ----------------------------------------------------------------------------
    Contraintes           : Aucune
    Donnees en entree     : Aucune
    Donnees en sortie     : Aucune
    Donnees glob. modif.  : Aucune
    *****************************************************************************/
    void conv_AD_TBatt(void)
    {
    ADCON0=0x01;			// Sélection AN0 / CAN ON. 
    ADCON2bits.ADFM=1;			//justification a droite
    ADCON0bits.GO_DONE=1;		// Start OC
    while(ADCON0bits.GO_DONE);	// attend EOC
    ADCON0bits.GO_DONE=0;		// End OC
    calculTemp();			// Calcul de la température batterie
    ADCON0=0x00;			// CAN OFF. 	
    }
    
    /***************************************************************************
    Nom   : void calculTemp(void)
    Role  : Calcul de la température suite à la convAD
    ----------------------------------------------------------------------------
    Contraintes           : Aucune
    Donnees en entree     : Aucune
    Donnees en sortie     : Aucune
    Donnees glob. modif.  : Aucune
    *****************************************************************************/
    void calculTemp(void)
    {
    Van0 =(float)((ADRESH<<2) | (ADRESL&0x03));
    //Van0 = (float)ADRESH;
    //Van0 = Van0*256 + (float)ADRESL;
    Van0 = Van0*q;			// calcul la tension sur AN0
    //Tbatt=(float)(Van0*100-273.15);		// Calcul de la température
    }
    Si vous voyez une erreur...
    Merci encore
    Nicolas

  18. #17
    invite74b5b8f7

    Re : Conversion A/N : Utilisation de ADRESH+ADRESL

    Au dessus il a déjà dit qu´il l´a mit a 1...
    Alors il va falloir remettre le nez dans K&R
    C´est quoi K&R ???

  19. #18
    invite74b5b8f7

    Re : Conversion A/N : Utilisation de ADRESH+ADRESL

    Bon,dsl, mais faut que je bosse...

    "ADRESH*256 + ADRESL" n'a rien à voir avec "(ADRESH<<2) | (ADRESL&0x03)"
    Oui pardon, d´ailleurs je vois pas trop l´interêt???

  20. #19
    jorg1n

    Re : Conversion A/N : Utilisation de ADRESH+ADRESL

    Merci en tout cas pour ton aide lil vince

  21. #20
    Seb.26

    Re : Conversion A/N : Utilisation de ADRESH+ADRESL

    Citation Envoyé par jorg1n Voir le message
    la justification est faite à droite(Bit ADFM de ADCON2 est à 1),j'utilise donc le convertisseur 10bits du PIC 18F4525.


    J'avais pas vus ... ... Donc il faut faire :
    Code:
    unsigned short toto = ((unsigned short)ADRESH)<<8 + ADRESL;

  22. #21
    Seb.26

    Re : Conversion A/N : Utilisation de ADRESH+ADRESL

    Citation Envoyé par lil-vince Voir le message
    Oui pardon, d´ailleurs je vois pas trop l´interêt???
    Ben il faut faire l'un ou l'autre, en fonction du ADFM ... c'est tout ...

    [Edit] sur son uCPU, il faudrait d'ailleur faire un ADRESH<<2 | ADRESL>>6 ... les 2 bits de poids faible étant calés à gauche ...

    ADFM: A/D Result Format Select (also see Figure 25-6)
    1 = Right justified. 6 Most Significant bits of ADRESH are read as ’0’.
    0 = Left justified. 6 Least Significant bits of ADRESL are read as ’0’.
    Dernière modification par Seb.26 ; 12/02/2008 à 13h43.

  23. #22
    jorg1n

    Re : Conversion A/N : Utilisation de ADRESH+ADRESL

    Désolé Seb26, mais je ne suis pas...
    Mon résultat de la conversion est bien stocké comme ça:

    000000XX XXXXXXXX
    ADRESH ADRESL

  24. #23
    invite74b5b8f7

    Re : Conversion A/N : Utilisation de ADRESH+ADRESL

    J'avais pas vus ... ... Donc il faut faire :
    Code:

    unsigned short toto = ((unsigned short)ADRESH)<<8 + ADRESL;
    Ah, bah quand même, c´est bien ce que je disais
    C´est pas toujours facile de se comprendre entre programmeurs (j´ai d´jà fait l´expérience avec un gars à qui j´avais expliqué un algo et on a programmé en parralèle et au final on avait la même chose (même effet) mais totalement faite différemment)

  25. #24
    invite74b5b8f7

    Re : Conversion A/N : Utilisation de ADRESH+ADRESL

    Désolé Seb26, mais je ne suis pas...
    Mon résultat de la conversion est bien stocké comme ça:

    000000XX XXXXXXXX
    ADRESH ADRESL
    Oui donc :
    unsigned short toto = ((unsigned short)ADRESH)<<8 + ADRESL;
    c´est exactement pareil que:
    unsigned short toto = (unsigned short)(ADRESH*256+ADRESL);

    (1 décalage à gauche = multiplication par 2 donc 8 décalages = multiplication par 2^8= 256)

  26. #25
    jorg1n

    Re : Conversion A/N : Utilisation de ADRESH+ADRESL

    et qu'es ce que je fais de toto après...
    Code:
    toto = ((unsigned short)ADRESH)<<8 + ADRESL; 
    toto=toto*q;
    ???
    et je remplace van0 par toto dans les comparaisons???
    Mais c'est pareil!!!

    Merci encore

  27. #26
    invite74b5b8f7

    Re : Conversion A/N : Utilisation de ADRESH+ADRESL

    Non si tu as un problème de conversion, essaye:

    toto = ((unsigned short)ADRESH)<<8 + ADRESL;
    Van0 = (float)toto;

    toto est un entier, la est la différence (mais peut-être que ca ne cangera rien...)

  28. #27
    jorg1n

    Re : Conversion A/N : Utilisation de ADRESH+ADRESL

    ça ne change rien....bizarre bizarre...

  29. #28
    invite74b5b8f7

    Re : Conversion A/N : Utilisation de ADRESH+ADRESL

    Et sinon comme je disais avant, je te conseil de faire tes tests directement sur toto, avec 1 seuil, etc...

  30. #29
    invite74b5b8f7

    Re : Conversion A/N : Utilisation de ADRESH+ADRESL

    T´as fait un test avec un seuil?

  31. #30
    jorg1n

    Re : Conversion A/N : Utilisation de ADRESH+ADRESL

    J'ai fais le test avec un seuil...et pour une tension en entrée sur AN0 de 2,97V,
    après calcul, la tension est de environ 0,62V....
    Code:
    if(Van0>0.62)
    	{
    	RA3=0;
    	RA4=0;
    	RA5=0;
    	BUZZER=1;
    la ça sonne....
    Code:
    if(Van0>0.63)
    	{
    	RA3=0;
    	RA4=0;
    	RA5=0;
    	BUZZER=1;
    la ça sonne plus....

    et comme calcul j'ai :
    Code:
    toto = ((unsigned short)ADRESH)<<8 + ADRESL; 
    Van0=(float)toto*q;
    dois je réhausser le q...mais la alors c'est de l'approximatif...

Page 1 sur 3 12 DernièreDernière

Discussions similaires

  1. PIC: Adresh/adresl
    Par Adrian1903 dans le forum Électronique
    Réponses: 8
    Dernier message: 18/05/2012, 00h15
  2. Conversion
    Par invite67c1fe3a dans le forum Physique
    Réponses: 7
    Dernier message: 20/10/2007, 22h07
  3. Conversion A/D
    Par Toufinet dans le forum Électronique
    Réponses: 10
    Dernier message: 26/05/2006, 11h25
  4. conversion
    Par invite4c1c58fb dans le forum Logiciel - Software - Open Source
    Réponses: 11
    Dernier message: 08/11/2005, 10h40
  5. Conversion DC/AC
    Par invitef7e7ab49 dans le forum Électronique
    Réponses: 6
    Dernier message: 08/06/2005, 16h48
Découvrez nos comparatifs produits sur l'informatique et les technologies.