Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Errore calcolo distanza con ultrasuoni

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[1] Errore calcolo distanza con ultrasuoni

Messaggioda Foto UtenteDavide90 » 10 mar 2015, 15:11

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?
Ultima modifica di Foto UtenteDavide90 il 10 mar 2015, 15:34, modificato 1 volta in totale.
Avatar utente
Foto UtenteDavide90
29 6
Frequentatore
Frequentatore
 
Messaggi: 130
Iscritto il: 5 lug 2012, 11:34

0
voti

[2] Re: Errore calcolo distanza con ultrasuoni

Messaggioda Foto UtenteeAlucarD » 10 mar 2015, 15:31

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
E l’uomo si addormentò e nel sogno creò il mondo
Avatar utente
Foto UtenteeAlucarD
1.210 3 5
Expert
Expert
 
Messaggi: 560
Iscritto il: 4 lug 2014, 11:01

0
voti

[3] Re: Errore calcolo distanza con ultrasuoni

Messaggioda Foto UtenteDavide90 » 10 mar 2015, 15:48

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
Avatar utente
Foto UtenteDavide90
29 6
Frequentatore
Frequentatore
 
Messaggi: 130
Iscritto il: 5 lug 2012, 11:34

0
voti

[4] Re: Errore calcolo distanza con ultrasuoni

Messaggioda Foto UtenteDavide90 » 10 mar 2015, 17:04

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?
Avatar utente
Foto UtenteDavide90
29 6
Frequentatore
Frequentatore
 
Messaggi: 130
Iscritto il: 5 lug 2012, 11:34

0
voti

[5] Re: Errore calcolo distanza con ultrasuoni

Messaggioda Foto UtenteWALTERmwp » 11 mar 2015, 17:04

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
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8982
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino

0
voti

[6] Re: Errore calcolo distanza con ultrasuoni

Messaggioda Foto UtenteEcoTan » 11 mar 2015, 17:29

Dove esattamente hai messo la dichiarazione della variabile a ?

int a;
Avatar utente
Foto UtenteEcoTan
7.720 4 12 13
Expert EY
Expert EY
 
Messaggi: 5420
Iscritto il: 29 gen 2014, 8:54

0
voti

[7] Re: Errore calcolo distanza con ultrasuoni

Messaggioda Foto UtenteDavide90 » 11 mar 2015, 20:21

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.
Avatar utente
Foto UtenteDavide90
29 6
Frequentatore
Frequentatore
 
Messaggi: 130
Iscritto il: 5 lug 2012, 11:34

0
voti

[8] Re: Errore calcolo distanza con ultrasuoni

Messaggioda Foto UtenteWALTERmwp » 11 mar 2015, 20:34

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
W - U.H.F.
Avatar utente
Foto UtenteWALTERmwp
30,2k 4 8 13
G.Master EY
G.Master EY
 
Messaggi: 8982
Iscritto il: 17 lug 2010, 18:42
Località: le 4 del mattino


Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti