Forum: Projekte & Code Ultraschall mit PARALLAX Ping)))


von Jürgen B. (hjbb49)


Angehängte Dateien:

Lesenswert?

Hat jemand hier schon mal mit dem Ultraschall Sensor von PARALLAX 
Ping)))
gearbeitet?

Ich habe den Sensor an einen ATMega8 mit 16 MHz angeschlossen.
Programmierung AVR-Studio und C!

Ich bekommen immer nur diegleichen Werte, obwohl das Modul (Ping))) 
)einwandfrei zu arbeiten scheint (Oszilloskop).

Funktionsweise:
PB0 Ausgang
5 usec Impuls senden
PB0 Eingang Capture

750 usec Pause

warten auf Antwort von Ping))

In der entsprechende Interrupt Routine:
//---------------------------------------------------------
ISR (TIMER1_CAPT_vect)
  {
  static uint8_t flanke=0;

    if (flanke == 0)
      {
      //  steigende Flanke
      StartTime = ICR1;
                NrOverflows = 0;
      TCCR1B &= ~(1 << ICES1);  // fallende Flanke
      flanke = 1;
      mess = 0;
      }
    else
      {
      //  fallende Flanke
      EndTime = ICR1;
      TCCR1B |= (1 << ICES1);    // steigende Flanke
      flanke = 0;
      mess = 1;
      }
  }
//---------------------------------------------------------
ISR( TIMER1_OVF_vect )
  {
      NrOverflows++;
  }
//---------------------------------------------------------
.....

MfG

von Stephan K. (dustpuppy)


Lesenswert?

Hi,
das sieht nach dem selben Fehler aus, den ich beim ersten Versuch mit 
Ultraschall auch gemacht habe. Du misst die Zeit zwischen den Senden und 
dem Empfang. Das ist falsch. Man sendet den Impulse und wenn die 
steigende Flanke kommt, dann misst man die Zeit bis zur fallenden Flanke 
des Ruecksignals.

Versuch's mal so. SONIC_TYPE=0 ist cm, SONIC_TYPE=1 ist inch.
1
#define SONIC_TYPE 0
2
#define SONIC_MAX_CM 40
3
#define SONIC_MAX_INCH 14
4
5
volatile int timer_set=0;
6
volatile int SONIC_RANGE;
7
8
void timer_start(void)
9
{
10
  if(timer_set==0)
11
  {
12
    // Capture bei steigender Flanke auslösen
13
    TCCR1B |= (1<<ICES1);
14
  }
15
  else
16
  {
17
    // Capture bei fallender Flanke auslösen
18
    TCCR1B &= ~(1<<ICES1);
19
  }
20
  
21
  TCNT1=0;
22
  TIMSK = 0;
23
  TIMSK |= (1<<TICIE1); //Timer Input Capture Interrupt aktivieren
24
}
25
26
void interrupt_init(void)
27
{
28
  //TIMER1 Control Register 
29
30
  //Timer1 arbeitet als normaler Zähler und zählt bis max. Wert 0xffff (65535)
31
  TCCR1A = 0;
32
  TCCR1B = 0;
33
34
  //Prescaler auf 1 setzen / CPU-Takt
35
  TCCR1B |= (1<<CS10);
36
  TCCR1B &= ~(1<<CS11) & ~(1<<CS12);
37
38
  // Rauschfilter aktivieren
39
  TCCR1B |= (1<<ICNC1) ;
40
  
41
  SONIC_TYPE=0;
42
}
43
44
void timer_stop(void)
45
{
46
  TIMSK = 0;
47
}
48
49
ISR(TIMER1_CAPT_vect)
50
{
51
  uint16_t x=0;
52
  if(SONIC_TYPE==0)    // cm
53
  {
54
    x=TCNT1 / 29 / 2;
55
  }
56
  else if(SONIC_TYPE==1)  // inch
57
  {
58
    x=TCNT1 / 74 / 2;
59
  }
60
  timer_stop();
61
  if(timer_set==0)
62
  {
63
    timer_set=1;
64
    timer_start();
65
  }
66
  else
67
  {
68
    SONIC_RANGE=-1;
69
    timer_set=0;
70
    if(SONIC_TYPE==0 && x<=SONIC_MAX_CM)
71
    {
72
      SONIC_RANGE=x;
73
    }
74
    else if(SONIC_TYPE==1 &&x<=SONIC_MAX_INCH)
75
    {
76
      SONIC_RANGE=x;
77
    }
78
  }
79
}

Main sieht dann so aus.......


int main(void)
{
     interrupt_init();

          Trigger pin auf high..............
    Vorgegebene Zeit warten...........

    timer_start();

          Trigger pin auf low...............

          SONIC_RANGE beinhaltet den Wert in cm oder inch.
}


Gruesse

Dusty

von hjbb49 (Gast)


Lesenswert?

Hallo,
schönen Dank für Deine Antwort.

Deine Tips sind bereits vorhanden (Impulslänge messen):

Der Capture Input (PB0) Interrupt wird zunächst auf steigende Flanke
eingestellt:
     TCCR1B |= (1 << ICES1);    // auf steigende Flanke triggern
     Startwert Timer1 festhalten

Tritt der Interrupt ein, wird in der Interrupt Routine der Capture 
Interrupt
auf fallende Flanke eingestellt.
    TCCR1B &= ~(1 << ICES1);         // auf fallende Flanke triggern
    Endwert Timer1 festhalten

Differenz Endwert - Startwert wird im Hauptprogramm bestimmt (nur wenn 
fallende Flanke erkannt wurde).

MfG

von hjbb49 (Gast)


Angehängte Dateien:

Lesenswert?

Problem gelöst!
siehe Anhang!

Die Lösung war eine Verzögerung von 50msec nach Aussenden des PING.

Warum, kann ich nicht sagen, geht aus dem Datenblatt auch nicht hervor!

Die ermittelten Daten finden sich im SourceCode!

Damit ist das Thema für mich abgeschlossen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.