Partage
  • Partager sur Facebook
  • Partager sur Twitter

Conversion analogique numérique

    22 mai 2018 à 10:43:42

    Bonjour :) 

    Je rencontre des problèmes lors de ma double conversion analogique numérique. J'ai écrit le code ci dessous et mon problème est que j'ai l'impression que mes broches ne sont pas pris en compte. J'ai 2 conversion a faire sauf que le résultat correspond a la mauvaise entrées. Voici mon code 

    /*
     * File:   newmain.c
     * Author: mohamed
     *
     * Created on May 22, 2018, 9:11 AM
     */
    
    #include<stdio.h>
    #include<math.h>
    #include <xc.h>
    
    #pragma config OSC=XT
    #pragma config WDT= OFF
    #pragma config LVP= OFF
    #pragma config BOREN = OFF 
    
    
    #define GO ADCON0bits.GO_DONE
    #define _XTAL_FREQ 4000000
    
    
    void Init_convert_AN(void);
    void liaison_serie_oled (void);
    void conversion5v(void);
    void conversion15v(void);
    void transmit_character( char res5v1,char res5v2, char res5v3,char res5v4,char res5v5);
    void tempo10ms(unsigned short i);
    void transmit_character2(char res15v1, char res15v2, char res15v3, char res15v4, char res15v5);
    
    
    float res_tension5v;
    float res_tension15v;
    char res5v1,res5v2,res5v3,res5v4,res5v5,res15v1,res15v2,res15v3,res15v4,res15v5;
    float data5v=0;
    float data15v=0;
    char Tab5v[5]=0;
    char Tab15v[5]=0;
    
    
    
    
    
    
    // changement de variable
    void reverse(char *str, int len)
    {
        int i=0, j=len-1, temp;
        while (i<j)
        {
            temp = str[i];
            str[i] = str[j];
            str[j] = temp;
            i++; j--;
        }
    }
     
    int intToStr(int x, char str[], int d)
    {
        int i = 0;
        while (x)
        {
            str[i++] = (x%10) + '0';
            x = x/10;
        }
     
        // nombre de digits
        // 
        while (i < d)
            str[i++] = '0';
     
        reverse(str, i);
        str[i] = '\0';
        return i;
    }
     
    // Convert un float en chaine de char
    void ftoa(float n, char *res, int afterpoint)
    {
        // on extrait l'entier
        int ipart = (int)n;
     
        // on extrait la partie a virgule
        float fpart = n - (float)ipart;
     
        // converti entier en string
        int i = intToStr(ipart, res, 0);
     
        // check for display option after point
        if (afterpoint != 0)
        {
            res[i] = '.';  // add dot
     
            // Get the value of fraction part upto given no.
            // of points after dot. The third parameter is needed
            // to handle cases like 233.007
            fpart = fpart * pow(10, afterpoint);
     
            intToStr((int)fpart, res + i + 1, afterpoint);
        }
    }
     
    void main() {
        
        
    liaison_serie_oled();
    Init_convert_AN();
    
    while(1)
    {
        conversion5v();
        tempo10ms(1);
        conversion15v();   
        tempo10ms(1);
    }
        
    }
    
    
    void liaison_serie_oled (void)
    {
         
       	  TXSTA = 0;            // Reset TXSTA
    	  RCSTA = 0;		//  Reset RCSTA
    	           
              TRISCbits.TRISC6 = 0;  // TX output
              TRISCbits.TRISC7 = 1;  // RX  input
           
    
    
              BAUDCONbits.BRG16=0;      //9600bps  a voir selon ecran
    	  TXSTA= 0x24;		    //  Load TXSTA 
    	  SPBRG = 25;               // Write baudrate to SPBRG
    	  RCSTA = 0x90;		    // 
          
        
                  
    }
    
    
    void Init_convert_AN (void)
    {
        
    
    PORTAbits.AN0=1; // AN0 en entree
    PORTBbits.AN12=1;
    ADCON0=0x01;
    ADCON1=0b10000001;  // bit 5-4=0 vref+=vdd vref-=vss / bit0-3 AN0
    ADCON2=0b10010100; // justif a droite acquisition time, conversion clock
    
    }
    
    
    void conversion5v (void)
    {
        tempo10ms(10);
        
    ADCON0bits.CHS0=0;
    ADCON0bits.CHS1=0;
    ADCON0bits.CHS2=0;
    ADCON0bits.CHS3=0;
    
    tempo10ms(10);
    
    GO=1;//demande de conversion
    
    while(GO==0){} // fin de conversion  
    data5v =((ADRESH<<8)+ADRESL); // recuperation de la tension a 5v
    
    //if((data5v<=1024)&&(data5v>0)){
    res_tension5v=(data5v*0.004888125); // 
    //}
    //else{}
    
      __delay_us(1);
        ftoa(res_tension5v, Tab5v, 4);
     
        res5v5=Tab5v[0];
          res5v4=Tab5v[1];
            res5v3=Tab5v[2];
              res5v2=Tab5v[3];
                res5v1=Tab5v[4];
               
        __delay_us(1);
        
        transmit_character (res5v1,res5v2,res5v3,res5v4,res5v5);
    
    
    }
    
    
    void transmit_character( char res5v1,char res5v2, char res5v3,char res5v4,char res5v5) 
    {
      
    TXREG = 0x00;//le mot à envoyer est placé dans un registre 8 bits TXREG
    while (!TXSTAbits.TRMT);
    
    TXREG = 0x06;
    while (!TXSTAbits.TRMT);
    
    TXREG =res5v5;//c
    while (!TXSTAbits.TRMT);
    
    TXREG =res5v4;
    while (!TXSTAbits.TRMT);
    
    TXREG =res5v3; //premier chiffre
    while (!TXSTAbits.TRMT);
    
    TXREG =res5v2;
    while (!TXSTAbits.TRMT);
    
    
    TXREG =res5v1;//
    while (!TXSTAbits.TRMT);
    
    
    TXREG = 0x00;
    while (!TXSTAbits.TRMT); // fin de char
    
    while(RCREG!=0x06);
     {}
    
    
    }
    
    
    void conversion15v (void)
    {
      tempo10ms(10);
    
    ADCON0bits.CHS0=0;
    ADCON0bits.CHS1=0;
    ADCON0bits.CHS2=1;
    ADCON0bits.CHS3=1;
    
    tempo10ms(60);
    GO=1;//demande de conversion
    
    while(GO==0){} // fin de conversion  
    data15v =((ADRESH<<8)+ADRESL); // recuperation de la tension a 5v
    
    if((data15v<=1024)&&(data15v>0)){
    res_tension15v=(data15v*0.0146484375); // 
    }
    else{}
    
    __delay_us(1);
      
    
        ftoa(res_tension15v, Tab15v, 4);
     
        res15v5=Tab15v[0];
          res15v4=Tab15v[1];
            res15v3=Tab15v[2];
              res15v2=Tab15v[3];
                res15v1=Tab15v[4];
               
        __delay_us(1);
        
    transmit_character2 (res15v1,res15v2,res15v3,res15v4,res15v5);
    
    
    }
    
    
    void transmit_character2(char res15v1, char res15v2, char res15v3, char res15v4, char res15v5)
    {
    TXREG = 0x00;//le mot à envoyer est placé dans un registre 8 bits TXREG
    while (!TXSTAbits.TRMT);
    
    TXREG = 0x06;
    while (!TXSTAbits.TRMT);
    
    TXREG =res15v5;//c
    while (!TXSTAbits.TRMT);
    
    TXREG =res15v4;
    while (!TXSTAbits.TRMT);
    
    TXREG =res15v3; //premier chiffre
    while (!TXSTAbits.TRMT);
    
    TXREG =res15v2;
    while (!TXSTAbits.TRMT);
    
    
    TXREG =res15v1;//
    while (!TXSTAbits.TRMT);
    
    
    TXREG = 0x00;
    while (!TXSTAbits.TRMT); // fin de char
    
    while(RCREG!=0x06);
     {}
    
    
    }
    
    
    void tempo10ms(unsigned short i)
    {
     			unsigned short j,k;
     			for(j=0;j<i;j++)
     			{
     					for(k=0;k<5000;k++)
     					{
     					}
     			}
     	} 
    

    Lorsque sur mon entrée AN0 je met 5v et que a mon entrée AN12 je met 0v, le simulateur me donne 15v sur AN0 et 0v sur AN12. Donc en faite ma conversion se trompe d'entrée j'ai l'impression. Aidez moi svp

    merci 

    • Partager sur Facebook
    • Partager sur Twitter
      22 mai 2018 à 12:09:08

      Je ne suis pas du tout compétent donc je ne peut pas bcp t'aider.

      Mais es-tu sur de tes fonction transmit() car elles ont le meme comportement mais tu en as codés deux. Donc ca pourrait laisser entrevoir une erreur.

      • Partager sur Facebook
      • Partager sur Twitter
        22 mai 2018 à 13:01:03

        bonjour, 

        la fonction transmit sert uniquement a envoyer le résultat sur écran led, en simulation elles sont ignorées. Merci quand meme

        • Partager sur Facebook
        • Partager sur Twitter

        Conversion analogique numérique

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown