Forum: Mikrocontroller und Digitale Elektronik Sharp Abstandssensor an AVR ATmega32


von Michael L. (michalabitzke)


Lesenswert?

Hallo zusammen,

ich möchte mit einem Sensor von Sharp (GP2Y0A02) einen Abstand messen.
Den digitalisierten Messwert möchte ich über einen Summer, der am 
Ausgang eines ATmega32 angeschlossen ist akustisch ausgeben.
Wenn ich an den Eingang ein Poti anschließe, kann ich einen schönen 
(variabel durch drehen) Sinuston hören.
Wenn ich nun anstelle des Poti den Sensor dranhänge, bekomme ich einen 
sehr ungleichmäßigen Ton.
Da es mit dem Poti gut funktioniert, gehe ich davon aus, das die 
Software in Ordnung ist. Ich habe den Quelltext unten trotzdem 
angehängt.

Hat jemand eine Idee, wie ich den Wert des Abstandssensors auch so schön 
bekomme, wie die Wandlung mit dem Poti?

Vielen Dank!
Micha
1
#define F_CPU 8000000UL     /* 8MHz */
2
 
3
#include <avr/io.h>
4
#include <util/delay.h>
5
 
6
void long_delay(uint16_t);
7
 
8
#define SUMMER (1<<PD7)
9
 
10
int main()
11
{
12
  uint16_t adc_wert = 0;
13
 
14
  DDRD |= SUMMER;
15
 
16
  /* Vref = AVCC = +5V */
17
  ADMUX |= (1<<REFS0);
18
 
19
  /* ADC-Frequency has to be between 50 and 200kHz
20
   * Rescaler = 64 --> 8MHz / 64 = 125kHz */
21
  ADCSRA |= (1<<ADPS1) | (1<<ADPS2);
22
 
23
  ADCSRA |= (1<<ADEN);
24
25
  ADCSRA |= (1<<ADSC);
26
 
27
  while (ADCSRA & (1<<ADSC)) 
28
  {}
29
 
30
  adc_value = ADCW;
31
  
32
  while(1)
33
  {
34
    ADCSRA |= (1<<ADSC);
35
36
    while (ADCSRA & (1<<ADSC)) 
37
    {}
38
 
39
    adc_value = (ADCW << 2);
40
 
41
    long_delay(adc_value);
42
 
43
    PORTD ^= SUMMER;
44
  }
45
}
46
 
47
void long_delay(uint16_t us) 
48
{
49
                for(; us>0; us--) 
50
                _delay_us(1);
51
}

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Der Sensor benötigt zum ersten recht viel Strom, sorge also dafür, das 
die Betriebsspannung ordentlich abgeblockt ist und evtl. direkt am 
Sensor sich auch noch ein Elko befindet (z.B. 10µF-47µF).
Zum zweiten sagt Sharp zwar, das der Ausgang direkt an einen MC 
angeschlossen werden kann, ich würde jedoch zu einem kleinen RC Tiefpass 
tendieren. Also z.B. 1k bis 3k3 in die Messleitung und einen Kondensator 
von z.B. 2n2 - 22n am ADC Eingang nach Masse.
Der Messzyklus liegt ja bei etwa 38ms, diese Frequenz (etwa 26 Hz) 
dürfte sich immer mal wieder zeigen, das wäre aber normal.

: Bearbeitet durch User
von Uwe (Gast)


Lesenswert?

The relationship between the sensor’s output voltage and the inverse of 
the measured distance is approximately linear over the sensor’s usable 
range.
siehe Seite 5:
http://www.pololu.com/file/download/gp2y0a02yk_e.pdf?file_id=0J156

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Uwe schrieb:
> The relationship between the sensor’s output voltage and the inverse of
> the measured distance is approximately linear over the sensor’s usable
> range.

Ja, steht ja im Datenblatt, aber was möchtest du damit sagen? Genau 
diese Ausgangsspannung will der TE ja akustisch umsetzen (hohe Spannung 
= tiefe Frequenz und umgekehrt), sie scheint aber recht stark zu 
springen, wenn ich das richtig verstanden habe.

von Uwe (Gast)


Lesenswert?

Das der KEHRWERT der Distanz ANNÄHREND linear ist.
Und selbst wenn man den Kehrwert nimmt ist "annährend" auch schon fast 
übertrieben. Wenn man das mit dem Kehrwert nicht beachtet dann sieht das 
in etwa so aus:
Die Spannung ändert sich zwischen 150cm und 60cm von 0,5V zu 1V.
Zwischen 60cm und 15cm verändert sich die Spannung von 1V zu 2,75V.

von Uwe (Gast)


Lesenswert?

> sie scheint aber recht stark zu springen, wenn ich das richtig verstanden
> habe.
Ja und ich schätze der Sprung ist ca. bei 60cm zu hören!

von Michael L. (michalabitzke)


Lesenswert?

Matthias Sch. schrieb
> Der Sensor benötigt zum ersten recht viel Strom, sorge also dafür, das
> die Betriebsspannung ordentlich abgeblockt ist und evtl. direkt am
> Sensor sich auch noch ein Elko befindet (z.B. 10µF-47µF).
> Zum zweiten sagt Sharp zwar, das der Ausgang direkt an einen MC
> angeschlossen werden kann, ich würde jedoch zu einem kleinen RC Tiefpass
> tendieren. Also z.B. 1k bis 3k3 in die Messleitung und einen Kondensator
> von z.B. 2n2 - 22n am ADC Eingang nach Masse.
> Der Messzyklus liegt ja bei etwa 38ms, diese Frequenz (etwa 26 Hz)
> dürfte sich immer mal wieder zeigen, das wäre aber normal.

Hallo Matthias, vielen Dank zuerst einmal für deine Antwort.
Wo am Sensor sollte der Elko sitzen? Zwischen Versorgungsspannung und 
Masse?
Das RC TP-Filter werde ich mal versuchen zu realisieren.
Was genau bedeutet ein Messzyklus von 38 ms? Muss ich dementsprechende 
etwas in der ADC Software beachten?

Uwe schreib
>> sie scheint aber recht stark zu springen, wenn ich das richtig verstanden
>> habe.
>Ja und ich schätze der Sprung ist ca. bei 60cm zu hören!

Hallo Uwe, auch dir vielen Dank für deine Antworten.
Ob der Sensor bei 60 cm springt kann ich nicht sagen, da er insgesamt 
"springt". D.h. das ich bei einem konstanten (so gut ich das realisieren 
kann) Abstand zum Sensor ein "springen" in der Tonhöhe wahrnehmen kann. 
Und das so stark, dass ich auf der Tonhöhe nicht auf den Abstand 
schließen kann.

Hat einer von euch diesen Sensor schon einmal an einem ATmega 
(erfolgreich) betrieben?

Vielen Dank
Micha

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Michael Labitzke schrieb:
> Wo am Sensor sollte der Elko sitzen? Zwischen Versorgungsspannung und
> Masse?

Genau da.
Der Messzyklus von 38ms ist kein Problem, du wirst halt ab und zu mal 
eine Überlagerung mit diesen etwa 52Hz haben. Ein kleiner RC Tiefpass im 
ADC Eingang von mit etwa 1k-4k7 und 2n2-22n kann aber nicht schaden.

von Chris (Gast)


Lesenswert?

Schau doch mal mit nem oszi auf das Signal

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.