[Programmation] PIC24E - ADC 10-bit à 1Ms/s, quelle configuration
Répondre à la discussion
Affichage des résultats 1 à 6 sur 6

PIC24E - ADC 10-bit à 1Ms/s, quelle configuration



  1. #1
    SportsEngine

    PIC24E - ADC 10-bit à 1Ms/s, quelle configuration


    ------

    Bonjour,

    J'utilise le PIC24EP512GU810 et j'ai besoin d'utiliser l'ADC interne : ADC1, 1 voie, 10-bit, 1 Mech/s, sans DMA.

    J'ai quelques soucis de compréhension de la datasheet et du Family Reference Manual, qui semblent comporter des erreurs et contradictoires sur certains points.

    Je me trouve dans le cas où :

    - ADC 10 bit, résultat entier non signé, conversion automatique (horloge système) :
    AD12B=0 (10-bit)
    FORM=0b00 (entier non signé)
    SSRC=0b111, SSRCG=0 : conversion automatique
    ASAM=1 : conversion automatique
    AD1CON1 = 0xA0E4.

    - Mesure entre Vref+ et AVss, seulement CH0, interruption tous les 16 échantillons :
    VCFG=0b001 : Vref+/AVss
    CSCNA=1 : Scan CH0+
    CHPS=0b00 : Conversion de CH0 seulement
    SMPI=0b01111 : Interruption tous les 16 échantillons (ADDMAEN=0)
    BUFM=0 : Conversion depuis BUF-0 à BUF-F
    ALTS=0 : Aucune idée de ce que sont Sample A et B...
    AD1CON2 = 0x283C.

    - Conversion périodique à une fréquence connue, dérivée de l'horloge système (Fp) 70MHz soit division par 70 pour obtenir 1MHz :
    ADRC=0 : Horloge dérivée de l'horloge système
    SAMC=0b00000 : SSRC et SSRCG (AD1CON1) ne remplissent pas la condition
    ADCS=70 : Valeur du diviseur pour obtenir 1MHz
    AD1CON3 = 0x0046.

    - je n'utilise pas la DMA, c'est à dire :
    AD1CON4 = 0x0000 (donc ADDMAEN=0).

    Je sais que le plus sensé serait d'utiliser la DMA, mais je ne l'ai encore jamais fait, et par faute de temps je ne veux pas m'y aventurer maintenant. Donc pour ne pas saturer le processeur avec les requêtes d'interruptions, il me semble possible d'utiliser l'interruption seulement tous les 16 échantillons, afin de remplir les 16 buffers de stockage (BUF-0 à BUF-F).
    Seulement il y a une incohérence entre la datasheet (SMPI p.421) et le reference manual (SMPI p.10).
    De plus je ne comprends ni à quoi correspondent Sample A et Sample B (AD1CON2 bit 0 - ALTS p.420) ni la phrase "ADC is currently filling one half of the buffer, user application should access the other half of the buffer" (AD1CON2 Bit 7 - BUFS p.419).

    Si quelqu'un pouvait m'éclairer sur ces quelques points ce serait vraiment génial!

    -----

  2. #2
    jojo150393

    Re : PIC24E - ADC 10-bit à 1Ms/s, quelle configuration

    Bonjour, peux-tu nous citer l'incohérence pour nous éviter chercher ? Sinon d'après ma brève lecture de la datasheet, sample A et Sample B, j'ai l'impression que c'est la broche + et la broche - de l'Adc.
    Pour la phrase, c'est veut dire que les 8 premiers buffer ou les 8 derniers (dépend de ta config) sont en train d'être remplis et tu dois donc lire les 8 autres.

  3. #3
    SportsEngine

    Re : PIC24E - ADC 10-bit à 1Ms/s, quelle configuration

    Bonjour,

    Pour les incohérences ça concerne les bits SMPI et ADDMAEN :

    Dans la datasheet (p.419) :
    SMPI<4:0> When ADDMAEN = 0:
    01111 = Generates interrupt after completion of every 16th sample/conversion operation
    ...
    When ADDMAEN = 1:
    11111 = Increments the DMA address after completion of every 32nd sample/conversion operation
    Dans le reference manual (p.10):
    For Devices with DMA and with the ADC DMA Enable bit (ADDMAEN) Set (ADDMAEN=1):
    x1111 = Increments the DMA address after completion of every 16th sample/conversion operation
    ...
    For Devices without DMA and for Devices with DMA that have the ADC DMA Enable bit (ADDMAEN) Clear (ADDMAEN=0):
    11111 = ADC interrupt is generated at the completion of every 32nd sample/conversion operation
    Ok pour l'histoire de sample A et B, et pour les 2 moitiés de buffer, je suppose que si je déclenche l'interruption après la fin des 16 conversions je n'aurai pas à me préoccuper de l'ordre puisque les 16 buffers seront disponibles, c'est exact?

  4. #4
    SportsEngine

    Re : PIC24E - ADC 10-bit à 1Ms/s, quelle configuration

    Je pige pas... J'ai essayé la config que j'ai donné précédemment, mais il semble que je plafonne à 500k echantillons/s...

    Code:
    volatile char ADC1_interrupt=0;
    
    /* ADC Interrupt subroutine */
    void __attribute__((interrupt, no_auto_psv)) _AD1Interrupt(void)
    {
        _AD1IF=0;
        if(AD1CON1bits.DONE == 1)
            ADC1_interrupt=1;
    }
    Code:
    if(ADC1_interrupt==1)
                {
                    adcResult[0]=ADC1BUF0;
                    adcResult[1]=ADC1BUF1;
                    adcResult[2]=ADC1BUF2;
                    adcResult[3]=ADC1BUF3;
                    adcResult[4]=ADC1BUF4;
                    adcResult[5]=ADC1BUF5;
                    adcResult[6]=ADC1BUF6;
                    adcResult[7]=ADC1BUF7;
                    adcResult[8]=ADC1BUF8;
                    adcResult[9]=ADC1BUF9;
                    adcResult[10]=ADC1BUFA;
                    adcResult[11]=ADC1BUFB;
                    adcResult[12]=ADC1BUFC;
                    adcResult[13]=ADC1BUFD;
                    adcResult[14]=ADC1BUFE;
                    adcResult[15]=ADC1BUFF;
                    ADC1_interrupt=0;
                    for(i=0;i<16;i++)
                    {
                        sprintf(str,"BUF %u : %u\r\n",i,adcResult[i]);
                        UART1_writeString(str);
                    }
                    UART1_writeString("\r\n********************\r\n");
                }
    Code:
    05/04/2019 11:23:03,177	BUF 0 : 5
    05/04/2019 11:23:03,178	BUF 1 : 3
    05/04/2019 11:23:03,179	BUF 2 : 1023
    05/04/2019 11:23:03,201	BUF 3 : 1023
    05/04/2019 11:23:03,202	BUF 4 : 3
    05/04/2019 11:23:03,204	BUF 5 : 3
    05/04/2019 11:23:03,205	BUF 6 : 1023
    05/04/2019 11:23:03,206	BUF 7 : 1023
    05/04/2019 11:23:03,207	BUF 8 : 3
    05/04/2019 11:23:03,208	BUF 9 : 3
    05/04/2019 11:23:03,209	BUF 10 : 1022
    05/04/2019 11:23:03,210	BUF 11 : 1023
    05/04/2019 11:23:03,212	BUF 12 : 3
    05/04/2019 11:23:03,214	BUF 13 : 3
    05/04/2019 11:23:03,216	BUF 14 : 1023
    05/04/2019 11:23:03,217	BUF 15 : 1023
    05/04/2019 11:23:03,218	
    05/04/2019 11:23:03,219	********************
    Je génère une PWM à 250 kHz 50%, donc à 1 Mech/s je devrais récupérer 4 états hauts 4 états bas, or je récupère que 2 états hauts et 2 états bas donc 500k...
    J'utilise la version gratuite du compilo XC16 (v1.36), est-ce que c'est possible que ça ait un lien avec l'absence d’optimisation (je ne crois pas trop aux légendes urbaines du genre "il rajoute du code inutile" ^^)

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

    Re : PIC24E - ADC 10-bit à 1Ms/s, quelle configuration

    La valeur d'ADCS n'est pas bonne. La formule est :
    TAD = TCY * (ADCS + 1). Or Tcy = 2/Fosc = 2/70Mhz dans ton cas. La fréquence du cpu est la moitié de l'oscillateur.
    Sauf que en plus,
    Tconv = 12 * Tad en 10bits (equation 16-2 p16 du family). Pour avoir 1Msps, Tconv = 1000ns => Tad = 83.3ns
    Adcs = TAD/TCY - 1 = 83.3ns/2/70Mhz - 1 = 2.91 = 3 => La fréquence sera de 730Kbps.

  7. #6
    SportsEngine

    Re : PIC24E - ADC 10-bit à 1Ms/s, quelle configuration

    Bonjour,

    Je croyais avoir résolu mon problème, mais j'ai encore des questions...

    Tout d'abord pour rectifier, je suis à Fosc=140 MHz donc Fp=Fcy=70 Mhz, il n'y a pas de division par 2 supplémentaire, mais le raisonnement est bon et finalement il semble que j'arrive à échnatillonner à 1Msps (je récupère une période complète d'un signal sinusoidal de 15 kHz)

    Dans ma configuration actuelle je fais une interruption une fois que l'ADC a récupéré ses 16 échantillons (ADC1BUF0 à ADC1BUFF). Le problème, c'est que pour mon projet qui consiste à émettre une impulsion dans une charge capacitive et de lire la décharge. Pour une raison définie dans le cahier des charges, il faudrait pouvoir appliquer un deadtime (pas de 1µs) avant de commencer l'acquisition. Ce qui engendre deux problèmes :
    - Si je démarre l'acquisition juste après ce deadtime, j'ai des pertes de données car l'ADC met du temps à démarrer (je perds entre 4µs et 5µs à priori).
    - Si je commence l'acquisition avant, je n'ai aucun moyen de savoir en temps réel quel buffer (ADC1BUFx) vient d'être rempli, car je n'ai trouvé aucun registre d'index, et entre le début et la fin il s'est écoulé 16µs...
    - Si je configure l'interruption pour se produire 1 fois par échantillon : a) je ne sais toujours pas quel buffer a été rempli car pas d'index, b) la fréquence d'interruption est trop élevée et bloque d'autres périphériques comme le thread USB...

    Autant je comprends qu'avoir une profondeur de mémoire de 16 buffers est intéressante, mais le fait qu'il ne soit pas indexé ça complique vraiment les choses...

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/02/2019, 09h56
  2. [Programmation] Problème allocation mémoire PIC24E avec XC16
    Par SportsEngine dans le forum Électronique
    Réponses: 3
    Dernier message: 13/10/2017, 23h01
  3. [Programmation] Problème sortie de veille PIC24E
    Par SportsEngine dans le forum Électronique
    Réponses: 8
    Dernier message: 01/08/2017, 17h45
  4. Antenne Ricoré / Modem / PC ... quelle configuration ?
    Par fcsjeux dans le forum Internet - Réseau - Sécurité générale
    Réponses: 4
    Dernier message: 04/06/2012, 10h25
  5. quelle configuration?
    Par invite49204e87 dans le forum Matériel astronomique et photos d'amateurs
    Réponses: 2
    Dernier message: 26/08/2011, 22h42
Découvrez nos comparatifs produits sur l'informatique et les technologies.