[Programmation] Récupérer valeur d'un potentiomètre par un pic sous mplabx
Répondre à la discussion
Affichage des résultats 1 à 11 sur 11

Récupérer valeur d'un potentiomètre par un pic sous mplabx



  1. #1
    invited6d97512

    Récupérer valeur d'un potentiomètre par un pic sous mplabx


    ------

    Salut,

    Dans le cadre de mon projet j'aimerais récupérer la valeur de mon potentiomètre de ma board "mclv2" qui nous a été donné pour faire différents tests dessus, le pic utilisé est le "dsPIC33EP256MC506".

    J'ai trouvé un petit code sur le net qui m'avait l'air pas mal et que j'ai transposé pour mon pic.
    http://www.learningaboutelectronics....er-circuit.php
    Le code permet de faire varier l'intensité d'une led en fonction de la valeur du potentiomètre. Pour ma part je veux juste lire sur MPLABX la valeur de mon potentimètre.

    Le code que j'ai est le suivant:

    Code:
    void port_init (void)
    {
        TRISEbits.TRISE13 = 1; //potentiomètre en entrée
        TRISDbits.TRISD6 = 0; //diode en sortie
        //PORTDbits.RD6=0; //diode à 0 pour commencer
    }
    
    void adc_init(void)
    {
        //POT sur AN13/RE13
        //DIODE sur RD6
        AD1CHS0bits.CH0SB = 0b01101; //AN13 en analogue sur MUXB
        AD1CON1bits.ADON = 1; //ADC opérationnel
    }
    
    int analog_reading;    
        adc_init();
        port_init();
        
        while(1)
        {
            AD1CON1bits.DONE=0; //on lance la conversion
            while(AD1CON1bits.DONE==0) //tant que la conversion n'est pas terminée
            {
                analog_reading=ADC1BUF0; //on récupère la valeur dans le buffer et on la met dans analog_reading, résultat sur 16 bits
                //PORTDbits.RD6=analog_reading; //on met la valeur donnée par le potentiomètre de manière analogique sur la diode afin d'observer les variations de son intensité en fonction de la valeur du potentiomètre   
            }
        }
    Le potentiomètre est sur AN13/RE13
    Le programme compile mais lorsque je le teste en réel, j'ai beau faire varier le potentiomètre, la valeur récupérée ne change pas.
    Je pense que le problème est que la conversion AN ne se lance pas mais je n'arrive pas à le résoudre.

    J'attends vos conseils merci d'avance.

    -----
    Dernière modification par Antoane ; 31/10/2016 à 15h53. Motif: Ajout balises code

  2. #2
    invite830075ec

    Re : Récupérer valeur d'un potentiomètre par un pic sous mplabx

    Salut,
    le flag DONE n'a aucun effet sur l'ADC, il sert juste à détecter la fin de conversion. Il faut monter le bit SAMP pour démarrer l'échantillonnage, puis le descendre pour démarrer la conversion (parce que SSRC = 0).

  3. #3
    invited6d97512

    Re : Récupérer valeur d'un potentiomètre par un pic sous mplabx

    Ok merci, donc ce la donnerait:

    Code:
    while(1)
        {
            AD1CON1bits.ASAM=0; //pour utiliser le samp
            AD1CONbits.SAMP=1; //Echantillonage
            AD1CONbits.SAMP=0; //Conversion
            
            while(AD1CON1bits.DONE==0) //tant que la conversion n'est pas terminée
            {
                analog_reading=ADC1BUF0; //on récupère la valeur dans le buffer et on la met dans analog_reading, résultat sur 16 bits
            }
        }
    Le SSRC est à 0 par défaut ou faut-il que le définisse à 0 dans l'init? ASAM est bien à 0 dans ce cas là ?

  4. #4
    invite830075ec

    Re : Récupérer valeur d'un potentiomètre par un pic sous mplabx

    Tout cela est dans la doc, les registres ont une valeur par défaut au reset.
    La durée d'échantillonnage se calcule selon schéma, impédance, ...
    Pour le réglage de l'horloge de l'ADC, il y a aussi des contraintes.
    http://ww1.microchip.com/downloads/e...Doc/70621c.pdf

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

    Re : Récupérer valeur d'un potentiomètre par un pic sous mplabx

    Re !
    J'ai un peu continué et modifié 2 3 trucs, quand je lance le mode debug en testant sur a carte, les instructions en mode step by step partent dans tous les sens et je ne récupère rien dans mon buffer, il reste à 0.

    Code:
    void port_init (void)
    {
        TRISEbits.TRISE13 = 1; //potentiomètre en entrée
    }
    
    void adc_init(void)
    {
        //POT sur AN13/RE13
        //DIODE sur RD6
        AD1CHS0bits.CH0SB = 0b01101; //AN13 en analogue sur MUXB
        AD1CON1bits.ADON = 1; //ADC opérationnel
        AD1CON1bits.SSRCG = 0; //implication sur SSRC
        AD1CON1bits.ASAM = 0; //sampling begins when SAMP bit is set
        AD1CON1bits.SSRC = 0b000; //clearing SAMP ends sampling and starts conversion
        AD1CON4bits.ADDMAEN = 0; //result stored in ADC1BUF0 par les registreS ADC1BUFF, on utilise pas le DMA
    }
    
    int16_t main(void)
    {
        ConfigureOscillator();
        InitApp();
    
        
        //POTENTIOMETRE
        int i=0;
        int analog_reading;    
        
        port_init();
        adc_init();
        
        while(1)
        {
            AD1CON1bits.DONE = 0; //conversion not started or in progress (automatically set when conversion complete)
            __delay_ms(1); 
            AD1CON1bits.SAMP = 1; //Echantillonage
            __delay_ms(10);        
            AD1CON1bits.SAMP = 0; //Conversion        
    
            while(AD1CON1bits.DONE == 0) //tant que la conversion n'est pas terminée
            {
                i++; //on attend, conversion en cours
            }
            analog_reading = ADC1BUF0;//on récupère la valeur dans le buffer et on la met dans analog_reading, résultat sur 16 bits        
        }
    }
    1/J'ai l'impression de tourner en rond, mais là je ne vois pas quel registre à définir en plus ou ceux mal définis
    2/Satinas je ne vois pas ce que je dois renseigner concernant la clock de l'ADC.
    3/Est-ce que je définis bien AD1CHS0bits.CH0SB (je ne vois pas la différence entre l'utilisation du MUXA ou MUXB)
    4/L'utilisation et la combinaision de SAMP et DONE est-elle bonne ?

    Merci d'avance

  7. #6
    invite830075ec

    Re : Récupérer valeur d'un potentiomètre par un pic sous mplabx

    Tu as mis quoi dans ADPCFG ?
    Pour l'horloge il faut une période Tad minimale, selon le type de processeur.

  8. #7
    invite830075ec

    Re : Récupérer valeur d'un potentiomètre par un pic sous mplabx

    bit 0
    ALTS: Alternate Input Sample Mode Select bit
    1 = Uses MUX A input multiplexer settings for first sample, then alternate between MUX B and MUX A input multiplexer settings for all subsequent samples
    0 = Always use MUX A input multiplexer settings

  9. #8
    invited6d97512

    Re : Récupérer valeur d'un potentiomètre par un pic sous mplabx

    Pour le "ADPCFG" je ne l'ai pas trouvé dans la datasheet donc je n'ai rien mi dedans !

    Ok donc du coup j'ai changé
    Code:
    AD1CHS0bits.CH0SB = 0b01101; //AN13 en analogue sur MUXB
    En
    Code:
    AD1CON2bits.ALTS = 0 //on utilise toujours MUXA
    AD1CHS0bits.CH0SA = 0b01101; //AN13 en analogue sur MUXA
    Concernant l'horloge, si je suis obligé de définir un Tad ? Je ne peux pas juste utiliser la clock interne ?
    Code:
    AD1CON3bits.ADRC = 1;

  10. #9
    invited6d97512

    Re : Récupérer valeur d'un potentiomètre par un pic sous mplabx

    Je viens de retester sur la mclv2 avec les modif précédentes et ça a l'air de plutôt marcher !
    J'obtiens une plage de valeurs entre 009 et 3FF (1023) entre le min et max du potar

  11. #10
    invite830075ec

    Re : Récupérer valeur d'un potentiomètre par un pic sous mplabx

    ben tant mieux ...

    ADPCFG c'était pour les anciens pic. Voir registre ANSELE, mais par défaut, il met A13 en analogique, donc ça devrait être bon.

    Datasheet de ton pic, dans ADC conversion timing requirements, il est indiqué:
    - si conversion 10 bits (max 1Msps), Tad doit être supérieur à 76 ns
    - si conversion 12 bits (max 500ksps), Tad doit être supérieur à 117,6 ns

    Tad c'est la période de base de l'ADC. Tu la règles dans ADCS registre AD1CON3.
    La durée de la conversion sans l'échantillonnage, c'est une dizaine de Tad
    Par défaut ADCS = 0, donc Tad = Tcy
    Tcy c'est la période système de la cpu, tu l'as réglée dans ConfigureOscillator()
    En supposant que Fcy = 40 MHz, cela te fait un Tad = 25 ns, pas bon.
    Il faut augmenter Tad dans ADCS, sinon ça marche hors spécif ...

  12. #11
    invited6d97512

    Re : Récupérer valeur d'un potentiomètre par un pic sous mplabx

    Ok nickel merci !

    Il n'y a pas de pb normalement,
    j'ai ma fréquence système SYS_FREQ = 7370000
    ma fréquence FCY = SYS_FREQ / 2
    FCY=3685000
    TCY=271 ns
    Ce qui est bien supérieur à 76 ns (conversion 10 bits)

Discussions similaires

  1. recuperer les valeurs d'un potentiomètre stm32
    Par invite7cc68e2e dans le forum Électronique
    Réponses: 1
    Dernier message: 12/02/2015, 00h17
  2. Récupérer la position d'un potentiomètre
    Par Dr_H2O2 dans le forum Électronique
    Réponses: 20
    Dernier message: 09/03/2014, 23h08
  3. VHDL - Récupérer la valeur d'un potentiomètre
    Par invite90a3e46b dans le forum Électronique
    Réponses: 23
    Dernier message: 28/11/2013, 21h22
  4. Stabilité de MPLABX sous Seven
    Par invitec1cd705e dans le forum Électronique
    Réponses: 1
    Dernier message: 22/05/2013, 16h03
  5. comment je peu recuperer la valeur de mon potentiometre???
    Par invite53ea1bbd dans le forum Électronique
    Réponses: 12
    Dernier message: 11/02/2007, 23h21
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...