Je dispose d'un pic18f4550, de mplab v8.46 et d'un pickit2 (avec un quartz de 20mhz)
J'ai 4 Transducteur a ultrasons placé sur les port AN0;AN1;AN2;AN3
Avec 4 boutons CAP1;CAP2;CAP3:CAP4 qui permettent d'afficher le résultat de la conversion en 10 bit sur le PORTB(adresl) et le PORTC(adresh)
Cependant maintenant, j'aimerai automatisé le passage d'un capteur à un autre.
Par exemple, j'aimerai acquérir le résultat des conversion de chaque capteur, toute les 50ms;
Je débute en C, ainsi qu'avec les pics; Je ne sais pas comment utilisé les Timer, d'ailleurs, je me demande si une simple boucle qui incrémente jusqu'à 4 pourrait faire l'affaire? une boucle qui s'incrémenterait toute les 50ms, et qui changerai ma variable choix(ADCON0);
enfin bref voilà, je vous remercie pour toute les idées ou critiques qui me feront avancer !
Voici mon code
#include <p18f4550.h>
#pragma config FOSC = HS
#pragma const config FCMENB = OFF
#pragma const config IESOB = OFF
#pragma config PWRT = OFF
#pragma const config BOR = BOHW
#pragma const config BORV = 20
#pragma config WDT = OFF
#pragma config DEBUG = OFF
#pragma config LVP = OFF
#pragma config PBADEN = OFF
#define CAP1 PORTDbits.RD0
#define CAP2 PORTDbits.RD1
#define CAP3 PORTDbits.RD5
#define CAP4 PORTDbits.RD7
#define LED1 PORTDbits.RD2
#define LED2 PORTDbits.RD3
#define LED3 PORTDbits.RD4
#define LED4 PORTDbits.RD6
#define quantum 4.8828e-3 //5/1024 -> 0,0048828 mv
int choix;
int result;
int Vcap;
float Vnum;
void adc_conv(void);
void adc_init(void);
void calc_tens(void);
void main(void)
{
adc_init();
adc_conv();
calc_tens();
}
///////////////////////////////////////////////////////////////////////////////////////
//////////////////// Convertion AD pour 4 Transducteur a Ultrasons ////////////////////
////////////////////////// LV-MaxSonar®-EZ0 : 0.50cm a 700cm //////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
void adc_conv(void)
{
choix=0b00000000;
if(CAP1==1) {choix=0b00000101;LED1=1;} //Capteur 1 sur AN1
else{LED1=0;}
if(CAP2==1) {choix=0b00001001;LED2=1;} //Capteur 2 sur AN2
else{LED2=0;}
if(CAP3==1) {choix=0b00001101;LED3=1;} //Capteur 3 sur AN3
else{LED3=0;}
if(CAP4==1) {choix=0b00000001;LED4=1;} //Capteur 0 sur AN0
else{LED4=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
LATB=ADRESL;
LATC=ADRESH;
ADCON0=0x00; // can éteint
}
///////////////////////////////////////////////////////////////////////////////////////
//////////////////// Calcul AD; 9,8mv/2.54cm soit 3.86mv/1cm /////////////////////////
///////////////////// Vcap = Vcc/512; Résolution sur 9 Bits ///////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
void calc_tens(void)
{
Vcap=((ADRESH*256)+ADRESL);
Vnum = ((float)Vcap) * quantum;
}
void adc_init(void)
{
LATB=0x00;
LATC=0x00;
TRISD=0b10000011; //RD0,RD1,RD5,RD7 en entrée
TRISB=0b00000000; //RB en sortie
TRISC=0b00000000; //RC en sortie
}
