[Programmation] ADC avec 12F683 la conversion n'est pas correcte
Répondre à la discussion
Affichage des résultats 1 à 12 sur 12

ADC avec 12F683 la conversion n'est pas correcte



  1. #1
    nilelong

    ADC avec 12F683 la conversion n'est pas correcte


    ------

    Bonjour à tous et BONNE ANNEE ( espérons meilleure en tous cas que 2020 !).

    Je fais des essais avec l'ADC d'un 12F683 pour allumer une led au-dessus d'une certaine tension avec la référence interne du PIC. Je fais varier la tension à digitaliser avec un potar à partir de l'alimentation (5 volts).

    J'ai fixé la condition à 511 (1/2 de 1023), la led devrait donc s'allumer à 2.5v, hors elle s'allume à 3.55v.

    Est-ce que qqun aurait une idée sur le pb ?

    Merci d'avance

    le programme:

    Code:
    #include <xc.h>
    
    // Définition de la fréquence du crystal pour la fonction __delay_ms(x);
    #define _XTAL_FREQ 4000000
    
    // CONFIG
    #pragma config FOSC = INTOSCIO  // Oscillator Selection bits (INTOSCIO oscillator: I/O function on RA4/OSC2/CLKOUT pin, I/O function on RA5/OSC1/CLKIN)
    #pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
    #pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
    #pragma config MCLRE = OFF      // MCLR Pin Function Select bit (MCLR pin function is digital input, MCLR internally tied to VDD)
    #pragma config CP = OFF         // Code Protection bit (Program memory code protection is disabled)
    #pragma config CPD = OFF        // Data Code Protection bit (Data memory code protection is disabled)
    #pragma config BOREN = OFF      // Brown Out Detect (BOR disabled)
    #pragma config IESO = OFF       // Internal External Switchover bit (Internal External Switchover mode is disabled)
    #pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)
    
    
    unsigned int mesur;
    
      void main() {
    ANSEL = 0b00000001;  
    TRISIO = 0b00000001;
    ADCON0bits.CHS = GP0;// broche à utiliser comme entrée
    VCFG = 0;
    ADFM = 1;
    GP2 = 0;
    
    while (1){ 
    __delay_ms(5);
    ADON = 1;
    GO_nDONE = 1;
    __delay_ms(5);
    mesur = ((ADRESH << 8) + ADRESL);   // valeur numérique de 0 à 1024
    
    ADON = 0;
      if (mesur > 511)
          
          {
           GP2 = 1;
            
     
            }
      else 
                  {
       GP2 = 0;
           
      
            }
    }
      }

    -----
    Dernière modification par Antoane ; 10/01/2021 à 16h49. Motif: ajout balises quote

  2. #2
    jiherve

    Re : ADC avec 12F683 la conversion n'est pas correcte

    Bonsoir,
    quelle est la tension de la référence interne ?
    Quelle est la valeur du potentiometre et celle de la resistance d'entrée du PIC ?
    comment le potentiometre est il branché?
    JR
    l'électronique c'est pas du vaudou!

  3. #3
    paulfjujo

    Re : ADC avec 12F683 la conversion n'est pas correcte

    bonsoir,

    // il fait déja nuit !!!!

    on peut laisser l'ADC sur ON .. cela perturbe moins ..


    Code:
    CMCON0 = 7;
    ADON = 1; // always ON 
    while (1)
    {
     GO_nDONE = 1;
     _asm NOP;  // recommended by Microchip
     while(GO_nDONE == 1); // test end of convertion 
     mesur = ((ADRESH << 8) + ADRESL); // valeur numérique de 0 à 1024
     if (mesur > 511) GP2 = 1; else GP2 = 0;
      __delay_ms(5);
     }
    }
    sinon avec la version MikroC gratuite

    Code:
    /*
      PIC12F683 Experiment Board
      Experimen No. 3 : Read analog voltage from AN0 and diplay
      on Hyperterminal window on PC using Software UART.
      Date: 06/25/2010
    */
    char Message1[] = "Digital Value= ";
    unsigned int adc_value, backup=0 ;
    char *temp = "0000", error;
    int i;
    
    void main()
    {
    CMCON0 = 7;
    TRISIO = 11;  // GPIO 0, 1, 3 Inputs; Rest are O/Ps
    ANSEL = 0x01;
    GPIO = 0;
    // Define GPIO.3 as UART Rx, and 5 as Tx
    error = Soft_UART_Init(&GPIO,3, 5, 9600, 0 );
    Delay_ms(100);
    do {
     adc_value = ADC_Read(0);
     if(adc_value != backup)
      {
      if (adc_value/1000)
       temp[0] = adc_value/1000 + 48;
      else
      temp[0] = '0';
      temp[1] = (adc_value/100)%10 + 48;
      temp[2] = (adc_value/10)%10 + 48;
      temp[3] = adc_value%10 + 48;
     for (i=0; i<= 13; i++) {
          Soft_UART_Write(Message1[i]);
          Delay_ms(50);
         }
     for (i=0; i<= 3; i++) {
          Soft_UART_Write(temp[i]);
          Delay_ms(50);
         }
         Soft_UART_Write(10); // Line Feed
         Soft_UART_Write(13); // Carriage Return
     backup = adc_value;
     }
     delay_ms(100);
     } while(1);
    }
    Dernière modification par paulfjujo ; 10/01/2021 à 16h52.

  4. #4
    nilelong

    Re : ADC avec 12F683 la conversion n'est pas correcte

    Bonjour Jihervé,

    Désolé pas pu répondre hier.
    VCFG = 0 : c'est la tension d'alim qui est prise en réference (5 volts)
    potar : 10K , branchement entre 0 et 5 volts ( alim)
    Curseur en direct sur l'entrée du PIC, pas de résistance.

    Bonne journée

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

    Re : ADC avec 12F683 la conversion n'est pas correcte

    Bonjour Paulfjujo,

    Merci, désolé, pas pu répondre hier.

    J'essaie ta recommandation cet après-midi et "je te dis quoi" comme on dit dans le Nord.
    (je ne connais pas le MikroC)

    Les jours commencent à rallonger... Bonne journée

  7. #6
    nilelong

    Re : ADC avec 12F683 la conversion n'est pas correcte

    Bonjour Paulfjujo,

    J'ai corrigé avec tes conseils en C et....... ça marche nickel!
    Y a juste qu'il ne veut pas prendre "_asm NOP" , il me dit qu'il n'identifie pas. Au fait c'est quoi cette commande ?

    En tous cas merci beaucoup.

    (Je fais un petit module pour detecter un seuil de tension faible de batterie avec flash pour mes avions rc electriques.)

    Très bonne journée à toi.

  8. #7
    Exotique

    Re : ADC avec 12F683 la conversion n'est pas correcte

    Citation Envoyé par nilelong Voir le message
    Y a juste qu'il ne veut pas prendre "_asm NOP" , il me dit qu'il n'identifie pas. Au fait c'est quoi cette commande ?
    NOP signifie "no operation", donc ne fait rien.
    Ca permet d'introduire une tempo fixe correspondant au temps nécessaire à une instruction, donc dépend de la base de temps de ton µC.
    Pour un PIC, si tu as par exemple un quartz de 4MHz => t=4/f=1µs

    Selon ton compilateur tu peux essayer:

    NOP ();
    ou
    asm{nop}:

    ou encore:

    #asm
    NOP
    #endasm

    Bref, comme toujours, il faut lire la doc...

  9. #8
    nilelong

    Re : ADC avec 12F683 la conversion n'est pas correcte

    Salut Exotique,
    (et bonne année!)

    Merci
    ( équivalent à " __delay_µs(1) " pour 4Mhz je suppose)

    c'est vrai qu'on ne lit pas assez la doc, rien que pour le petit 12F683 170 pages!

    Bonne journée à toi

  10. #9
    Exotique

    Re : ADC avec 12F683 la conversion n'est pas correcte

    L'avantage avec l'instruction assembleur NOP c'est que tu es certain d'avoir un temps équivalent à un cycle de la base de temps du µC.

  11. #10
    paulfjujo

    Re : ADC avec 12F683 la conversion n'est pas correcte

    bonsoir

    Citation Envoyé par nilelong Voir le message

    Je fais un petit module pour detecter un seuil de tension faible de batterie avec flash pour mes avions rc electriques.)

    ..
    Est-ce que ton alim 5V PIC est independante de la tension de batterie à surveiller ?

    sinon, problemo , car la mesure ADC referencée sur la tension d'alim est ratiometrique
    si le Vcc 5V diminue , le seuil de reglage est alors affecté dans la meme proportion .
    Dans ce cas de figure ,il faut mettre une tension de reference externe inferieure à ( mini de la batterie -1V)
    (et mettre aussi à l'echelle ,coté tension batterie vers entree ANA .. diviseur par 2 )

    ex: Vref externe 2,048V sur GP1 avec VCFG=1 => 0 -1023 0 -2047 mV
    pour une batterie Li-ion 4,1Maxi 3,1V mini qui alimenterait AUSSI le PIC
    Dernière modification par paulfjujo ; 11/01/2021 à 16h18.

  12. #11
    nilelong

    Re : ADC avec 12F683 la conversion n'est pas correcte

    Bonsoir,

    La batterie à contrôler est une lipo 3s de propulsion (12.6v maxi, 10.8v mini en charge).
    J'alimente le PIC avec elle à travers un 7805 qui donne donc la référence, il n'y a pas de pb ( j'ai déjà fait fonctionner le module mais le pb de la justesse de la conversion m'embêtait). je calibre la tension effective à mesurer par un pont ajustable.
    Pour les avions à propulsion thermique, l'alim électrique se fait en général par des accus nimh (4 ou 5 éléments ) qui donnent entre 5.6v et 4v mini. Dans ce cas, comme tu le préconises, il faudrait une Vref externe. Je mettrais une zener, ça devrait être suffisamment précis.

  13. #12
    nilelong

    Re : ADC avec 12F683 la conversion n'est pas correcte

    et merci pour les conseils

Discussions similaires

  1. [Programmation] MICROCONTROLEURS 12F683 Interruption ne fonctionne pas
    Par nilelong dans le forum Électronique
    Réponses: 96
    Dernier message: 01/12/2020, 12h46
  2. interruption sur pic 12f683
    Par emile62 dans le forum Électronique
    Réponses: 0
    Dernier message: 26/03/2012, 21h28
  3. probleme de gestion du port gpio sur 12F683
    Par alainav1 dans le forum Électronique
    Réponses: 23
    Dernier message: 13/07/2010, 09h47
  4. Programmation 12F683
    Par morganzion dans le forum Électronique
    Réponses: 0
    Dernier message: 11/02/2009, 18h39
  5. PIC 12F683 et Debugger ICD2
    Par Nico8583 dans le forum Électronique
    Réponses: 8
    Dernier message: 25/04/2007, 05h20
Découvrez nos comparatifs produits sur l'informatique et les technologies.