Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Problème de lecture d'un ADC - PIC16F1783
Alex
Membre
Membre
Messages : 8
Enregistré en : mars 2018

#11 Message par Alex » mar. 3 avr. 2018 11:56 lien vers la Data-Sheet : Cliquez ici

J'ai essayé de contourner le problème en passant en 10 bits, toujours avec ADFM = 0.

J'ai également déclaré AcquValue comme INT16.

Cependant, en regardant la valeur directement dans ADRES, j'ai toujours des valeurs aberrantes, (type 65 xxx).

Problème de lecture d'un ADC - PIC16F1783
satinas
Passioné
Passioné
Messages : 285
Enregistré en : novembre 2015

#12 Message par satinas » mar. 3 avr. 2018 12:25 lien vers la Data-Sheet : Cliquez ici

Bonjour,
Si tu récupères un ADRES dans un int16, sa valeur doit être entre -32768 et 32767, pas 65xxx
Avant de faire des moyennes, il faut vérifier que l'adc donne des résultats répétitifs, par exemple en effectuant une mesure toutes les secondes, et en l'affichant sur le port série.

Problème de lecture d'un ADC - PIC16F1783
Alex
Membre
Membre
Messages : 8
Enregistré en : mars 2018

#13 Message par Alex » mar. 3 avr. 2018 12:30 lien vers la Data-Sheet : Cliquez ici

Dans mon cas, je regarde directement la valeur du registre ADRES via le mode DEBUG (j'utilise un PICKIT 3).

J'ai mis une watch sur le registre ADRES, et à chaque passage dans la boucle, même sans modifier le voltage en entré, j'ai des écarts importants entre les valeurs, sans aucune correspondance visible avec la tension d'entrée.

Problème de lecture d'un ADC - PIC16F1783
satinas
Passioné
Passioné
Messages : 285
Enregistré en : novembre 2015

#14 Message par satinas » mar. 3 avr. 2018 12:58 lien vers la Data-Sheet : Cliquez ici

Acqu_value = ADRESH && 0x001F;

un & de trop là :)

Problème de lecture d'un ADC - PIC16F1783
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1029
Âge : 67
Enregistré en : juillet 2015
Localisation : 01120
Contact :

#15 Message par paulfjujo » mar. 3 avr. 2018 13:04 lien vers la Data-Sheet : Cliquez ici

int16 Acqu_avg;Acq_value;
int16 Signe;

la fig 17-6 montre encore une autre representation , en isolant completement le signe

Code : Tout sélectionner


    Signe
=0;
     Acqu_value = 0x0000;
      Acqu_value = ADRESH & 0x0F;  // partie signe entierment masquée
      if((Acq_value & 0x70)>) Signe=1;
      Acqu_value = Acqu_value<<8;
      Acqu_value += ADRESL;
         // on traite le signe
      if (Signe==1Acqu_value =-Acqu_value ;
      Acqu_avg += Acqu_value;
   

Problème de lecture d'un ADC - PIC16F1783
Alex
Membre
Membre
Messages : 8
Enregistré en : mars 2018

#16 Message par Alex » mar. 3 avr. 2018 13:24 lien vers la Data-Sheet : Cliquez ici

J'ai changé le mode de représentation du résultat en 10 bits et avec ADFM = 0.

J'ai réadapté le traitement des regsitres ADRESH et ADRESL (un peu comme paulfujo me l'a conseillé).

Au niveau hardware, j'ai également branché mon potentiomètre directement sur Vdd et Vss, et non via une source externe.


J'ai enfin un signal stable et juste.

Je vous mets la dernière version du code.

Code : Tout sélectionner

/*
 * File:   main.c
 * Author: Alexandre
 *
 * Created on 21 mars 2018, 16:41
 */

#define _XTAL_FREQ  32000000



#pragma config CLKOUTEN = OFF 
#pragma config WDTE = OFF
#pragma config PWRTE = OFF 
#pragma config CP = OFF
#pragma config BOREN = ON 
#pragma config FCMEN = OFF
#pragma config MCLRE = ON 
#pragma config CPD = OFF 
#pragma config IESO= OFF
#pragma config FOSC = INTOSC 
#pragma config STVREN = ON 
#pragma config LPBOR = OFF
#pragma config BORV = HI 
//#pragma configLVP = OFF 
#pragma config WRT = OFF
#pragma config PLLEN = ON // PLL activée




#include <xc.h>
#include <pic16f1783.h>
#include "types_defines.h"

void chenilliard(void);
void ADCInit(void);
UINT16 ADCRead(void);


void main(void) {
    
// Configuration du port B
    
TRISB 0b00001000// Setting RB3  as input
    
ANSELB 0b00001000// Setting RB3  as analog input
    
    
    // Clock configuration
    
OSCCONbits.IRCF 0b1101// Fosc = 4Mhz (à multiplier par 4 car PLL)
    
OSCCONbits.SCS1 1// Internal osscilator source
    
    // Déclaration de variable 
    
UINT16 value;
    
    
ADCInit();
   
    while(
1) {
        
value ADCRead();
    }
    return;
}

/*void chenilliard() {
    while(1) {
        PORTBbits.PORTB = 0x01;
       for (int i=0; i<8; i++) {
        __delay_ms(3000);
        PORTBbits.PORTB= PORTBbits.PORTB*2;
        }   
    }
} */


void ADCInit(){
  
// ADCON0 Configuration
    
ADCON0bits.ADRMD 1//Précision 10 bits
    
ADCON0bits.CHS 0b01001// Pin selection AN9 (RB3)
    
  // ADCON1 configuration
    
ADCON1bits.ADFM 0// (2's comlimentright justified)
    
ADCON1bits.ADCS 0b101// Clock conversion, à calculer : Fosc/16 : 1µs
    
ADCON1bits.ADNREF 0// Vref- connected to Vss
    
ADCON1bits.ADPREF 0b00// Vref+ connected to Vdd
 
  // ADCON2 Configuration
    
ADCON2bits.TRIGSEL 0b1111// Auto conversion enable
    
ADCON2bits.CHSN 0b1111// ADC Negative reference selected by ADNREF
    
    
}


    
  
UINT16 ADCRead(void)
{

  
UINT8 j;
  
volatile UINT16 Acqu_value;
  
UINT16 Acqu_avg 0;
  
  
__delay_us(50);
 
  
//On moyenne sur 8 mesures consécutives
  
ADCON0bits.ADON 1;     // ADC ON
  
for (j=0;j<8;j++) {
      
__delay_ms(500);
      
ADRESH 0x0000;
      
ADRESL 0x0000;
      
ADCON0bits.GO 1;  //Start ADC conversion
      
NOP();
      
NOP();
      while(
ADCON0bits.GO != 0){};   // Wait for conversion to be done
      
Acqu_value 0x0000;
      
Acqu_value ADRESH;
      
Acqu_value Acqu_value<<8;
      
Acqu_value += ADRESL;
      
Acqu_value Acqu_value>>6;
      
Acqu_avg += Acqu_value;
     
  }
  
ADCON0bits.ADON 0;     // ADC OFF
 
  
  //Moyennage sur 8 valeurs
  
Acqu_avg Acqu_avg>>3;


return 
Acqu_avg;
}
 


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Google [Bot] et 9 invités