Pagina 1 di 1

Errore calcolo distanza con ultrasuoni

MessaggioInviato: 10 mar 2015, 15:11
da Davide90
Salve ragazzi, ancora una volta necessito del vostro aiuto
stavolta non riesco ad ottenere la distanza precisa misurata dal modulo HC-SR04.

Vi posto il codice:
main.c
Codice: Seleziona tutto
int get_SFR04(unsigned char pin_attivo);// prototipo della funzione
double distanza_sensore_esaminato;
unsigned int sensore_esaminato,usDista;
void main (void){
usDista=0;
sensore_esaminato=0;
while(1){
//calcolo della distanza
    distanza_sensore_esaminato=(get_SFR04(sensore_esaminato_MASK)*17UL)/1000;
// divido per mille perché ho impostato il TIMER1 per interrupt ogni 10 us
   usDista=0;
    // delay tra due trigger 10 us
    TMR1IF=0;
    TMR1H = 255;
    TMR1L = 176;
    T1CON=0x01;
    while(!TMR1IF);
    T1CON=0x00;
    TMR1IF=0;
}

}

Funzione che si occupa di prendere la distanza dal sensore

Codice: Seleziona tutto
int get_SFR04(unsigned char pin_attivo){
//configuro il timer1 per un interrupt ogni 10 us //TRIGGER

TMR1IF=0;
TMR1H = 255;
TMR1L = 176;
T1CON=0x01;
PORTA = PORTA | pin_attivo;//TRIGGER , lasciando invariati gli altri BIT
while(!TMR1IF);

    PORTA^=pin_attivo;// spengo il trigger
T1CON=0x00;
//Abilito la rilevazione degli interrupt del timer1
PIE1bits.TMR1IE=1;
T1CON=0x01;  //accendo il timer1
while(!echo_1 || usDista==6553);//out of Range
  T1CON=0x00;//spengo il timer
  PIE1bits.TMR1IE=0;
  usDista=0;
  return usDista;

}

ISR:

Codice: Seleziona tutto
void interrupt ISR(void){
   
     if (TMR1IF){
        // interrupt ogni 10 us
             TMR1IF=0;
             
             TMR1H = 255;
             TMR1L = 176;
             usDista++;
           
         
     }
    /* if (TMR2IF){
         //interrupt ogni 100 us
        ON_motore_speed++;

             TMR2IF=0;


     }*/
     if(IOCIF){
         if(IOCBF0){
             IOCBF0=0;
             if (echo_1==0){
             echo_1=1;
             }else{
                echo_1=0;
             }
         }
         if(IOCBF1){
             IOCBF1=0;
             if (echo_2==0){
             echo_2=1;
             }else{
                echo_2=0;
             }
         }
         if(IOCBF2){
             IOCBF2=0;
             if (echo_3==0){
             echo_3=1;
             }else{
                echo_3=0;
             }
         }
         if(IOCBF3){
             IOCBF3=0;
             if (echo_4==0){
             echo_4=1;
             }else{
                echo_4=0;
             }
         }
     }
   





// fine interrupt service routine

}


Il mio probema, secondo me sta nell' operazione
Codice: Seleziona tutto
distanza_sensore_esaminato=(get_SFR04(sensore_esaminato_MASK)/58);


Con l'oscilloscopio riesco a vedere l' echo di ritorno dal sensore, facendo i calcoli manualmente ottengo un valore congruo con la distanza a cui si trova l' oggetto. Se invece vado , in modalità debug , a verificare il valore di distanza_sensore_esaminato nel pannello watches, ottengo zero, oppure un valore di molto distante da quello letto con l' oscilloscopio.

Il PIC è un 16f1713 con quarzo a 32 MHz, avete idee?

Re: Errore calcolo distanza con ultrasuoni

MessaggioInviato: 10 mar 2015, 15:31
da eAlucarD
il modulo si chiama HC-SR04
puoi dare l'impulso su trigger una volta ogni 60 millisecondi
per misurazioni precise faccio la media di 16 misurazioni
senza tenere conto della temperatura sbaglia di circa 1 cm

Re: Errore calcolo distanza con ultrasuoni

MessaggioInviato: 10 mar 2015, 15:48
da Davide90
il modulo si chiama HC-SR04

Corretto

puoi dare l'impulso su trigger una volta ogni 60 millisecondi


Corretto così:
Codice: Seleziona tutto
// delay tra due trigger 60 ms
    TMR1IF=0;
    TMR1H = 19;
    TMR1L = 23;
    T1CON=0x31;
    while(!TMR1IF);
    T1CON=0x00;
    TMR1IF=0;


Sono minimo 60,5 ms prima di rieseguire il successivo trigger

Nessun cambiamento, sempre 0

Re: Errore calcolo distanza con ultrasuoni

MessaggioInviato: 10 mar 2015, 17:04
da Davide90
Ho semplificato il codice, ora è questo
Codice: Seleziona tutto
int get_SFR04(unsigned char pin_attivo){
//configuro il timer1 per un interrupt ogni 10 us //TRIGGER

TMR1IF=0;
TMR1H = 255;
TMR1L = 176;
T1CON=0x01;
PORTA = PORTA | pin_attivo;//TRIGGER up to now, lasciando invariati gli altri BIT
while(!TMR1IF);

    PORTA^=pin_attivo;// spengo il trigger
T1CON=0x00;
//Abilito la rilevazione degli interrupt del timer1
TMR1IF=0;
TMR1H = 0;
TMR1L = 0;
while(echo_1);
T1CON=0x31; // accendi il timer1 quando il segnale di echo arriva su uno dei pin, precaler a 1/8
while (!echo_1);
    T1CON=0x00;
    a=(TMR1L | (TMR1H<<8))/58.82;
return a;


la ISR diventa :

Codice: Seleziona tutto
void interrupt ISR(void){

    /* if (TMR2IF){
         //interrupt ogni 100 us
        ON_motore_speed++;

             TMR2IF=0;


     }*/
     if(IOCIF){
         if(IOCBF0){
             IOCBF0=0;
             if (echo_1==0){
             echo_1=1;
             }else{
                echo_1=0;
             }
         }
         if(IOCBF1){
             IOCBF1=0;
             if (echo_2==0){
             echo_2=1;
             }else{
                echo_2=0;
             }
         }
         if(IOCBF2){
             IOCBF2=0;
             if (echo_3==0){
             echo_3=1;
             }else{
                echo_3=0;
             }
         }
         if(IOCBF3){
             IOCBF3=0;
             if (echo_4==0){
             echo_4=1;
             }else{
                echo_4=0;
             }
         }
     }
   





// fine interrupt service routine

}


Se metto un breakpoint in corrispondeza di
Codice: Seleziona tutto
return a;


il software funziona benissimo, ottengo la misura corretta.
Se invece , non metto alcun breakpoint, e lascio correre il programma così com'è , non funziona più, il valore di a rimane sempre quello del principio( non so il perché ma sembra essere 7);

Idee?

Re: Errore calcolo distanza con ultrasuoni

MessaggioInviato: 11 mar 2015, 17:04
da WALTERmwp
Ciao Foto UtenteDavide90,
Davide90 ha scritto:Idee?
forse, ma prima potresti magari spendere quattro righe per "spiegare" la funzione applicativa in modo tale che ci si possa rendere conto del fine e del criterio dei suoi parametri ?

Saluti

Re: Errore calcolo distanza con ultrasuoni

MessaggioInviato: 11 mar 2015, 17:29
da EcoTan
Dove esattamente hai messo la dichiarazione della variabile a ?

int a;

Re: Errore calcolo distanza con ultrasuoni

MessaggioInviato: 11 mar 2015, 20:21
da Davide90
WALTERmwp ha scritto:Ciao Foto UtenteDavide90,
Davide90 ha scritto:Idee?
forse, ma prima potresti magari spendere quattro righe per "spiegare" la funzione applicativa in modo tale che ci si possa rendere conto del fine e del criterio dei suoi parametri ?

Saluti


é semplicemente un metro ad ultrasuoni, a scopo didattico

EcoTan ha scritto:Dove esattamente hai messo la dichiarazione della variabile a ?

int a;


La dichiarazione della variabile è al di fuori del main, è dichiarata come variabile globale.

Re: Errore calcolo distanza con ultrasuoni

MessaggioInviato: 11 mar 2015, 20:34
da WALTERmwp
Foto UtenteDavide90
Davide90 ha scritto:é semplicemente un metro ad ultrasuoni, a scopo didattico
non intendevo questo ma, evidentemente, sono stato poco chiaro.
Quale è l'azione che compi (che viene compiuta), quali sono le conseguenze, qual è il feed-back che ci si aspetta, perché entrano in gioco quei tempi.
Penso d'essere stato più chiaro.
Considera che chi legge il tuo Post d'apertura non sa e non è tenuto a sapere il device ad ultrasuoni cosa implica.
Quattro righe in più consentono ad altri d'essere partecipi dandogli la possibilità di rendersi conto di cosa si sta scrivendo, e non è poco.

Saluti