Hallo,
Ich habe zwei Lichtsensoren die über den ADC ausgelesen werden und je
nachdem einen Servo steuern sollen.
Ich bräuchte ein paar Denkanstöße wie ich das realisieren könnte.
In einer Schleife ?
LinkerSensor == RechterSensor
(nichts tun bzw. Letzten PWM-Wert beibehalten)
Wenn LinkerSensor > RechterSensor
(Servo nach Links drehen bis LinkerSensor == RechterSensor)
aber wie könnte ich das umsetzen ? eine Schleife die meinen Letzten PWM
Wert runterzählt bis wieder LinkerSensor == RechterSensor ?
oder gibt es da einfachere Methoden und ich denke wieder zu Kompliziert
?
Danke
cube4 schrieb:> oder gibt es da einfachere Methoden und ich denke wieder zu Kompliziert> ?
Die Grundidee ist nicht so falsch, aber die Usetzung ist viel zu
kompliziert.
Du hast noch nicht verinnerlicht, dass dir die Hauptschleife, die jedes
µC Programm hat, automatisch eine Art Zeittaktung deines Programms
vorgibt, in die du dich am besten einklinkst, anstatt gegen sie zu
arbeiten.
Jedes µC Programm sieht in etwa so aus
1
intmain()
2
{
3
Initialisierungen
4
5
sei();
6
7
while(1){
8
9
Programmlogik
10
11
}
12
}
Der Teil Programmlogik ist der interessante Teil. Deine Denkweise muss
sein, dass sich die Programmlogik immer nur um Zeitpunkte kümmert. D.h.
deine Programmlogik fragt sich: Was genau gibt es jetzt zu tun? Welche
Ereignisse sind eingetreten? Welche Messwerte liegen vor? Welche
Aktionen leiten sich daraus ab?
Und ein paar Myykrosekunden später beginnt die Hauptschliefe wieder von
vorne und der ganze Prozess des "Was gibt es genau jetzt zu tun? etc.
etc" beginnt wieder von vorne. Nur das eben jetzt ein etwas späterer
Zeitpunkt vorliegt.
D.h. dein Programm baust du so auf
1
...
2
3
while( 1 ) {
4
5
Messung Links
6
Messung Rechts
7
8
if ( Messung Links < Messung Rechts )
9
drehe Servo etwas nach links (zb PWM Wert--)
10
11
else if ( Messung Links > Messung Rechts )
12
drehe Servo etwas nach rechts (zb PWM Wert++)
13
14
else
15
stoppe Servo (zb PWM Wert nicht verändern)
16
}
du musst dich von dieser "Ich drehe nach links bis die Werte gleich
sind, und das Ganze am Besten in einer Schleife" - Denkweise lösen. Du
hast bereits eine Schleife - deine Hauptschleife. Dein Programm ackert
diese durch, viele tausend mal in der Sekunde. So schnell ist deine
Hardware nicht, dass dein Programm den Punkt verpassen würde, an dem die
beiden Messwerte gleich sind. Ganz im Gegenteil wird dein Programm eher
sogar zu schnell sein, so dass du es bremsen musst, damit es den PWM
Wert nicht viel zu schnell ändert, so dass das Servo nicht mitkommt.
>> Danke
cube4 schrieb:> So bekomme ich aber das Warning:>> undefined reference to SensorAuswerten
Wie heisst noch mal deine Funktion?
SensorAuswerten (also Einzahl)
oder
SensorenAuswerten (also mehrere Sensore_n_)
?
Deine Funktionsnamen solltest du schon kennen, selbst wenn ich mich in
der Eile vertippe.
Sie kann nicht überall gleich heißen, sonst würdest du den Fehler nicht
kriegen. Irgendwo muss ein Tippfehler sein.
Nimm den Namen in den Copy&Paste Buffer und kopier ihn überall drüber.
So ist sichergestellt, dass alle Schreibweisen überall gleich sind.
Ein eindeutiges Argument warum man nichts in eine Funktion verpacken
sollte wenn man ss sowieso nur ein Mal aufruft. Dann muss man auch nicht
darauf achten, die Funktion vor der Verwendungsstelle zu definieren.
Du solltest deiner PWM noch Zeit geben, den Impuls auszugeben und die
Wartezeit abzuwarten, bevor du schon wieder den PWM Wert änderst.
MaWin schrieb:> Ein eindeutiges Argument warum man nichts in eine Funktion verpacken> sollte wenn man ss sowieso nur ein Mal aufruft.
(*)
Na ja.
Iregendwann muss er aber mal lernen, worauf er achten muss und wie
Fehlermeldungen zu interpretieren sind.
> Dann muss man auch nicht> darauf achten, die Funktion vor der Verwendungsstelle zu definieren.
Er braucht nur die Funktion vor main schieben und auf die Schreibweise
achten.
Das Argument sollte eigentlich lauten: Ein eindeutiges Argument, warum
man auf Funktionsnamen achten soll, die einem wenig Spielraum für
Tippfehler geben ohne dass man es bemerkt.
> Du solltest deiner PWM noch Zeit geben, den Impuls auszugeben und die> Wartezeit abzuwarten, bevor du schon wieder den PWM Wert änderst.
Das allerdings.
(*) mich regen Funktionsnamen wie Send_A_StringToMrLCDwithLocation viel
mehr auf. Viel zu lang, viel zu kindisch.
Hallo,
also an den Namen liegt es wirklich nicht hab es Kopiert, das mit den
Namen
Send_A_StringToMrLCDwithLocation ist schon "besch.." ja :-) aber das hab
ich von einer Seite die die ganzen Funktionen für mich wirklich gut
verständlich rübergebracht hat, habe es erstmal so beibehalten.
Sei es wie es will, lass ich die Funktion weg und packe es so in die
Schleife funktioniert es meiner Meinung nach recht gut, NUR meine PWM
noch nicht also Servo bewegt sich nicht.
Werde das mit der Zeit mal einbauen und sehen.
So habe es jetzt so gelöst funktioniert recht gut, obwohl nicht nötig,
würde mich dennoch interessieren wie ich den Servo noch schneller machen
könnte ?
Die In bzw. Dekrementierung erhöhen ?