Introduction
Les microcontrôleurs de la famille des dsPIC30F ne disposent que d’un seul convertisseur analogique numérique. Il n’est donc pas possible de faire plusieurs conversions en simultané.
Cependant, ce dernier peut-être relié à différentes entrées analogiques par l’intermédiaire d’un multiplexeur analogique (voir schéma suivant).

A l’aide du contrôleur de séquence inclus dans ce CAN, il est également possible de le configurer pour échantillonner plusieurs entrées choisies successivement dans les mémoires tampons disponibles.
Exemple d’utilisation
Dans l’exemple suivant, on souhaite utiliser les entrées analogiques AN0 et AN4. Leur conversion est ensuite stockée dans un tableau appelé MesureCAN.
Le CAN est configuré pour activer une interruption à chaque fin de conversion. La conversion est rythmée par le timer 3.
Initialisation du microcontroleur et de l’ADC
void init_ds_PIC(void){ ADPCFG = 0xFFEE; // AN0 and AN4 in analog input (RB0 and RB4) // Timer3 Configuration - For sampling timing T3CONbits.TCS = 0; // Interal clock source T3CONbits.TCKPS = 0b00; // Prescaler = 1 T3CONbits.TGATE = 0; T3CONbits.TSIDL = 0; T2CONbits.T32 = 0; // 16 bits mode PR3 = 147; // Fsampling = 100 kHz // ADC - Multichannel : doc paragraph 18.8.2.2 and 18.2 table ADCON1bits.ADON = 0; ADCON1bits.ADSIDL = 0; ADCON1bits.FORM = 0b00; ADCON1bits.SSRC = 0b010; // Special event mode -> Convert with T3 ADCON1bits.ASAM = 1; // Automatic mode ADCON2bits.VCFG = 0b000; ADCON2bits.CSCNA = 1; // Multichannel ADCON2bits.SMPI = 0b0001; // 2 buffers used ADCON2bits.BUFM = 0; // 16 bits ADCON2bits.ALTS = 0; // Only MUXA used ADCON3bits.SAMC = 1; // Not used ADCON3bits.ADRC = 0; ADCON3bits.ADCS = 1; // Conversion time fixed to 14 TAD ADCSSL = 0; // Channels selection ADCSSLbits.CSSL0 = 1; // Channel 0 to ADC ADCSSLbits.CSSL4 = 1; // Channel 4 to ADC // Interrupts INTCON1bits.NSTDIS = 0; // IEC0bits.ADIE = 1; // ADC interrupt enabled IPC2bits.ADIP = 0b110; // Priority = 6 INTCON2bits.INT0EP = 1; // Interrupt on negative edge IEC0bits.INT0IE = 1; IPC0bits.INT0IP = 0b111; // Priority = 7 // Enable T3 and ADC ADCON1bits.ADON = 1; T3CONbits.TON = 1; }
Routine d’interruption pour le CAN
void __attribute__((__interrupt__)) _ADCInterrupt(void){ PORTBbits.RB0 = !PORTBbits.RB0; // To check sampling timing MesureCAN[0] = ADCBUF0; MesureCAN[1] = ADCBUF1; IFS0bits.ADIF = 0; // Re-activate Interrupt }