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).

Convertisseur Analogique-Numérique – Documentation technique dsPIC30F3014 – Figure 19.1

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 
}
Microchip dsPIC30F / Utiliser le CAN en multi-canal / dsPIC30Fxxxx