Errore calcolo distanza con ultrasuoni
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
Funzione che si occupa di prendere la distanza dal sensore
ISR:
Il mio probema, secondo me sta nell' operazione
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?
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?