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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.