1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
| void anaInit(void){
// *******************************************
// configuration des I/O => input
TRISBbits.TRISB0 = 1; AD1PCFGbits.PCFG0 = 0; // active voie 0
TRISBbits.TRISB1 = 1; AD1PCFGbits.PCFG1 = 0; // active voie 1
TRISBbits.TRISB2 = 1; AD1PCFGbits.PCFG2 = 0; // active voie 2
// ...
TRISBbits.TRISB15 = 1; AD1PCFGbits.PCFG15 = 0; // active voie 15
// Remarque : on peut aussi ecrire directement dans les registres en utilisant : TRISB et AD1PCFG (registres de 16 bits);
// => cette méthode serait prévérable car on pourrait tout configurer en un seul coup (=> gain de code)
// => exemple :
// TRISB = MASK_BIT0 | MASK_BIT1 | ... | MASK_BIT15 | TRISB;
// AD1PCFG = 0xFFFF & (~MASK_BIT0) & (~MASK_BIT1) & ... & (~MASK_BIT15);
// *******************************************
// activation des mesure
AD1CSSLbits.CSSL0 = 1; // active voie 0
AD1CSSLbits.CSSL1 = 1; // active voie 1
// ...
AD1CSSLbits.CSSL15 = 1; // active voie 15
// *******************************************
// configuration du nombre de voies à mesurer
// => mesure de 16 voies
AD1CON2bits.SMPI = 15; // => valeur = n - 1
}
static unsigned long tabVal[16]; // unsigned long : taille 64 bits (8 octets)
// récupère les valeurs
void anaGet(void){
// création des pointeurs
// unsigned int : taille 32 bits (4 octets)
unsigned int *ptReg;
unsigned int i;
static nb_mesures = 0;
// ****************************************
// réinitialisation des valeurs
if (nb_mesures == 0){
for(i=0; i<16; i++){
tabVal[i] = 0;
}
}
// ****************************************
// récupération des valeurs
// les valeurs à lire sont dans les registres ADC1BUF0, ADC1BUF1, ..., ADC1BUFA, ADC1BUFB, .... , ADC1BUFF
// => ce sont des registres de 32 bits (4 octets)
// Remarque : les adresses des registres se suivent
ptReg = &ADC1BUF0;
for(i=0; i<16; i++){
// récupération des valeurs
// => on cumule les valeurs récupérées pour pouvoir faire un moyennage
tabVal[i] += *ptReg;
ptReg++; // incrémentation du pointeur
}
// ****************************************
// gestion du moyennage
nb_mesures++;
if (nb_mesures == 8){
// division par 8 des valeurs
for(i=0; i<16; i++){
tabVal[i] >>= 3;
}
nb_mesures = 0;
// ****************
// affectation des valeurs à des variables globales
// => code spécifique à l'application
// => il peut y avoir des calculs de conversion
temperature = tabVal[0];
alimentation = tabVal[1];
// ...
humidite = tabVal[15];
}
} |
Partager