-         
Seite 19 von 31 ErsteErste ... 9171819202129 ... LetzteLetzte
Ergebnis 181 bis 190 von 310

Thema: ASURO-Bot Bausatz: Erfahrungen und Meinungen

  1. #181
    Super-Moderator Lebende Robotik Legende Avatar von Manf
    Registriert seit
    30.01.2004
    Ort
    München
    Alter
    68
    Beiträge
    12.866
    Anzeige

    Praxistest und DIY Projekte
    Wie kann man denn z.B. rausfinden, ob das empfangene Signal das versandte ist?
    Man hocht erst auf das Hintergrundgräusch (hoffentlich ist es nicht zu groß), wenn man etwas sendet und es kommt innerhalb von 10ms ein Signal das größer ist, dann war es das Echo.

    Ich werde noch einen Schaltungsvorschlag hierzu diskutieren.
    Manfred

  2. #182
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.06.2004
    Ort
    Aachen
    Beiträge
    2.674
    Also willst du die Wechselspannung in eine Gelichspannung richten, verstärken und am ADC messen, oder?
    Aber du sendest die 40 Khz doch länger als 10ms, oder also empfängst du schon während du noch sendest, oder?
    Man sollte aber ziemlich leicht relativ genaue Werte messen können. Gehst du davon aus, dass keien direkte Übertragung zwischen sender und empfänger ist, oder schallen die wirklich geradeaus? Sollte man sender und empfänger möglichst locker lagern?

    MFG Moritz

  3. #183
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    24.04.2004
    Ort
    Karlsruhe
    Alter
    42
    Beiträge
    1.277
    Zitat Zitat von RCO
    @ Sonic, ... Nach meiner Berechnung, korrigier mich wenn ich falsch liege, ... Wenn du ihn mit 217 vorbelädst (255-217=38 ): 1000000/38 = 26315,78 Hz. Ist das nicht ein wenig viel, oder habe ich da was wichtiges übersehen?
    MFG Moritz
    Klar ist das schon viel nur gibt es ja keinen Standartwert für die PWM-Frequenz und viel ist relativ. Also hab ich da schon ein bisschen rumgespielt...

    "(255-217=38 ): 1000000/38 = 26315,78 Hz"
    passt nicht ganz 256-217=39 -> 1000000 / 39 = 25641 Hz (Interrupt) und => 25641 / 2 = 12820,5 Hz (Signal/Rechteck).

    Allerdings darfst du nicht die Interruptfrequenz mit der Signalfrequenz verwechseln! Interrupts pro Sekunde != Signalfrequenz.
    Hatte ich schon mal im Zusammenhang mit Franks Rnavr-Programm zum Timer berechnen.

    Soll heißen, es wird zwar z.B. 50mal pro Sekunde ein Interrupt ausgelöst, allerdings brauchst du für eine Signalperiode 2 Interrupts (Rechteck). Du musst ja einmal einschalten und einmal ausschalten. Also ist für Rechteck die Signalfrequenz die Interruptfrequenz / 2.

    Jetzt kommt noch dazu das bei jedem Interrupt einmal hochgezählt wird, von 0 - 255 und wieder von Vorne. Damit erreiche ich die unterschiedliche Pulsbreite für die PWM.
    pwmr und pwml ist das Maß für die Pulsbreite. Bei Zählerstand 0 wird eingeschaltet bei Zählerstand pwml o. pwmr wird ausgeschaltet. Soweit klar?
    Also ist eine Periode des PWM-Signals immer 256 Interrupts lang, also ist die PWM-Frequenz = Interruptfrequenz / 256 = 25641Hz / 256 = ca. 100Hz

    Oh Mann wenn da jetzt irgendwo ein Fehler drinn ist, ist mir der Spot sicher Aber ich bin auch AVR-Anfänger...

    EDIT: Für 1KHz PWM ist die Einstellung Timer0 übrigens Prescaler = 1 und Timervorgabe = 225...

    Gruß, Sonic
    http://www.dontfeedthetroll.de/images/dftt.gif
    If the world does not fit your needs, just compile a new one...

  4. #184
    Super-Moderator Lebende Robotik Legende Avatar von Manf
    Registriert seit
    30.01.2004
    Ort
    München
    Alter
    68
    Beiträge
    12.866
    Also willst du die Wechselspannung in eine Gelichspannung richten, verstärken und am ADC messen, oder?
    Aber du sendest die 40 Khz doch länger als 10ms, oder also empfängst du schon während du noch sendest, oder?
    Man sollte aber ziemlich leicht relativ genaue Werte messen können. Gehst du davon aus, dass keien direkte Übertragung zwischen sender und empfänger ist, oder schallen die wirklich geradeaus? Sollte man sender und empfänger möglichst locker lagern?

    MFG Moritz
    Alles habe ich noch nicht, aber einen Schaltungskern habe ich schon eimal optimiert. Speziell zur Signalübergabe halte ich eine Gleichrichtung für besser, obwohl sie im mitglieferten Schaltungsvorschlag nicht angegeben war.
    Die 40kHz werden nur für 8-32 Perioden gesendet. Also z.B. 16 Perioden = 0,4ms oder 6,8cm.
    Sie senden nicht direkt zur Seite, aber man sollte sie wohl auch nicht zusammenkleben.
    Manfred

  5. #185
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.06.2004
    Ort
    Aachen
    Beiträge
    2.674
    Also ich geh jetzt am Besten mal von anfang an alles durch:

    256-217=39
    Aha, interrupt wird also ausglöst, wenn der Timer wirklich ein zuviel hat, nciht wenn er voll ist, nagut, wird ja schon aus dem Wort Overflow ersichtlich.

    Na gut jetzt ist es mir irgendwie sonnenklar es wird ja nur bei jedem 39. mal ausgelöst. das hab ich vergessen, deshalb kommst du auf 100 und ich auf 3900 das 39-fache.

    Mal ne ganz andere Idee, könnte man nicht einfach nur 64 Geschwindigkeitsstufen nehmen mit einem größeren Prescaler, also 4 mal so hoch. so viele Geschwindigkeitsstufen braucht man doch eh kaum, oder drückt der Interrupt nicht so stark auf die Prozessorleistung?

    Könnte man vielleicht nur 50 Hz nehmen, oder ist das schon sehr Grenzwertig?

    Ich werds mal testen, MFg Moritz

  6. #186
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    24.04.2004
    Ort
    Karlsruhe
    Alter
    42
    Beiträge
    1.277
    Noch ne andere Idee, man könnte die im AVR eingebaute PWM benutzen So wie ich das gemacht hab wird die PWM ja an 2 Pins Softwaremässig realisiert. Bin mir nur nicht sicher ob die beiden Enable-Eingänge auch an den PWM-Pins angeschlossen sind, muss ich mal Schaltplan wälzen...


    Also ich geh jetzt am Besten mal von anfang an alles durch:
    Zitat:
    256-217=39
    Aha, interrupt wird also ausglöst, wenn der Timer wirklich ein zuviel hat, nciht wenn er voll ist, nagut, wird ja schon aus dem Wort Overflow ersichtlich.
    Ich glaub eher es liegt daran das 256 Zustände gezählt werden, die 0 gehört dazu. 255 ist der max. Wert einer Byte-Variablen, trotzdem kann man ja 256 Zahlen darstellen.

    Gruß, Sonic
    http://www.dontfeedthetroll.de/images/dftt.gif
    If the world does not fit your needs, just compile a new one...

  7. #187
    Super-Moderator Lebende Robotik Legende Avatar von Manf
    Registriert seit
    30.01.2004
    Ort
    München
    Alter
    68
    Beiträge
    12.866
    Gehst du davon aus, dass keien direkte Übertragung zwischen sender und empfänger ist,
    Kann man ja direkt messen. Ich habe eine Schaltung mit Verstärkungsregelung, die am Anfang während des Sendens ziemlich gut auf null abregelt und habe bei der mal die beiden Kapseln mit einem Gummi zusammengebunden.
    Eine Überkopplung ist nicht sichtbar. Die Anordrnung ist auf dem Steckbrett links. Darüber ist eine schwenkbare Lampe die in 50cm Abstand ein Echo erzeugt das recht deutlich ist. Man sieht dann eher noch das zweite Echo der Lampe.
    Manfred
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken us_kopplung_.jpg  

  8. #188
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.06.2004
    Ort
    Aachen
    Beiträge
    2.674
    @ Manf: woher nimmst du die Zeit eigentlich immer irgendwelche Sachen zu basteln? Also ich würde mich freuen, wenn du einen Abstandssensor mit möglichst wenig Hardware hinbekommen würdest.
    Wenn Sender und Empfänger miteinander verbunden sind, dann muss aber doch irgendwie ein kleines Signal ankommen, oder. Wenn ich dich richtig verstehe, ist das ja absolut nicht der Fall.

    @ Sonic: Also dein Pollswitch klappt einwandfrei, wenn du bei "Call Pollswitch" noch die Klammern "()" anfügst
    Liefert dann 1023 und je nach Taste andere Werte, da werd ich mal schaun, wie man es am besten regelt.

    Ich weiß nicht ob es dir sonderlich weitergilft, aber ich hab noch ein kleines Prog zum PWM gefunden, schöner wärs natürlich, wenn der Timer0 ein Compare hätte, dann hätte man den "besseren" Timer1 noch frei für anderes Zeug.

    Code:
    Pwma Alias Portd.5                                          ' Modulated Pins
    Pwmb Alias Oc1b
                                              ' Used Variables
    Dim Temp1 As Word
    Dim Temp2 As Word
    
    Config Portb = Output                                       ' PortB is Output
    Portb = 255                                                 ' Switch LEDs off
    
    Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Up
    Temp1 = &H0000                                              ' Configure Timer1 for PWM
    Pwm1a = Temp1
    Pwm1b = Temp1
    Tccr1b = Tccr1b Or &H02                                     ' Prescaler = 8
    
    
    Config Pind.0 = Input                                       ' Configure PortD
    Config Pind.5 = Output
    
    Do
        Bitwait Pind.0 , Reset                                  ' Wait for key pressed
        Bitwait Pind.0 , Set                                    ' Wait for key unpressed
        Temp1 = Temp1 + &H10                                    ' Increment Variable
        Pwm1a = Temp1                                           ' Set PWM Registers
        Pwm1b = Temp1
        Temp2 = Temp1 / &H10                                    ' Reset 4 LSB and shift right
        Temp2 = Not Temp2                                       ' Invert bit pattern
        Portb = Low(temp2)                                      ' Output bit pattern
    Loop
    
    End
    MFG Moritz

  9. #189
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.06.2004
    Ort
    Aachen
    Beiträge
    2.674
    Also ich habe jetzt das Script mal umgeschriben, hier ein kleines BSP für den PWm unter Bascom. Asuro stopt, fährt mit halbem und vollem speed.

    Code:
    Dim Temp1 As Word                                           'Die Geschwindigkeitsvariable
    
    Config Portd = Output                                       'Der Einfachheit halber Port B und D alles Output
    Config Portb = Output
    
    Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 8
    'Timer1 hat 2 PWM-Ausgänge PinB.1 und B.2
    'Prescale 256 läuft auch problemlos
    
    Portd.5 = 1                                                 'Linker Motor Vorwärte
    Portd.4 = 0
    
    Portb.4 = 0                                                 'Rechter Motor Vorwärts
    Portb.5 = 1
    
    Do
    
    Temp1 = 0                                                   'Motoren stehen
    Pwm1a = Temp1
    Pwm1b = Temp1
    Wait 1
    
    Temp1 = 512                                                 'Motoren fahhren mit halber kraft
    Pwm1a = Temp1
    Pwm1b = Temp1
    Wait 1
    
    Temp1 = 1023                                                'Motoren fahhren mit voller kraft
    Pwm1a = Temp1
    Pwm1b = Temp1
    Wait 1
    Loop
    End
    Unter C läuft, wie man hier sieht:

    // for PWM (8-Bit PWM) on OC1A & OC1B
    TCCR1A = (1 << WGM10) | (1 << COM1A1) | (1 << COM1B1);
    // tmr1 running on MCU clock/8
    TCCR1B = (1 << CS11);
    Asuro mit Timer1 unter 8-Bit und prescale 8.
    Schön ist natürlich eigentlich, wenn man wie in Sonics BSP Timer0 dafür verwenden kann, denn Timer1 bietet ja mehr möglichkeiten. Da die Compareregister aber sowiso von den Motoren und Timer1 belegt sind spielt das wohl keine Rolle und ich will eigentlich noch versuchen das Basic-Pendant zu C möglichst nah zu halten.

    MFG Moritz

    EDIT: Nochmal zu den Bumpern (Pollswitch())

    Ich würde mich sehr freuen, wenn mir ein C-Spezilist diesen Code etwas entschlüssen könnte und sagen könnte, wie die Berechnung unten von statten geht. Danke schon mal im Voraus.

    Code:
    unsigned char PollSwitch (void)
    {
    	unsigned int i;
    	
    	DDRD |= SWITCHES;				// Switches as Output
    	SWITCH_ON;						// Output HIGH for measurement
    	ADMUX = (1 << REFS0) | SWITCH;	// AVCC reference with external capacitor
    	Sleep(10);
    	
    	ADCSRA |= (1 << ADSC);			// Start conversion
    	while (!(ADCSRA & (1 << ADIF)));// wait for conversion complete
    	ADCSRA |= (1 << ADIF);			// clear ADCIF
    	i = ADCL + (ADCH << 8);
    	
    	SWITCH_OFF;
    
    	return  ((unsigned char) ((( 1024.0/(float)i - 1.0)) * 63.0 + 0.5));
    }
    MFG Moritz

  10. #190
    Super-Moderator Lebende Robotik Legende Avatar von Manf
    Registriert seit
    30.01.2004
    Ort
    München
    Alter
    68
    Beiträge
    12.866
    Zur Ultraschall Schaltung:
    Ich habe erst einmal die Schaltung klemmenkompatibel nachgebaut.
    Klemme OC2: Hier kommt das Sendesignal rein, Rechteck 5V Pegel, 40kHz, z.B. 16 Perioden
    Klemme ADC3: Ausgang des um 100 bis 1000 verstärkten Echosignals ohne Demodulation.
    Da das Signal in der Vorlage ohne laufzeitabhängige Verstärkung ist, ist dort der Pegel kritischer und es wird weiter der Port PD6 benötigt, der einen laufzeitabhängigen Vergleichspegel erhält.
    PD6 entfällt.

    Zur Funktion: AN OC2 liegt der Burst aus 16 Perioden 40kHz Signal. Er geht an den oberen Wandler der das Signal aussendet. Der 2. Anschluss des Wandlers liegt an Masse oder an einem invertierten Signal zur Spannungsverdopplung (4-fache Leistung).

    Die Signalverstärkung erfolgt durch den Transistor BC547C. Ich habe überlegt einen oder 2 Operationsverstärker einzusetzen, aber die einstellbare Verstärkung geht am besten mit dem Transistor. Der Kleinsignal-Emitterwiderstand ist 1/S = Ut / Ic. Der Kollektorwiderstand liegt bei 10kOhm. Damit liegt die Verstärkung bei Ic = 1 mA mit Ut = 26mV bei 400.
    In den Bereich wird der Transistor mit der Zeit gesteuert wenn er einen Basisstrom von 4µA erhält. (für B= 250 , sonst entsprechend, auch doppelt so viel: 2mA, V=800)

    Zu Beginn der Messung wenn an OC2 periodisch der Null Pegel auftritt wird der Kondensator 47n über die Diode bis zur Schwellspannung entladen. Nach dem Sendesignal, mit OC2=high, lädt sich der Kondensator mit der Zeitkonstante 100k * 47n = 4,7ms und erhöht den Basisstrom und damit die Verstärkung. Der Startpunkt liegt gerade bei der Schwellspannung.

    Das Signal vom Empfänger wird eingekoppelt und mit der zunehmenden Verstärkung entsprechend seine Schwächung auf der Strecke verstärkt. Das Signal breitet sich auf einer Kugelfläche aus, so dass seine Leistung quadratisch mit dem Abstand und mit der Zeit abnimmt. Die Spannung als die Wurzel der Leistung nimmt linear ab und die linear zunehmende Verstärkung kompensiert so gerade die Signalamplitude.

    Beim Kollektorwiderstand wurde eine Festinduktivität eingesetzt. Das ist unüblich und kann sogar vermieden werden, wenn man dort nur einen 1k Widerstand nimmt und Spule und Kondensator weglässt. Man hat dann bei geringerer Verstärkung einen Biashub von 1V den man durch kapazitive Auskopplung eliminieren kann.

    Induktivitäten werden nicht gerne eingesetzt weil sie als unberechenbar gelten. Deshalb kurz der Scheinwiderstand mit wL = 1/wC bei 40kHz führt bei einem Widerstandswert von etwa 1k zu den Werten 4,7mH und 3,3 nF. Die Dämpfung des Schwingkreises mit dem 10fachen Widerstand hält die Schaltung breitbandig und damit auch unkritisch gegenüber Bauelemente-Toleranzen. Der Einsatz der Spule ermöglicht trotzdem eine relativ hohe Verstärkung mit sodass man leicht mit nur einer Verstärkerstufe auskommen kann.

    Ein Komparator sollte noch ergänzt werden. Zumindest der Mittelwert des Ausgangssignals an ADC3 muss noch verschoben werden.

    Hierzu würde ich gerne noch mal diskutieren, ob es Sinn macht des verstärkte 40kHz Signal an den Controller zu geben, wie es in der Vorlage dargestellt ist.
    Manfred
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken usw_.jpg  

Seite 19 von 31 ErsteErste ... 9171819202129 ... LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •