Convertion analogique numérique.

Mik3five -  
 Mik3five -
Bonjour,

J'ai un pic 18f4550, et j'aimerai apprendre a utiliser l'adc
Enfaite j'aimerai qu'on m'explique, si j'ai faux lol (je débute en C, ainsi qu'avec les pics)

1. On configure les bits du registre ADCON0; ADON pour activer le module de conversion et CHS3:CHS0 pour sélectionner la voie a convertir.

2. On configure les bits du registre ADCON1; PCF3:PCF0 pour définir les ports de conversions et VCFG1:VCFG0 pour les tensions de référence (dans mon cas vdd et vss)

3.On configure les bits du registre ADCON2; ADCS2:ADCS0 pour sélectionner l'horloge de réference, ACQT2:ACQT0 pour le temps d'acquisition et ADFM pour la justification a droite ou a gauche dans les registres ADRESH et ADRESL

mais ensuite? Je comprends pas comment utiliser ADCON0Bits.GO_DONE ? On le met a 1 pour débuter la conversion, et il passe tout seule a 0 lorsqu'elle est fini ??
Et aprés le resultat de la conversion est dans le registre ADRESH:ADRESL?

Enfaite, j'ai un transducteur a ultrason avec une sortie analogique, et j'aimerai mettre 8 LED sur le port B pour connaitre sa tension. Seulement l'ADC est en 10 Bits, et moi je veux un résultat sur 8 bit, un décalage suffirai ??

et si je veux mettre le résultat de la conversion sur le port B
J'ai juste a écrire

resultat=PORTB; ? (en ayant bien sur au préalable, défini le port B comme une sortie et avoir configuré le registre PBADEN)

Merci pour toute l'aide que vous pourrai m'apporter ;)

2 réponses

eriiic Messages postés 25847 Date d'inscription   Statut Contributeur Dernière intervention   7 282
 
Bonjour,

Enfaite, j'ai un transducteur a ultrason avec une sortie analogique, et j'aimerai mettre 8 LED sur le port B pour connaitre sa tension. Seulement l'ADC est en 10 Bits, et moi je veux un résultat sur 8 bit, un décalage suffirai ??
Je dirais oui, 2 décalages à droite. Et donc une petite perte de précision mais tu n'as pas le choix.
eric
0
Mik3five
 
Voici mon code,
pour la ADC, j'ai compris le fonctionement, cependant, j'aimerai avec l'aide de deux boutons RDO et RD1, utilisé soit le port AN0, AN1 et AN2
Deux leds, LED0 et LED1 devront me dire, si RD0 ou/et RD1 sont appuyé.
Sur le PORTB, il y'a 8 led, qui m'indique sur 8 bits la tension présente.

#include <p18f4550.h> 
#include <adc.h> 


#pragma config FOSC = HS   //OSCILLATOR 
#pragma const config FCMENB = OFF //Fail Safe Clock Monitor Disabled 
#pragma const config IESOB = OFF //Internal External Osc. Switch Disabled 
#pragma config PWRT = OFF   //Power Up Timer Disabled 
#pragma const config BOR = BOHW  //Brown Out Reset Enabled in HW, SBOREN disabled 
#pragma const config BORV = 20  //Brown Out Voltage : 2.0V 
#pragma config WDT = OFF   //WATCHDOG HW Disabled - SW Controlled 
#pragma config DEBUG = OFF   //DEBUG Disabled 
#pragma config LVP = OFF   //Low Voltage Programming Disabled 
#pragma config PBADEN = OFF 



#define RD0 PORTDbits.RD0 
#define RD1 PORTDbits.RD1 
#define LED0 PORTDbits.RD2 
#define LED1 PORTDbits.RD3 



int choix; 
int result; 
int adc_conv(int choix); 

void main(void) 
{ 
TRISD=0x00; 
TRISB=0x00; 
adc_conv(choix); 
LATB=ADRES; 

} 

int adc_conv(int choix) 
{ 

if(RD0==1) {choix=0b00000101;LED0=1;} 
if(RD1==1) {choix=0b00001001;LED1=1;} 
if(RD1==1&&RD0==1){LATB=0xFF;} 
else{choix=0b00000001;LED0=0;LED1=0;} 


ADCON0=choix;   // Sélection du can;  
ADCON1=0b00001110; 
ADCON2=0b10101100; 
ADCON0bits.ADON=1; 
ADCON0bits.GO_DONE=1;   // début convertion 
while(ADCON0bits.GO_DONE); // attente convertion 
ADCON0bits.GO_DONE=0;  // fin convertion 
return(ADRES); 
ADCON0=0x00;    // can éteint   
} 
0