Erstaunlich. Ich sollte auch mal den Simulator verwenden.
Erstaunlich. Ich sollte auch mal den Simulator verwenden.
Bild hier
Atmel’s products are not intended, authorized, or warranted for use
as components in applications intended to support or sustain life!
Hallo allerseits,
Ich habe nun noch eine Umfangreiche Kalibrierung vorgenommen und war sehr erstaunt:
Das Signal ist schneller, als es tatsächlich sein sollte. Ich nehme an, der timer tickt dann zu langsam oder irgentetwas anderes bremtst das Zählen aus.
Da diese Ungenauigkeit aber immer gleich bleibt, habe ich einfach immer 600us dazugezählt.
Die Zeit wird dann noch in cm umgewandelt und im Terminal ausgegeben.
Weiters habe ich das Print in der ISR weggetan und nun stimmt die Messung:
Bei bereichen kleiner 60cm stimmt die Entfernung fast immer auf den cm genau mit der echten überein, bei größeren entfernungen gibt es abweichungen von bis jetzt max. 3cm, aber nur einmalig, dann kommen wieder viele Messungen, die ziemlich genau sind.
Ich bin sehr überrascht, wie genau das ganze nun entgültig funktioniert hat. Die kleinen Abweichungen befinden sich für mich absolut im Toleranzbereich, so genau war das ganze ursprünglich sowieso nicht geplant gewesen.
Danke zwar für den Tipp mit Inline ASM, aber ich denke, ich spare mir das
Die gleichbleibenden zahlen gibt es zwar immer noch, aber die sind dank des entfernens von Print aus der ISR nun so klein, dass sie villeicht einen cm Abweichung bewirken.
Ach ja, ich bin ganz glücklich
Ich habe noch vor, einen abschließenden Beitrag zu diesem Projekt zu gestalten, mit Bildern, Schaltplan, Code und Tipps, als Hilfe oder Anregung, zum Verlinken in anderen Threads, sozusagen als zusammenfassung. Wird allerdings noch ein bisschen Dauern.
Nochmals vielen Dank allen beteiligten an diesem Thread, danke für die Hilfe!
Mfg Thegon
Prima. Ich wollte sowieso noch nach dem endgültigen Schaltplan fragen. Ich kann aber auf die Zusammenfassung warten.Ich habe noch vor, einen abschließenden Beitrag zu diesem Projekt zu gestalten, mit Bildern, Schaltplan, Code und Tipps...
Gruß
Searcher
Hoffentlich liegt das Ziel auch am Weg
..................................................................Der Wegzu einigen meiner Konstruktionen
Hallo!
@ Thegon
Kannst du mir, bitte, sagen, wieviel Strom die ganze Messschaltung braucht, weil ich es eventuell pulsweise für meinen geplannten Solarbot verwenden möchte ?![]()
MfG (Mit feinem Grübeln) Wir unterstützen dich bei deinen Projekten, aber wir entwickeln sie nicht für dich. (radbruch) "Irgendwas" geht "irgendwie" immer...(Rabenauge) Machs - und berichte.(oberallgeier) Man weißt wie, aber nie warum. Gut zu wissen, was man nicht weiß. Zuerst messen, danach fragen. Was heute geht, wurde gestern gebastelt. http://www.youtube.com/watch?v=qOAnVO3y2u8 Danke!
Die oben gezeigte Inline ASM kann funktioniern, muss es aber nicht. Das hängt davon ab, wie Bascom das hochzählen implementiert. Wenn da mehr als R16 benutzt wird, gibt es ggf. schwer zu findende Fehler. Da sollte man das Hochzählen auch in ASM machen. z.B. mit
LDS R16, {Timer0_overflows}
SUBI R16, 255
STS {Timer0_overflows},R16
LDS R16, {Timer0_overflows}+1
SBCI R16, 255
STS {Timer0_overflows}+1,R16
Wenn Timer0_overflows ein Byte Wert ist, kann die 2. Hälfte Wegfallen.
Hallo Picture,
die Schaltung zieht im Leerlauf, also wenn sie gerade nicht misst, für mich lächerliche 20mA. Bei der arbeit wirds wohl etwas mehr sein, aber da mein Multimeter da nicht mitkommt, weiß ich das leider nicht.
Ich habe den Strom übrigens an einem 12V bleiakku gemessen, den ich dann an einen 7805 angeschlossen habe.
Mfg Thegon
Danke schön, fur mich sind leider für dich lächerliche 20 mA sehr viel, weil der gesamte Antrieb um 5-10 mA braucht. Bei kurzen Impulsen in µs Bereich ist es aber viel weniger als gebremster Motor am Hindernis.![]()
MfG (Mit feinem Grübeln) Wir unterstützen dich bei deinen Projekten, aber wir entwickeln sie nicht für dich. (radbruch) "Irgendwas" geht "irgendwie" immer...(Rabenauge) Machs - und berichte.(oberallgeier) Man weißt wie, aber nie warum. Gut zu wissen, was man nicht weiß. Zuerst messen, danach fragen. Was heute geht, wurde gestern gebastelt. http://www.youtube.com/watch?v=qOAnVO3y2u8 Danke!
Danke für den Code. Hab ich gleich mal ausprobiert und "Timer0_overflows = Timer0_overflows + 1" durch alle ASM Befehle ersetzt ,da bei mir eine Word Variable. Hat nochmal eine µs gebracht. Lücke jetzt noch 4µs.Zitat von Besserwessi
PS nach weiterem Tasten und Messen 3µs Lücke
EDIT
Echt stark, was Inline ASM bringt. Habe nun die Timer0_overflows Variable auf Typ Byte geändert. Damit kann sie eine Zeit bis ca 65ms abdecken, was hier für die US Messung mehr als genug wäre.
Die ganz neue ISR sieht nun so aus:
Wenn ich nun meinen eigenen Tests trauen darf, liegt die Lücke bei nur noch bei 2µs. Die Simulation ist so eingestellt, daß 10 Überläufe auftreten. Nicht angezeigte Werte sind 2568µs und 2569µs. Anmerkung: ASM Code nur durch C&P entstanden.Code:On Timer0 Isr_count_overflows Nosave Isr_count_overflows: 'Ansprung, wenn Timer0 überläuft !push r16 !in r16,sreg !Push r16 !lds R16 , {timer0_overflows} !SUBI R16, 255 !STS {Timer0_overflows},R16 !pop r16 !out sreg,r16 !pop r16 Return
Gruß
Searcher
Geändert von Searcher (03.09.2011 um 09:34 Uhr) Grund: ISR zum Timerüberlauf nochmal optimiert
Hoffentlich liegt das Ziel auch am Weg
..................................................................Der Wegzu einigen meiner Konstruktionen
Die Schaltung selber sollte deutlich weniger Strom Verbrauchen, zumindest nach dem Schaltplan. Da wird viel von den 20 mA für den AVR und den 7805 verbraucht werden. Wenn die Schaltung nicht aktiv ist sollte man deutlich unter 1 mA kommen können (ohne den µC). Die größte Unsicherheit ist dabei das CMOS gatter hinter dem letzten Transistor. Je nach Einstellung der Schwelle kann da ein mittlerer Pegel anliegen und das Gatter dahinter ggf. etwas mehr Strom brauchen.
Beim Senden braucht man kurz mehr Strom - auch auch da kaum 20 mA, beim Empfangen wird man vielleicht auch 1-3 mA kommen.
In einer Spar-Version ohne den analogen Ausgang könnte man auch auf die Gatter verzichten und den 220 K Widerstand für die Rampe immer an 5 V haben. Die Funktion des Flipflops sollte der µC mit übernehmen können, ggf. auch gleich mit dem analog Comperator des µC, so dass man auch mit 1 Transistor auskommt. Damit sollte man im inaktiven Bereich auf einen Stromverbrauch von ca. 50 µA kommen und vielleicht 1 mA beim Empfangen.
Hallo allerseits,
ich habe jetzt doch Lust bekommen, eine zusammenfassung zu schreiben und somit fange ich einmal an:
Anfangs habe ich viele Versuche und Tests mit Operationsverstärkern durchgeführt, bis ich dann am Ende, als es mittels LF353 so einigermaßen funktioniert hat, draufgekommen bin, dass ich eine Verstärkung brauche, die sich mit der Laufzeit des Signals erhöht. Ich bin dann dank einem Roboternetzbenutzer auf das Ultraschall - Interface von Manf gestoßen, das mir eigentlich gut gefallen hat.
Als Sende - und Empfangswandler benutze ich die aus einem Bausatz von Conrad, diesem hier.
Grundsätzliches Funktionsprinzip:
Der Mikroprozessor erzeugt 20 Perioden mit einer Frequenz von 40kHz, der Resonanzfrequenz der Wandler.
Dieses Singal gelangt über Start In in das Interface.
Dort wird mit diesem Signal der Sendewandler betrieben, die Rampe gestartet und das Flipflop gestellt.
Unmittelbar nach dem Senden des Bursts, also der 20 Perioden beginnt der AVR, die Zeit zu stoppen. Dazu wird der Timer0 benutzt.
Trifft nun das Echo ein, so wird es vom Empfangswandler in eine Wechselspannung "verwandelt". Da diese sehr schwach ist, wird sie duch die Eingangsverstärkung verstärkt und setzt das Flipflop wieder zurück.
Der AVR bemerkt die Zurücksetzung des Flipflops per Interrupt und stoppt den Timer.
Danach wird wird die Zeit ausgewertetet, in cm umgerechnet und ausgegeben.
Das messen der Laufzeitverzögernung übernimmt ein ATmega48, obwohl der dafür ein bisschen überdimensioniert ist.
Als ein großes Problem Stellte sich die Verstärkung heraus, als Lösung wurde eine dritte Transistor Verstärkterstufe eingebaut.
Auch wurden Störunen durch die Betriebsspannung übertragen, so wurde diese mittels 220uF Kondensatoren gestützt.
Empfehlenswert ist es auch, eine veränderbare Induktivität einzuplanen, um den Schwingkreis eventuell abstimmen zu können, da die Resonanzfrequenz nicht unbedingt mit der berechneten übereinstimmt. (Bei mir zumindest nicht genau)
Die Vollständige und für meinen Fall optimierte Schaltung hier:
EDIT: So ein Blödsinn, das Bild wird automatisch komprimiert, und so kann man die Bauteilwerte nicht mehr lesen.
Hier noch einmal hochgeladen, da sollte die Auflösung passen.
Hier noch ein Paar weitere Biler vom aufbau des Modules:
Soweit die Hardware.
Auch die Software hat einige Untstimmigkeiten mit sich gebracht, so ist die Erzeugung des Bursts, der in Start in geht, nun etwas unkonventionell gelöst, aber es funktioniert.
Die ISR ´s dürfen nicht zu lange sein, so zum Beispiel kein Print oder ähnliches, wie ich es ursprünglich gemacht habe.
Das Komplette Programm, das auf dem Mega48 läuft, hier:
Sonst: da die verstärkung nun schon sehr groß ist, werden manchmal auch echos von gegenständen, die nicht direkt in einer Linie mit den Kapseln stehen, empfangen und registriert. Für mich stellt dies aber kein Problem dar.Code:'Ultraschall Entfernungsmessung messprogramm ' endgültige version $regfile "M48def.dat" $crystal = 1000000 $hwstack = 100 $swstack = 100 $framesize = 100 $baud = 2400 Dim Endtime As Long 'die entgültige zeitin us Dim Countperoverflow As Integer 'dieOverflows des Timer0 werden hier gezählt Dim Struser As String * 10 'die Eingabevariable des Users Dim Countperiodes As Byte 'die Perioden des Us bursts werden gezählt Dim Timerstand As Byte 'der stand des Timers beim Überlauf Dim Ausgabefertig As Byte 'flag wird gesetzt, wenn die Zeitmessung erfolgt hat Dim Entfernung As Word '########## timer0 Kofigurieren und Initialisieren ################## Config Timer0 = Timer , Prescale = 1 On Timer0 Isrtimer Enable Timer0 Stop Timer0 '####################################################################### 'Int0 Konfigurieren Config Int0 = Rising Enable Int0 On Int0 Isr_interrupt 'portd.3 als ausgang definieren, das ist der Start in Pin Config Portd.3 = Output Portd.3 = 1 'Alle variablen auf null setzen. Endtime = 0 Countperoverflow = 0 Struser = "sd" Countperiodes = 0 Timerstand = 0 Ausgabefertig = 0 Print "Ultraschall Entfernungsmessung Online" Do Input Struser If Struser = "" Then '################# den Sendebrust generieren +++++++++ Countperiodes = 0 Do Portd.3 = 0 'man kommt so genau auf 40khz Countperiodes = Countperiodes + 2 Portd.3 = 1 Countperiodes = Countperiodes - 1 Loop Until Countperiodes > 20 Countperiodes = 0 Portd.3 = 1 '###################################################### Enable Interrupts 'interrupts global aktivieren Start Timer0 'timer starten, as stoppen der zeit beginnt jetzt Timer0 = 0 'timer auf null setzen, dass die messung auch wirklich bei null beginnt 'variable verändern, dass nicht noch mal in die Schleife Struser = "sd" End If If Ausgabefertig = 1 Then 'Wenn die Fertig flag gesetzt wurde Entfernung = Endtime / 60 ' Umrchnung in cm Entfernung = Entfernung + 10 ' auf grund von Kalibrierung nutwendig, kann angepasst werden Print Entfernung ' Entfernung ausgeben (per UART) Timer0 = 0 Timerstand = 0 'Alle Variablen wieder auf null setzen Endtime = 0 Countperoverflow = 0 Ausgabefertig = 0 Entfernung = 0 End If Loop '###############TimerIsR################## Isrtimer: Countperoverflow = Countperoverflow + 1 'die timerüberläufe zählen Return '######################################### '######### Interrupt isr################ Isr_interrupt: Stop Timer0 'beim eintreffen der messung Timer stoppen Timerstand = Timer0 'derzeitigen timerstand in Variable sichern 'Die Endtime in us ausrechnen Endtime = Countperoverflow * 256 Endtime = Endtime + Timerstand Disable Interrupts 'interrupts global deaktivieren, um eventuelle Störungen zwischen den pausen zu ignorieren Ausgabefertig = 1 'die Flag setzen, dass die cm ausgegeben werden Return '############ End Programm ###############################################
Die Ergebnisse enthalten (in meinem Falle) eine Maximale abweichung von 3cm, aber nicht sehr oft.
Viel Glück jedem, der auch einmal versuchen sollte, solch eine Entfernungsmessung zu realisieren!
Mfg Thegon
Geändert von Thegon (02.09.2011 um 20:16 Uhr) Grund: Schaltplan unleserlich
Lesezeichen