Forum: Mikrocontroller und Digitale Elektronik IR Abstandsmelder


von Berthold (Gast)


Lesenswert?

Hallo Leute!
Ich möchte gerne einen kleinen Infrarot Abstandsmelder bauen. Der soll
nicht die genaue Entfernung zu einem Hindernis messen, sondern nur
bescheid geben, wenn etwas in der nähe ist.

Die Hardware dazu ist ein "TSOP 1756" Empfänger und eine passende
IR-LED. Wie das ganze verschaltet wird habe ich in einer Schaltskizze
gesehen. Die LED und der Empfänger werden also in die selbe Richtung
ausgerichtet, und die LED beginnt zu senden. Sobald der Empfänger ein
Signal, weiß ich, dass was in der Nähe ist...
So stell ich mir das jedenfalls vor ;-)

Mein Problem ist jetzt das Senden/Empfangen des Signals:
Ich hab keine Ahnung von Frequenzen und sowas ;-) Kann ich einfach die
LED an aund ausschalten (wie eine normale "Blink-LED")? Und
funktioniert der TSOP wie ein Schalter, liefert also einfach AN bzw.
AUS wenn er ein stark genuges Signal bekommt?
Oder muss ich das Signal irgendwie komplizierter gestalten (am TSOP
steht z.B. was von 56 Khz)...???

Ich hoffe ihr könnt etwas Licht in meine geistige Dunkelheit bringen
:-)

Hier mal der Schaltplan:
http://www.vankurt.de/images/ShaltplanXCV.jpg

von Rahul (Gast)


Lesenswert?

Der TSOP1756 reagiert auf ein IR-Signal, das mit 56kHz moduliert ist.
Die Frequenz kann man mit einem Timer erzeugen, der dann die LED
taktet. Schaltet man den Timer nun wiederum auch in regelmässigen
Abständen ein und aus, bekommt man dieses Signal am Ausgang des TSOP
zur Verfügung gestellt. Das kann man dann mit dem Controller
auswerten...

von Berthold (Gast)


Lesenswert?

Hey, danke für die schnelle Antwort :-)
Dann muss der AVR also den Pin, an dem LED hängt, 56.000 mal pro
Sekunde an- und abschalten??? Sowas geht??? ;-)

von Rahul (Gast)


Lesenswert?

Klar geht das. Warum auch nicht?
Kann man sogar komplett in "Hardware machen".
Aktuelle Controller haben die Möglichkeit, Timer so zu konfigurieren,
dass sie bei einem bestimmten Wert einen Pin schalten (togglen) und
wieder auf Null zurückspringen. Schon hat man eine wunderschöne
Rechtechspannung. Wenn man dann noch in der Intrrupt-Service-Routine
einen Zähler mitlaufen lässt, kann man den Timer auch noch für andere
Sachen benutzen...

von Berthold (Gast)


Lesenswert?

Könnte das z.B. so aussehen? Ich glaube nämlich, das wäre zu langsam...
(bin ja noch Newbie) ;-)

int main(void)
{
  // Timer initialisieren
  TCCR0 |= (1<<CS00)|(1<<CS02);


  // MainLoop
  while(1)
  {
    // Timer und MS aktualisieren
    if( TCNT0 > SOME_COOL_VALUE )      // Jetzt bitte LED umschalten
    {
      SwitchLED();
      TCNT0 = 0;
    }//end if
  }//end while

}//end main

von mr.chip (Gast)


Lesenswert?

Hallo

Ich habe sowas ähnliches kürzlich gebastelt:
http://www.thinkcool.ch/index.php?content=cgen;id=14;team=technik

Allerdings verwende ich nur handelsübliche IR-Dioden +
Fototransistoren. Die Modulation schaut ebenfalls etwas anders aus.
(Grob gesagt alle paar hunderstel Sekunden einige Millisekunden
gepulstes IR-Licht.)

Gruss

Michael

von Rahul (Gast)


Lesenswert?

Welchen Controller willst du benutzen? Den antiquierten AT90S8515?
Ich würde den Mega16 vorschlagen. Der ist aktueller und hat auch das
"lustige Zubehör" ("Features"), mit dem der Timer sich um alles
allein kümmert...

von Markus_8051 (Gast)


Lesenswert?

Von Sharp gibt es so etwas als fertigen Baustein:

IS 471 F-SH

Der hat direkt einen Modulator und Demodulator sowie Sende- und
Empfangsdiode eingebaut. Sprich: man muß nur noch das Digitale
Ausgangssignal auswerten.

(Gibt es z.B. beim großen C)

Markus_8051

von Berthold (Gast)


Lesenswert?

"Welchen Controller willst du benutzen? Den antiquierten AT90S8515?"

Ja leider :-(  Ist der etwa ungeeignet???

von Jadeclaw D. (jadeclaw)


Lesenswert?

Nö, ungeeignet nicht, nur manche sind wohl der Meinung, es muss immer
das Neueste sein. Nur wenn daraus eine Serienfertigung wird, sollte man
einen aktuellen Controller nehmen, da der 90S8515 nicht mehr gefertigt
wird. Aber für ein Einzelstück oder Experiment spielt das keine Rolle.

Gruss
Jadeclaw.

von Berthold (Gast)


Lesenswert?

Okay :-)
Ist denn mein Sourcecode so weit OK? Oder macht man das besser anders?

von Rahul (Gast)


Lesenswert?

@Jadeclaw:
Es geht (mir) nicht nur darum, dass man in der Serienfertigung aktuelle
Bausteine verwendet, sondern in diesem Fall auch darum, dass bspw. der
Mega16 nette Timer-Features hat, die der 90S8515 noch nicht vorweisen
kann. Warum sich das Leben mit "mature"-Produkten unnötig schwer
machen, wenn man es auch einfacher haben kann?
Natürlich spricht nichts dagegen, den "antiquierten" Chip zu
verwenden, bloß im Falle, dass man einen neuen Controller (aus welchen
Gründen auch immer [Tod eingeschlossen]) beschaffen muß, sollte man
sich nicht zu sehr daran festklammern.

@Berthold: Mit welcher Taktfrequenz willst du den Controller
betreiben?
Rein syntaktisch müsste dein Code funktionieren.

von Läubi (Gast)


Lesenswert?

Naja aber nen Mega 16 ist da wohl oversized! dann doch lieber nen Tiny,
die haben osgar internen Takt und man sprat sich den Ozilator :)

von Berthold (Gast)


Lesenswert?

56 kHz, wenn ich das richtig sehe...

von Berthold (Gast)


Lesenswert?

Das Problem ist allerdings:
Wenn ich SOME_COOL_VALUE = 11 wähle, bekomme ich einen
Millisekunden-Takt. Damit komme ich doch dann niemals auf 56 kHz, oder?

von Rahul (Gast)


Lesenswert?

Der Controller wird mir einem höheren Takt (Systemtakt) betrieben.
Dass du 56kHz "versenden" willst, war mir schon klar.
Aus dem Systemtakt berechnen sich dann die Vergleichswerte etc.

von Berthold (Gast)


Lesenswert?

Also, dann erläutere ich mal kurz, wie ich mir das vorstelle, und ihr
sagt mir, ob das so korrekt ist ;-)

1) Am AVR hängt ein Quarz mit 11 Mhz. D.h. der Prozesser macht etwa 11
Mega-Takte pro Sekunde.

2) Ich habe eine Main-Funktion mit einer endolos-While-Schleife darin.
In dieser wird die LED abwechselnd an- und aus geschaltet.

3) Zusätzlich dazu ist eine "Sleep"-Funktion in der While-Schleife,
die verhindert, dass das blinken mit den vollen 11 Megahertz
durchgeführt wird (mal abgesehen davon, dass ganze wohl länger als nur
ein Takt dauert)

So weit alles richtig?

Wenn ja ergibt sich ja das folgende Problem:
Sobald ich zusätzlichen Code in die While Schleife packe (es soll ja
nicht nur die LED blinken, sondern ggf. auch noch vieles anderes
passieren), dauert die Ausführung der Schleife sofort ein paar
Prozessortakte länger. Muss ich dann jedesmal die magische
"Sleep-Konbstante" neu anpassen, dass wieder alles genau mit 56 kHz
läuft? Das wäre ja grausam! :-(

von Philipp Burch (not logged in) (Gast)


Lesenswert?

Ne, natürlich nicht, dafür gibt's ja Timer. Wenn du einen Timer nimmst,
dann stellst du dessen Vorteiler (Prescaler im Datenblatt) auf 1 (Keine
Teilung) und das Compare-Register auf 196. Entweder hängst du deine LED
dann direkt an einen Portpin, den du mit dem Timer in Hardware togglen
lässt, oder du packst deinen Code zum Blinken in die
Timer-Interrupt-Routine.

PS: Sind das 56'000 Ein-Aus-Perioden pro Sekunde? Dann müsstest du den
Compare-Wert halbieren (98).

von Berthold (Gast)


Lesenswert?

Oh verdammt, du hast ja so Recht :-D
Ich habe mir gerade darauf hin noch mal das Tutorial zum 16 Bit timer
durchgelsen, und diesmal (so glaube ich) auch verstanden. Vielen Dank
also für eure gedulgide Hilfe!

Allerdings haben sich noch ein paar neue Fragen ergeben, die im
Tutorial nicht beantwortet wurden:

1) Zum Timer-Daten-Register heißt es:
"Wenn der Zähler den Wert 65535 erreicht hat, beginnt er beim nächsten
Zyklus wieder bei 0."

Wenn ich nun einen Wert ins Compare-Register geschrieben habe, zählt er
dann immer nur bis da hin?

2) Es gibt anscheinend 3 PWM Betriebsmodi: 8-Bit, 9-Bit und 10-Bit
Welcher davon ist denn der richtige? Bzw. worin unterscheiden die
sich?

3) Im PWM Modus gilt laut Tutorial:
"Wird beim Hochzählen der Wert im Vergleichsregister erreicht, so wird
der Pin OC1 auf 0 gesetzt.
Wird beim Herunterzählen der Wert im Vergleichsregister erreicht, so
wird der Pin auf 1 gesetzt. "

Bedeutet das also, dass ich die LED direkt an den Pin OC1 hängen kann,
und dann glücklich bin?

4) Zu deiner Frage Phillipp:
"PS: Sind das 56'000 Ein-Aus-Perioden pro Sekunde?"
Das ist eine gute Frage ;-) Ich glaube du hast Recht, 98 wäre der
richtige Wert...

von Martin H. (Gast)


Lesenswert?

Ich kann dir da leider auch nicht weiterhelfen, aber interessieren würde
mich das ganze auch!
Ich arbeite gerade an etwas ähnlichem, und versuche auch den 16-Bit
Timer meines AVR zu verstehen :-)

von Rahul (Gast)


Lesenswert?

zu 1:
Im "normalen" Überlaufmodus (Mode 1), zählt der Timer von 0 bis 65535
und erzeugt beim Überlauf (65535->0) ein (TimerOverflow-)Interrupt.
Wenn dann ein Wert im Compare-Register steht, dann wird bei Gleichheit
des Zählerstandes und des Vergleichsregisters ("compare") ein
Interrupt ausgelöst. Beim 90S8515 ist es sogar möglich, nicht nur einen
Interrupt auszulösen, sondern auch einen Ausgangspin zu
(umzu-)schalten.

zu 2: Neben den drei PWM-Modi, die du angeführt hast, gibt es auch noch
den CTC (Clear Timer on Compare Match). Hierbei wird der Timer bei
Gleichheit auf 0 zurückgesetzt. Dadurch kann man sich eine ziemlich
genaue Zeitbasis erstellen, die man auch zur Frequenzerzeugung benutzen
kann...

zu 3: Das gilt für den Phase-Correct-Mode. Hierbei zählt der Timer
nicht nur aufwärts, sondern bei Erreichen des Maximalwertes wieder
abwärts bis zur 0. Damit kann man durch Verändern des Vergleichswertes
eine PWM nach dem Dual-Slope-Verfahren erzeugen. Die Auflösung wird
dabei allerdings halbiert.

Zu 4: wird wohl stimmen... man muß natürlich die halbe Periodendauer
angeben, wenn man "manuell" den Pin togglen willl/muß.

Dann habe ich gerade festgestellt, dass der 90s8515 auch ICP und CTC
unterstützt. So "schlecht" ist der Controller gar nicht...Er ist bloß
abgekündigt und sollte nicht mehr für Neuentwicklungen benutzt werden.

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.