PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ultraschallsensor & Servos - Messfehler



ChiefGlider
17.05.2009, 20:01
Hallo,

ich verwende den SRF05 und 2 Servos an einem ATMEGA8 (mit 8Mhz internem Quarz). Ausserdem ist ein 16*2 LCD-Display angeschlossen, plus 3 Schalter.

Im Prinzip läuft mein Programm, das ich verwenden möchte, jedoch habe ich das Problem, dass die Messwerte des US-Sensors halbiert werden, sobald ich die Servos initialisiere.

Die Servos werden so initialisiert (funktionieren auch!)

Config Servos = 2 , Servo1 = Portb.1 , Servo2 = Portb.0 , Reload = 10
Config Pinb.1 = Output
Config Pinb.0 = Output

Die US-Sensor-Steuerung läuft so:


Config Pinb.5 = Output

Portb.5 = 0 'Port Low
Pulseout Portb , 5 , 40 'Min. 10uS Impuls senden
Pulsein Zeitmessung , Pinb , 5 , 1
Zeitmessung = Zeitmessung * 10 'mal 10 da Pulsein in 10uS Einheiten Ergebnis ermittelt
Entfernung = Zeitmessung / 58 'Umrechnen in Zentimeter
Waitms 100


Unabhängig voneinander funktioniert beides bestens. Doch zusammen spuckt der US-Sensor immer nur die halbe Entfernung aus.

Ich schätze, es hängt mit den Timern und dem "Reload" des Servos zusammen. Leider kenne ich mich dafür noch nicht gut genug aus. Ich habe das jetzt so gelöst, dass ich für umrechnen in cm halt durch 29 teile. Das funktioniert zwar, ist ja aber eigentlich unschön. Außerdem würde ich gerne verstehen, warum dieser Fehler auftritt.

LG,
David

Dirk
17.05.2009, 20:42
Außerdem würde ich gerne verstehen, warum dieser Fehler auftritt.
Es wäre möglich, dass der Timer0 (der für die Servo-ISR) die Pulsein-Messung stört.

Probier mal, vor jeder Messung des US-Sensors Disable Timer0 und danach wieder Enable Timer0.

Gruß Dirk

raggy
17.05.2009, 20:54
Hallo hier mal ein denkanstoß,dieses Programm ist noch nicht fertig,
und noch nicht dokomentiert,da ich nicht glaube das es im endefekt so bleibt.
Bin selber erst in Roboter steuerung eingestiegen.
Print deshalb weil ein Atmega 8 die Motorsteuerung macht.
Ich hoffe das es Dir hilft.
Gruß raggy


$regfile = "M32DEF.DAT"

$baud = 19200

$hwstack = 288

$swstack = 288

$framesize = 288

$crystal = 16000000 '7372800 ' it is neceserry to use an external crystal with excectly these frequency



$lib "S108_KL.lbx"



Config Graphlcd = 128 * 64sed , Dataport = Portc , Controlport = Portb , Ce = 0 , Ce2 = 1 , Cd = 4 , Rd = 3 , Reset = 2 , Enable = 5

Cls

Wait 2

Setfont Font8x8

Wait 1

Lcdat 1 , 25 , "BALOU II"



Config Servos = 1 , Servo1 = Portd.7 , Reload = 10







Config Adc = Single , Prescaler = Auto , Reference = Avcc

'Start Adc

Enable Interrupts

Servo(1) = 80

Config Portd.7 = Output

Config Portd.2 = Output





Declare Sub Servo_ultra()

Declare Sub Messen()







Dim I As Byte

Dim Mitte As Word

Dim H_links As Word

Dim H_rechts As Word

Dim Links As Word

Dim Rechts As Word

Dim Zeitmessung As Word

Dim Entfernung As Word



Dim Befehl As String * 6





Portd.2 = 0

Portd.7 = 0

Wait 2



Servo(1) = 120



Wait 15



Do

Call Servo_ultra()





Loop

'************************************************* ******************************

'************************************************* ******************************

Sub Servo_ultra()

For I = 80 To 160

Servo(1) = I

If I = 80 Then Call Messen()

If I = 100 Then Call Messen()

If I = 120 Then Call Messen()

If I = 140 Then Call Messen()

If I = 160 Then Call Messen()

Waitms 8

Next I

For I = 160 To 80 Step -1

Servo(1) = I

If I = 100 Then Call Messen()

If I = 120 Then Call Messen()

If I = 140 Then Call Messen()

Waitms 8

Next I

End Sub

'************************************************* ******************************

Sub Messen()

Pulseout Portd , 2 , 40

Pulsein Zeitmessung , Pind , 2 , 1

Zeitmessung = Zeitmessung * 10 'mal 10 da Pulsein in 10uS

'Einheiten Ergebnis Ermittelt

Entfernung = Zeitmessung / 58

'-------------------------------------------------------------------------------

If I = 80 Or I = 100 And Entfernung < 18 Then Print "M_Rech";



If I = 120 And Entfernung > 25 Then Print "M_Grad";

If I = 120 And Entfernung > 40 Then Print "M_Schn";

If I = 120 And Entfernung > 30 Then Print "M_Mite";



If I = 140 Or I = 160 And Entfernung < 18 Then Print "M_Link";



If Entfernung < 10 Then Print "M_Ruec";

'-------------------------------------------------------------------------------

End Sub

'************************************************* ******************************

$include "font8x8.font"

raggy
18.05.2009, 15:45
Hallo hier noch ein zusatz zum obigen Programm,das übrigens bei mir Funktioniert.
Das Waitms 8 ist damit das servo mit geringer Lautstaerke laeuft.
Hier noch was fuer die 5 Euro Servo von C.


Sub Servo_ultra()
For I = 70 To 150
Servo(1) = I
If I = 70 Then Call Messen()
If I = 90 Then Call Messen()
If I = 110 Then Call Messen()
If I = 130 Then Call Messen()
If I = 150 Then Call Messen()
Waitms 8
Next I
For I = 150 To 70 Step -1
Servo(1) = I
If I = 90 Then Call Messen()
If I = 110 Then Call Messen()
If I = 130 Then Call Messen()
Waitms 8
Next I
End Sub

Oben ist bei 120 die Mitte und hier 110 die Mitte.

nochwas ich würde nicht ohne not den Internen Quarz nehmen er ist nicht genau und bei Temperatur schwankungen steigert es sich.
Gruß raggy