Bonjour, cliquez-ici pour vous inscrire et participer au forum.
  • Login:



+ Répondre à la discussion
Page 3 sur 4 PremièrePremière 3 DernièreDernière
Affichage des résultats 31 à 45 sur 47

Convertisseur Analogique numérique pic 18f

  1. Qristoff

    Date d'inscription
    janvier 2009
    Localisation
    Drôme des collines
    Âge
    52
    Messages
    5 376

    Re : Convertisseur Analogique numérique pic 18f

    Bonjour,
    Le PIC18 doit avoir comme les autres pics un multiplexeur interne, il suffit donc de brancher ton deuxième capteur sur une autre pin configurée en entrée analogique ! et de sélectionner la voie dans le programme !

    -----

    Tout existe, il suffit de le trouver...!
     


    • Publicité



  2. Ticlem

    Date d'inscription
    octobre 2007
    Messages
    99

    Re : Convertisseur Analogique numérique pic 18f

    Ah oki donc est-ce que la manière dont je l'ai fait poste #20 (2ème programme) est bonne?
     

  3. Ticlem

    Date d'inscription
    octobre 2007
    Messages
    99

    Re : Convertisseur Analogique numérique pic 18f

    Une idée mevient en tête concernant le changement de voie,

    L'idée serait d'avoir un flag de fin de conversion de l'ADC et ma condition de changement de voie serait :
    Attendre que l'ADC soit inactif et appuie sur le bouton (intérruption sur rb0 par exemple)

    Dans ce cas je suis sur de bien laisser le temps à L'ADC de faire son travail et de ne pas le couper en pleine conversion.
    Qu'en pensez vous?
     

  4. Forhorse

    Date d'inscription
    décembre 2010
    Messages
    1 748

    Re : Convertisseur Analogique numérique pic 18f

    T'es vraiment obligé d'utiliser un bouton pour le changement de voie ? ça me semble peu conventionnel comme méthode et pas pratique. généralement on procède ainsi :
    - selection de la voie
    - mise en marche de la conversion
    - attente de la fin de conversion
    -lecture du résultat
    - sélection d'une autre voie
    - mise en marche de la conversion
    - ...
    - retour à la première voie
    - etc
    Et ce aussi souvent que possible ou nécessaire

    Pourquoi vouloir utiliser un bouton pour changer de voie ? Sachant que sans ça le PIC peut lire plusieurs centaines de fois par seconde les différentes voies utilisées...
    Tout projet flou conduit à une connerie précise !
     

  5. Ticlem

    Date d'inscription
    octobre 2007
    Messages
    99

    Re : Convertisseur Analogique numérique pic 18f

    Le résultat final est d'affiché sur LCD la valeur d'un capteur : exemple température d'huile.
    Puis avec un appui sur bouton on change la voie donc on affiche sur le LCD la valeur d'un autre capteur : exemple pression d'huile.

    Ainsi l'utilisateur peut "selectionner" la valeur du capteur qu'il souhaite et voir la valeur évoluer.

    Alors que si je fais comme tu (Forhorse) le dis (et que je trouve très juste) ça oblige l'utilisateur à voir défiler les valeurs de tous les capteurs (une petite dizaine) sans pouvoir stopper ce défilement.

    Le système serait monté dans une voiture de sport et typiquement je veux que l'utilisteur puisse visualiser que la température d'huile avant de commencer à monter dans les tours.
     


    • Publicité



  6. Forhorse

    Date d'inscription
    décembre 2010
    Messages
    1 748

    Re : Convertisseur Analogique numérique pic 18f

    faire la capture et enregistrer les valeurs n'oblige pas forcement à les afficher.
    Si elles sont là tu peux profiter du temps processeur disponible pour faire des traitements (moyenne de plusieurs mesures par exemple) sur ces valeurs plutôt que des tout enchainer à la suite.
    Dans un programme il faut bien faire la distinction entre acquisition des données, traitement des données, et affichage des données.
    Tout projet flou conduit à une connerie précise !
     

  7. Forhorse

    Date d'inscription
    décembre 2010
    Messages
    1 748

    Re : Convertisseur Analogique numérique pic 18f

    Pour illustrer ce que je dis, imagine que dans ton application tu ailles plus loin que le simple affichage sur un écran et que tu veuilles declancher une alarme si certaines valeurs atteigne une valeur critique.
    Si en arrière plan tu ne continue pas à faire l'acquisition de TOUTES les voies, tu ne peux pas les surveiller et donc pas d'alarme possible.
    Tout projet flou conduit à une connerie précise !
     

  8. Ticlem

    Date d'inscription
    octobre 2007
    Messages
    99

    Re : Convertisseur Analogique numérique pic 18f

    Citation Envoyé par Forhorse Voir le message
    Pour illustrer ce que je dis, imagine que dans ton application tu ailles plus loin que le simple affichage sur un écran et que tu veuilles declancher une alarme si certaines valeurs atteigne une valeur critique.
    Si en arrière plan tu ne continue pas à faire l'acquisition de TOUTES les voies, tu ne peux pas les surveiller et donc pas d'alarme possible.
    Ah oui je comprend mieux en effet tu as raison, il faudrait que je fasse une sorte de buffer(ou FIFO). Finalement je viens traiter et afficher les données avec un petit temps de retards qui me permet d'avoir des données en avance et ceux sur toutes les voies. Je comprend bien le principe mais je ne sais pas faire avec un µc.

    Donc dans l'idée je fais une fonction qui réalise l'acquisition :
    - selection de la voie
    - mise en marche de la conversion
    - attente de la fin de conversion
    -lecture du résultat
    - sélection d'une autre voie
    - mise en marche de la conversion
    - ...
    - retour à la première voie
    - etc

    Mais après comment remplir un buffer et comment savoir retrouver quelles valeurs appartiennent à quelles voies, faut il faire un buffer par voie?
    La taille du buffer sera défini en fonction du retard avec lequel je souhaite afficher les informations (très court dans tous les cas).

    Puis je récupère une à une les valeurs du Buffer et je fais traitement souhaite, typiquement conversion dans l'unité souhaité et vérification de valeur min et max.

    J'affiche les données, du coup complètement indépendant du travail de l'ADC.
     

  9. Forhorse

    Date d'inscription
    décembre 2010
    Messages
    1 748

    Re : Convertisseur Analogique numérique pic 18f

    Le "buffer" comme tu l'appel n'est nécessaire que si tu as besoin de plusieurs lecture d'une voie pour faire un traitement. Si c'est juste une valeur instantanée que tu veux afficher il n'a aucune raison d'être.
    A chaque lecture de la voie tu met à jour une variable, après que tu te serve de la valeur de cette variable ou non, ce n'est pas grave, elle est là.
    L’écrasement des mesures plus ancienne n'est pas grave, puisque de toutes façon avec ce que tu voulais faire au départ, tu ne les aurais de toutes façons pas eue !
    Tout projet flou conduit à une connerie précise !
     

  10. Ticlem

    Date d'inscription
    octobre 2007
    Messages
    99

    Re : Convertisseur Analogique numérique pic 18f

    En effet mais si finalement je decide de sauvegarder l'ensemble des donnees sur un support physique afin de pouvoir faire du traitement de donnees, serait trop complique?

    Sinon il faudrait que je fasse une lecture de toute les voie en continue (comme on la vu precedemment) et j'enregistre chaque valeur dans une variable differente puis avec le bouton je choisi la variable a afficher sans deranger la sequence de l'adc, est bien ca?

    Merci de votre aide et de vos idees en tout cas
     

  11. Forhorse

    Date d'inscription
    décembre 2010
    Messages
    1 748

    Re : Convertisseur Analogique numérique pic 18f

    Citation Envoyé par Ticlem Voir le message
    Sinon il faudrait que je fasse une lecture de toute les voie en continue (comme on la vu precedemment) et j'enregistre chaque valeur dans une variable differente puis avec le bouton je choisi la variable a afficher sans deranger la sequence de l'adc, est bien ca?
    C'est tout à fait ça !

    Et quand je parle de traitement de donnée, c'est peut être un bien grand mot, je voyait simplement un truc comme un filtrage numérique de valeurs... parce quand tu vas passer à l’expérimentation réelle de ton système, tu va vite te rendre compte que la vraie vie c'est pas comme le monde parfais des bisounours d'un simulateur, et que si tu fais un affichage sur un échantillon ponctuel d'une voie, tu vas souvent te retrouver avec des valeurs incohérente...
    Mais on est en pas encore là ! Quand tu arriveras à lire toutes les voies à la suite et à stocker la lecture de chacune d'elle dans une variable différente (ou un tableau) il sera toujours temps ensuite de se poser la question du filtrage.
    Tout projet flou conduit à une connerie précise !
     

  12. Ticlem

    Date d'inscription
    octobre 2007
    Messages
    99

    Re : Convertisseur Analogique numérique pic 18f

    Bonjour à tous,

    Alors voilà le code que j'ai essayé mais j'ai rapidement rencontré quelques soucis (peut être que c'est le soir et du coup je réfléchis peu):
    - Comment faire en sorte de jamais sortir de la conversion de l'ADC et de pouvoir quand même afficher les valeurs à l'écran?

    - J'ai toujours mon problème de temps de conversion ou de changement de voie comme je l'ai marqué sur mes posts précédents, je ne comprends vraiment d'ou cela peut venir mais en tout cas pas de mon bouton puisque là l'erreur apparait aussi souvent que le nombre de conversion de l'ADC.

    - Comment créer des tableaux de valeur?


    Code:
    /* Test de l'adc sur soft simple */
    // CD 01/2005
    // test printf sur PICDEM2+ et MCC18 v2.40
    #include <p18f452.h>
    #include <stdio.h> 		// printf
    #include <xlcd.h>
    #include <math.h>
    
    
    #pragma config WDT = OFF
    #pragma config OSC = XT
    
    /* %%%%%%%%%%%%%%%%%%%%%%% Resolution du convertisseur numérique q=(Vref+ - Vref-)/2^N %%%%%%%%%%%%%%%%%%%%%%%% */
    #define q 4.8828e-3	// quantum pour un CAN 10bits 0v-5v
    /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
    
    
    // Declaration des variable
    
    unsigned int adcvalue;
    char chaine[30];
    float Vin;
    float Tbat;
    float Temph;
    float Presh;
    
    
    // dirige user_putc vers l'afficheur LCD du PD2+
    
    int _user_putc (char c)
    {
    	putcXLCD(c);
    }
    
    
    /* %%%%%%%%%%%%%%%%%%%%%%% fonction de conversion en numérique %%%%%%%%%%%%%%%%%%%%%%%% */
    void mesure (void)
    {
    ADCON0bits.GO_DONE=1;		// Mise en marche de la conversion
    while(ADCON0bits.GO_DONE);	// attendre la fin de conversion Erreur d'isis sur le temps de conversion ou changement de voie
    adcvalue = ADRES; //lecture du résultat reuni ADRESH et ADRESL (si justification à droite)
    Vin=(float)adcvalue*q;			// calcule la tension à partir de la valeur numérique avec q la résolution
    }
    /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
    
    /* %%%%%%%%%%%%%%%%%%%%%%% fonction d'acquisition %%%%%%%%%%%%%%%%%%%%%%%% */
    void acquisition (void)
    {
    while(1){
    	ADCON0bits.CHS0=0;	ADCON0bits.CHS1=0;	ADCON0bits.CHS2=1; //choix de la voie (tension)
    	mesure();
    	Tbat=Vin+10;			// calcul la tension
    	ADCON0bits.CHS0=0;	ADCON0bits.CHS1=0;	ADCON0bits.CHS2=0; //choix du la voie (temperature)
    	mesure();
    	Temph=(Vin-0.5)/0.01; 	// calcul la température
    	ADCON0bits.CHS0=1;	ADCON0bits.CHS1=0;	ADCON0bits.CHS2=0; //choix du la voie (pression)
    	mesure();
    	Presh=(((Vin/5.1)-0.04)/0.00369)/100;
    	}
    }
    /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
    
    /* %%%%%%%%%%%%%%%%%%%%%%% Conversion adc tension batterie (ecran 1) %%%%%%%%%%%%%%%%%%%%%%%% */
    void tension (void)
    {			SetDDRamAddr(0);	// positionne le curseur en début de 1er ligne
    			fprintf(_H_USER,"Vbat=");
    while(PORTAbits.RA4 & 1)
    		{	ftoa(Tbat,chaine,1,'f');		// convertit en chaine
        		SetDDRamAddr(6);
    			putsXLCD(chaine);
    			SetDDRamAddr(12);
    			fprintf(_H_USER,"V");
    		}
    }
    /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
    
    /* %%%%%%%%%%%%%%%%%%%%%%% Conversion adc température %%%%%%%%%%%%%%%%%%%%%%%% */
    void temperature (void)
    {			SetDDRamAddr(0);	// positionne le curseur sur début ligne 1
    			fprintf(_H_USER,"Vin=");
    			SetDDRamAddr(0x40);	// positionne le curseur sur debut ligne 2
    			fprintf(_H_USER,"Temp=");
    while(PORTAbits.RA4 & 1)
    		{	ftoa(Temph,chaine,3,'f');		// convertit en chaine
        		SetDDRamAddr(0x46);
    			putsXLCD(chaine);
    			ftoa(Vin,chaine,3,'f');		// convertit en chaine
        		SetDDRamAddr(5);
    			putsXLCD(chaine);
        	}
    }
    /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
    
    /* %%%%%%%%%%%%%%%%%%%%%%% Conversion adc pression %%%%%%%%%%%%%%%%%%%%%%%% */
    void pression (void)
    {			SetDDRamAddr(0);	// positionne le curseur sur début ligne 1
    			fprintf(_H_USER,"Vin=");
    			SetDDRamAddr(0x40);	// positionne le curseur sur debut ligne 2
    			fprintf(_H_USER,"Pres=");
    while(PORTAbits.RA4 & 1)
    	  {	 	ftoa(Presh,chaine,2,'f');		// convertit en chaine
        		SetDDRamAddr(0x46);
    			putsXLCD(chaine);
    			ftoa(Vin,chaine,3,'f');		// convertit en chaine
    			SetDDRamAddr(5);
    			putsXLCD(chaine);
    		}
    }
    /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
    
    /* %%%%%%%%%%%%%%%%%%%%%%% Appui sur le bouton %%%%%%%%%%%%%%%%%%%%%%%% */
    void touche(void)
    {
    while(!(PORTAbits.RA4 & 1))
     // efface l'afficheur LCD
     SetDDRamAddr(0);
     fprintf(_H_USER,"                    ");
     SetDDRamAddr(0x40);
     fprintf(_H_USER,"                    ");
     WriteCmdXLCD( CURSOR_OFF & BLINK_OFF);
    }
    /* %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% */
    
    
    /* %%%%%%%%%%%%%%%%%%%%%%% Programme principal %%%%%%%%%%%%%%%%%%%%%%%% */
    void main(void)
    {
    	TRISA=0b00111111;		// PORTA en entrée pour S2
    
    	ADCON0=0b10000001;
    	ADCON1=0b10000000;
    
    	SPBRG = 25; /* configure la vitesse (BAUD) 9600 N 8 1*/
    	TXSTA = 0x24;
    	RCSTA = 0x90; /* active l'USART*/
    
    	OpenXLCD(FOUR_BIT & LINES_5X7 );	//initialise PIC pour LCD sur PD2
    	WriteCmdXLCD( CURSOR_OFF & BLINK_OFF);
        SetDDRamAddr(0);					//ligne 0 de l'afficheur
    	fprintf (_H_USART, "Precisions de 0.488 degC et 0.2 kPa = 0.002 Bars"); // vers USART
    
    	acquisition();Pas la bonne solution du tout, mais comment faire tourner la fonction acquisition en permanence
    	
    	while(1)
    		{
    			tension();
    			touche();
    
    			temperature();
    			touche();
    
    			pression();
    			touche();
    		}
    }
    Merci de votre aide,
     

  13. Forhorse

    Date d'inscription
    décembre 2010
    Messages
    1 748

    Re : Convertisseur Analogique numérique pic 18f

    C'est logique, si tu met un "while(1)" ton programme ne sort jamais de la routine
    Il faut soit utiliser les interruptions, soit appeler cycliquement cette routine dans la scrutation de ton programme.
    Tout projet flou conduit à une connerie précise !
     

  14. HULK28

    Date d'inscription
    janvier 2006
    Localisation
    IDF
    Messages
    13 820

    Re : Convertisseur Analogique numérique pic 18f

    +1
    Il faut prendre l'habitude d'utiliser les interruptions, c'est indispensable.
    "Le temps met tout en lumière." Thalès
     

  15. Ticlem

    Date d'inscription
    octobre 2007
    Messages
    99

    Re : Convertisseur Analogique numérique pic 18f

    D'accord oui, je pense que finalement c'est plus rigoureux d'utiliser les interruptions.

    L'idée, je branche mon bouton sur RB0 et je gère les interruptions venant de mon bouton.
    Je met l'acquisition dans une boucle sans fin dans la fonction main
    Et je met le changement d'affichage dans la fonction d'interruptions
    Si je fais dans la rigueur je dois gérer aussi un anti-rebond de mon bouton.

    Par contre j'ai toujours ce problème d'erreur sur ISIS qui me pose soucis.

    Merci de votre aide
     


    • Publicité





 

Discussions similaires

  1. Convertisseur Analogique-Numerique
    Par tonyjk dans le forum Électronique
    Réponses: 8
    Dernier message: 24/03/2012, 17h07
  2. Convertisseur analogique/numerique
    Par zanzeoo dans le forum Électronique
    Réponses: 9
    Dernier message: 29/02/2012, 11h52
  3. Convertisseur analogique numérique
    Par Fulishima dans le forum Électronique
    Réponses: 4
    Dernier message: 05/03/2011, 18h20
  4. Convertisseur analogique -> numérique
    Par samy54 dans le forum Électronique
    Réponses: 2
    Dernier message: 13/02/2010, 19h17
  5. Convertisseur analogique numérique
    Par mrpatate212 dans le forum Électronique
    Réponses: 13
    Dernier message: 23/12/2007, 21h26