PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PID Motordrehzahl Frage zum Bascomcode



schilly
12.01.2010, 19:34
Hallo,

ich habe hier meinen Roby 2.0 schon gut ans laufen gebracht. Alle Sensoren funktionieren. Ziel soll es sein, das er das Zimmer meiner Tochter aufräumt (wenigstens ein paar Objekte erkennt und wegbringt). Darum ist vorne eine Ultraschallsensor für die Objekterkennung vorhanden und hinten eine zwei Finger Gripper mit Sensoren um das Objekt zu greifen. Mit absoluten Werten (hier meine ich fahre x steps vor und drehe x steps usw.) funktioniert das eigendich schon ganz gut.

Bilderlink: http://www.schilly.net/index.php?id=22
http://www.schilly.net/typo3temp/pics/c6fad4f85b.jpg
http://www.schilly.net/typo3temp/pics/91db0526cb.jpg

Um ganz genaue Positionen anfahren zu können, soll eine PID Regler die beiden Motoren regeln. Hier habe ich mein Problem zum Code.

Der Code ist aus dem Buch "Roboter Selbst bauen" Cybot Pimp.
Ich steuere meine Motoren über PWM in einem Bereich zwischen 300 und 511. Das gebe ich über pwm an....

Ich verstehe in dem Code von Uli Sommer die PID-Regler Steuerung nicht. Der PID Regler ist in einem Timer_IRQ untergebracht. Soweit alles gut.

Frage: Was bedeutet die 512 ?? Siehe Code

Hier die If-Abfrage:


'>>> vorwärts
If Motor_l > 512 And Motor_r > 512 Then

If Rad_l_save > Rad_r_save Then
Motor_l = Motor_l + Pid
End If

If Rad_l_save < Rad_r_save Then
Motor_r = Motor_r + Pid
End If

End If



Hier alles:



'################################################# ##############################
'# Projekt : Cybot Pimp #
'# Controller: Mega32 RN-Control Board #
'# Autor : Sommer Ulli #
'# Homepage : www.sommer-robotics.de #
'# #
'# Funktionen: 1. PID-Regler #
'# Taster 1 = Start #
'# Taster 2 = Stop #
'################################################# ##############################

'================================================= ==============================
'***| Mikrocontroller Config |************************************************* *
'================================================= ==============================

'Microcontroller
'================
$regfile = "m32def.dat"
$crystal = 16000000
$baud = 19200
$hwstack = 100
$swstack = 100
$framesize = 100



'ADC einstellen
'===============
Config Adc = Single , Prescaler = Auto , Reference = Internal
Start Adc


'I/O
'======
'Port A als Eingang und Pullup on
Config Porta.7 = Input
Porta.7 = 1

'Zähler
'======
Dim X As Word


'Taster abfrage und Auswetung
'=============================
Declare Function Tastenabfrage() As Byte
Declare Sub _tastenauswertung()
Dim Ton As Integer
Dim Taste As Byte
Dim Tastelast As Byte
Dim Start_flag As Bit
Dim Int_flag As Bit

'Drehzahlmessung
'================
'Timer0 = 100Hz
Config Timer0 = Timer , Prescale = 1024
Const Timervorgabe = 100
On Timer0 Timer_irq
Enable Timer0


'Antrieb
'========
Declare Sub Fast_forward()
Declare Sub Middle_forward()
Declare Sub Slow_forward()
Declare Sub Fast_backward()
Declare Sub Middle_backward()
Declare Sub Slow_backward()
Declare Sub Fast_left()
Declare Sub Middle_left()
Declare Sub Slow_left()
Declare Sub Fast_right()
Declare Sub Middle_right()
Declare Sub Slow_right()
Dim Speed_l_soll As Word
Dim Speed_r_soll As Word
Dim Motor_l As Word
Dim Motor_r As Word
Dim Speed_l As Word
Dim Speed_r As Word
Dim Dir_l As Bit
Dim Dir_r As Bit
Config Pinc.6 = Output 'linker Motor Kanal 1
Config Pinc.7 = Output 'linker Motor Kanal 2
Config Pind.4 = Output 'linker Motor PWM
Config Pinb.0 = Output 'rechter Motor Kanal 1
Config Pinb.1 = Output 'rechter Motor Kanal 2
Config Pind.5 = Output 'rechter Motor PWM
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Pwm1a = 0
Pwm1b = 0
Tccr1b = Tccr1b Or &H02


'Endcoder
'=========
Config Pind.2 = Input
Config Pind.3 = Input
Dim Rad_l As Long
Dim Rad_r As Long
Dim Rad_l_save As Long
Dim Rad_r_save As Long
Config Int0 = Falling
Config Int1 = Falling
On Int0 Int0_int
On Int1 Int1_int
Enable Int0
Enable Int1



'Sonar Servo
'============
Config Porta.2 = Output
Declare Sub _servo()
Dim Servo_pos As Word
Dim Servo_pos_save As Word
Dim Multiplikator_servo As Byte
Dim Setup As Word
Multiplikator_servo = 15
Setup = 3900


'PID Regler
'===========
Dim P As Integer
Dim I As Integer
Dim D As Integer
Dim Kp As Integer
Dim Ki As Integer
Dim Kd As Integer
Dim Pid As Integer
Dim Error As Integer
Dim Error_last As Integer
'je niedriger die Geschwindigkeit desto höher die Werte
Kp = 100
Ki = 50
Kd = 10


'Odometrie
'==========
Declare Sub _stop()
Declare Sub _odo_reset()
Dim Odo_l As Long
Dim Odo_r As Long
Const Pi = 3.14159265
Const Tick_l = 2297 'pro Radumdrehung
Const Tick_r = 2291
Const Wheel_base = 10.7


Enable Interrupts
'================================================= ==============================
'***| Initzialisierung|********************************* ************************
'================================================= ==============================

Akku_leer = 0
Dir_l = 1
Dir_r = 1
Int_flag = 0
Rad_l_save = 0
Rad_r_save = 0
Rad_l = 0
Rad_r = 0

Motor_r = 512
Motor_l = 512

Odo_l = 0
Odo_r = 0

Lcd_counter = 0

For X = 1 To 50
Servo_pos = 128
Call _servo()
Next X
X = 0


'LCD Start Bildschirm
'=====================
Locate 1 , 1 : Lcd "# Cybot - Pimp #"
Locate 2 , 1 : Lcd "#--------------#"
Locate 3 , 1 : Lcd " PID-Regler "
Locate 4 , 1 : Lcd "Sommer Robotics"



'################################################# ##############################
'*** Haubtprogramm ************************************************** ***********
'################################################# ##############################
Main:
Do

' Tasterabfrage und Auswertung
'================================================= ==============================
Call _tastenauswertung()


' Sensor Abfrage
'================================================= ==============================
Call _betriebsspannung()
Call _srf02_entfernung()



' LCD Ausgabe
'================================================= ==============================
Incr Lcd_counter
If Lcd_counter > 10 Then

'Locate 1 , 1 : Lcd "SRF02: " ; Entfernung ; " cm "
'Locate 2 , 1 : Lcd "Bat: " ; Fusing(volt , "##.##") ; " Volt "
'Locate 3 , 1 : Lcd "Odo-l: " ; Odo_l ; " "
'Locate 4 , 1 : Lcd "Odo-r: " ; Odo_r ; " "

Lcd_counter = 0
End If



' Jetzt gehts los
'================================================= ==============================
If Start_flag = 1 Then

Do

Call _srf02_entfernung()
If Entfernung < 30 Then
Call _stop()
Start_flag = 0
Exit Do
End If


Call Slow_forward()
Call _tastenauswertung()
If Taste = 2 Then
Call _stop()
Exit Do
End If

Loop

End If


Loop
End
'################################################# ##############################
'*** Haubtprogramm Ende ************************************************** ******
'################################################# ##############################


'================================================= ==============================
'***| Fahrbefehle |************************************************* ************
'================================================= ==============================
'>>> vorwärts
Sub Fast_forward()
Motor_l = 1000
Motor_r = 1000
End Sub

Sub Middle_forward()
Motor_l = 800
Motor_r = 800
End Sub

Sub Slow_forward()
Motor_l = 650
Motor_r = 650
End Sub

'>>> rückwärts
Sub Fast_backward()
Motor_l = 50
Motor_r = 50
End Sub

Sub Middle_backward()
Motor_l = 300
Motor_r = 300
End Sub

Sub Slow_backward()
Motor_l = 450
Motor_r = 450
End Sub


'>>> links drehen
Sub Fast_left()
Motor_l = 300
Motor_r = 850
End Sub

Sub Middle_left()
Motor_l = 400
Motor_r = 800
End Sub

Sub Slow_left()
Motor_l = 450
Motor_r = 700
End Sub


'>>> rechts drehen
Sub Fast_right()
Motor_l = 850
Motor_r = 300
End Sub

Sub Middle_right()
Motor_l = 800
Motor_r = 400
End Sub

Sub Slow_right()
Motor_l = 700
Motor_r = 450
End Sub



'================================================= ==============================
'***| Stop |************************************************* *******************
'================================================= ==============================
Sub _stop()

'>>> Motor_l Stop!
Portd.4 = 0
Pwm1a = 0

'>>> Motor_r Stop!
Portd.5 = 0
Pwm1b = 0

End Sub


'================================================= ==============================
'***| Odometer Reset |************************************************* *********
'================================================= ==============================
Sub _odo_reset()
Odo_l = 0
Odo_r = 0
End Sub


'================================================= ==============================
'***| Tastenabfrage |************************************************* **********
'================================================= ==============================
Function Tastenabfrage() As Byte

Local Ws As Word
Tastenabfrage = 0
Ws = Getadc(7)

If Ws < 1010 Then
Waitms 10
If Ws < 1000 Then
'T1 = 404
'T2 = 336
'T3 = 265
'T4 = 188
'T5 = 106
Select Case Ws

Case 390 To 420
Tastenabfrage = 1
Case 320 To 350
Tastenabfrage = 2
Case 250 To 280
Tastenabfrage = 3
Case 170 To 200
Tastenabfrage = 4
Case 90 To 130
Tastenabfrage = 5

End Select
End If
End If

End Function


'================================================= ==============================
'***| Tastenabfrage |************************************************* **********
'================================================= ==============================
Sub _tastenauswertung()

'>>> Tastenfeld abfragen
Taste = Tastenabfrage()
If Taste <> Tastelast And Taste <> 0 Then
Sound Beep , 400 , 500
End If
Tastelast = Taste

'>>> START
If Taste = 1 Then
Start_flag = 1
Odo_l = 0
Odo_r = 0
End If

'>>> STOP
If Taste = 2 Then
Call _stop()
Start_flag = 0
End If

End Sub


'================================================= ==============================
'***| SRF02 Entfernung |************************************************* *******
'================================================= ==============================
Sub _srf02_entfernung()

Local Lob As Byte
Local Hib As Byte
Local Firmware As Byte
Local Temp As Byte
Local Slaveid_read As Byte
Slaveid_read = Slaveid + 1

'Messvorgang in starten
Incr Srf02_counter
If Srf02_counter = 100 Then

I2cstart
I2cwbyte Slaveid
I2cwbyte 0
I2cwbyte 81 'in Zentimetern messen
I2cstop

End If

If Srf02_counter => 200 Then

I2cstart
I2cwbyte Slaveid
I2cwbyte 2
I2cstop
I2cstart

I2cwbyte Slaveid_read
I2crbyte Hib , Ack
I2crbyte Lob , Nack
I2cstop

Entfernung = Makeint(lob , Hib)
Srf02_counter = 0

End If

End Sub


'================================================= ==============================
'***| Servo |************************************************* ******************
'================================================= ==============================
Sub _servo()
Servo_pos_save = Servo_pos * Multiplikator_servo
Servo_pos_save = Setup + Servo_pos_save
Pulseout Porta , 2 , Servo_pos_save
Waitms 10
End Sub


'================================================= ==============================
'***| Interrupt Encoder |************************************************* ******
'================================================= ==============================
Int0_int:
Incr Rad_l
Incr Odo_l
Return

Int1_int:
Incr Rad_r
Incr Odo_r
Return


'================================================= ==============================
'***| Interrupt Timer0 |************************************************* *******
'================================================= ==============================
Timer_irq:
Timer0 = Timervorgabe
Rad_l_save = Rad_l
Rad_r_save = Rad_r
Rad_l = 0
Rad_r = 0

'>>> Akku leer Warnung
If Akku_leer = 1 Then
Incr Akku_beep
If Akku_beep > 50 Then
Sound Beep , 400 , 500
Akku_beep = 0
End If
End If


'Start ?
'========
If Start_flag = 1 Then

If Motor_l <> 512 Or Motor_r <> 512 Then

'***| PID Regler |************************************************* *************


'>>> Error differenz
Error = Rad_l_save - Rad_r_save
Error = Abs(error)

'>>> P - Anteil
P = Error
P = P * Kp

'>>> I - Anteil
I = I + Ki
I = Error - Error_last

'>>> D - Anteil
D = Error - Error_last
D = D * Kd

'>>> Error last
Error_last = Error

'>>> PID
Pid = P + I
Pid = Pid + D


'>>> rückwärts
If Motor_l < 512 And Motor_r < 512 Then

If Rad_l_save > Rad_r_save Then
Motor_l = Motor_l - Pid
End If

If Rad_l_save < Rad_r_save Then
Motor_r = Motor_r - Pid
End If

End If


'>>> vorwärts
If Motor_l > 512 And Motor_r > 512 Then

If Rad_l_save > Rad_r_save Then
Motor_l = Motor_l + Pid
End If

If Rad_l_save < Rad_r_save Then
Motor_r = Motor_r + Pid
End If

End If


'>>> links drehen
If Motor_l < 512 And Motor_r > 512 Then

If Rad_l_save > Rad_r_save Then
Motor_l = Motor_l - Pid
End If

If Rad_l_save < Rad_r_save Then
Motor_r = Motor_r + Pid
End If

End If


'>>> rechts drehen
If Motor_l > 512 And Motor_r < 512 Then

If Rad_l_save > Rad_r_save Then
Motor_l = Motor_l + Pid
End If

If Rad_l_save < Rad_r_save Then
Motor_r = Motor_r - Pid
End If

End If


'>>> Begrenzung
If Motor_l > 1023 Then Motor_l = 1023
If Motor_l < 1 Then Motor_l = 0

If Motor_r > 1023 Then Motor_r = 1023
If Motor_r < 1 Then Motor_r = 0


'***| Antrieb |************************************************* ****************


'>>> Motor_l rückwärts
If Motor_l < 512 Then
Dir_l = 0
Portc.6 = 1
Portc.7 = 0
Portd.4 = 1
Speed_l = Motor_l * 2
Speed_l = 1023 - Speed_l
Pwm1a = Speed_l
End If

'>>> Motor_l vorwärts
If Motor_l > 512 Then
Dir_l = 1
Portc.6 = 0
Portc.7 = 1
Portd.4 = 1
Speed_l = Motor_l * 2
Pwm1a = Speed_l
End If


'>>> Motor_r rückwärts
If Motor_r < 512 Then
Dir_r = 0
Portb.0 = 1
Portb.1 = 0
Portd.5 = 1
Speed_r = Motor_r * 2
Speed_r = 1023 - Speed_r
Pwm1b = Speed_r
End If

'>>> Motor_r vorwärts
If Motor_r > 512 Then
Dir_r = 1
Portb.0 = 0
Portb.1 = 1
Portd.5 = 1
Speed_r = Motor_r * 2
Pwm1b = Speed_r
End If

'>>> Motor_l Stop!
If Motor_l = 512 Then
Portd.4 = 0
Pwm1a = 0
End If

'>>> Motor_r Stop!
If Motor_r = 512 Then
Portd.5 = 0
Pwm1b = 0
End If

End If
End If

Return


Hier wird der Motor_L (links) in einer If-Abfrage abgefragt > oder < usw.
Waum 512?

Ich habe mir das ein paar Tage angeschaut und komme nicht dahinter. Servos sind es ja nicht...

Das ist mein eigendliches Problem...

Gruß Schilly

oberallgeier
12.01.2010, 21:52
... Ich verstehe in dem Code von Uli Sommer die PID-Regler Steuerung nicht ...Da sind wir schon zwei - wenn das, was Du präsentierst, der besagte Code ist. Wahrscheinlich liegt es aber daran, dass ich bascom garnicht kann - jedenfalls sehe ich da drin nicht wirklich einen PID-Hintergrund.

Schilly, Sportsfreund: wie bist Du zu den Regelparametern Kp, Ki und Kd gekommen? Hmmmmmm - lass mich mal wetten -- Einsatz (noch ein) Dauerlutscher? -- diese Werte hast Du abgeschrieben?! Schau bitte mal hier nach, (http://www.rn-wissen.de/index.php/Regelungstechnik#Dimensionierung_nach_Einstellrege ln) da ist die Einstellung eines solchen Reglers beschrieben.

Und hier ein Beispiel zur Programmierung, (http://www.rn-wissen.de/index.php/Regelungstechnik#Realisierung_mit_digitalem_Regler ) aber (leider eben) in C. Im anderen Thread habe ich ja etwas von Sprungantwort geschrieben, mit der Übung könntest Du Dir die richtigen Paramter für Dein System bestimmen. Wie - das steht im ersten Link (hier, oben) und ein bisschen, glaube ich, irgendwo in einem meiner Threads (sorry, weiß nicht mehr wo).


... Ziel soll es sein, das er das Zimmer meiner Tochter aufräumt ...Das darf doch nicht wahr sein! Glaubst Du daran? Ist das mit der Tochter abgesprochen? Hmmmm - ok, das geht mich nix an.

schilly
13.01.2010, 07:37
Hallo Oberallgeier,




Schilly, Sportsfreund: wie bist Du zu den Regelparametern Kp, Ki und Kd gekommen? Hmmmmmm - lass mich mal wetten -- Einsatz (noch ein) Dauerlutscher? -- diese Werte hast Du abgeschrieben?!

Also der Code ist komplett aus dem Buch... Die Parameter dementsprechend auch. Ich bin auch noch gar nicht auf die eigendliche PID Regelung eingegangen... Ich fahre hier den pragmatischen Ansatz das als Black-Box so zu nutzen.. Klar muss man sich mit den Parametern bzw. der eigedlichen Regelung auseinandersetzen...

Was ich an dem Code nicht verstehe ist.. Da wird ein Fahrbefehl Motor links 600 motor und Motor rechts 600 abgesetzt. Der Regelalgorithmus wird durchgeführt und dann kommt man in einer If-Abfrage wo Motor_link > 512 etc... reinrutscht... ok.. dementsprechend Drehzahlanpassungen vorgenommen wird...

Warum denn 512? Klar... die Begrenzung der Fahrtbefehle in dem Codezwischen 0-1023.. da ist 512 in der Mitte... aber das ist mein Verständnissproblem.

Der Fartbefehl sagt doch: liebes Motörchen, 600 solls doch sein...

Na, ich werde mir einfach mal Deine Links anschauen...

Vielleicht ist auch jetzt der Zeitpunkt gekommen, doch die Sachen in C anzugehen, aber in bin total begeistert, wie man mit ein paar Befehlen (Bascom) total weit kommt...




Ziel soll es sein, das er das Zimmer meiner Tochter aufräumt ...Das darf doch nicht wahr sein! Glaubst Du daran? Ist das mit der Tochter abgesprochen? Hmmmm - ok, das geht mich nix an.

Hahaha... Ja, ich glaube Sie wartet schon darauf...

Gruß Schilly

i_make_it
13.01.2010, 14:15
Schau dir in deinem Code doch mal den Abschnitt Fahrbefehle an.

Sub Fast_forward()
Motor_l = 1000
Motor_r = 1000
End Sub

Sub Fast_backward()
Motor_l = 50
Motor_r = 50
End Sub

Er hat vermutlich als Spanne 0-1023, und 512 ist halt die Mitte.
Also stehender Motor.

Im Abschnitt PID-Regler findest du das dann wieder.

'>>> rückwärts
If Motor_l < 512 And Motor_r < 512 Then

'>>> vorwärts
If Motor_l > 512 And Motor_r > 512 Then

'>>> links drehen
If Motor_l < 512 And Motor_r > 512 Then


'>>> rechts drehen
If Motor_l > 512 And Motor_r < 512 Then

'>>> Begrenzung
If Motor_l > 1023 Then Motor_l = 1023
If Motor_l < 1 Then Motor_l = 0

If Motor_r > 1023 Then Motor_r = 1023
If Motor_r < 1 Then Motor_r = 0

Also definitiv 0= maximale Drehung für rückwärts,
1023 = maximale Drehung für vorwärts und 512 = Stillstand des Motors.
Bei aktivierter Motorspannung.

Damit bleibt der Roby dann auch auf einer Schrägen stehen. wenn der Motor einfach spannungsfrei geschaltet wird, würde er einfach wegrollen.
Das ist wie Anfahren am Berg. Wenn man die Kupplung durchtritt rollt man wenn man entsprechend Gas gibt und die Kupplung schleifen lässt hält das den Wagen auf der Stelle.
Verbrennungsmotor passt zwar nicht hundertprozentig auf E-Motor war aber das Beispiel das mir am schnellsten einfiel.

Übrigens ich habe auch noch nie mit Bascom gearbeitet, der Code liest sich aber ganz sauber.

Die Regelung wird dann mit Dem Offset PID realisiert.
Was dann auch im Abschnitt "PID-Regler" des Codes zu sehen ist.
Also wird mit dern Variablen: Motor_l und Motor_r sowie den Zuständen <512, = 512 und >512 auf 5 Fälle verzweigt.
Vorwärts, Rückwärts, Linkskurve, Rechtskurve und Stop.

schilly
13.01.2010, 19:32
Hallo,

Schau dir in deinem Code doch mal den Abschnitt Fahrbefehle an.

Er hat vermutlich als Spanne 0-1023, und 512 ist halt die Mitte.
Also stehender Motor.


Hört sich jetzt doof an, aber die Idee hatte ich auch. Ich habe so auch schon Servos angesprochen. Was für mich aber nicht passte: Meine Motoren die ich über einen IC l293d steuer haben einen Wertebereich von ca. pwm 300 - 500.
(Die laufen erst ab diesen Wert so richtig an, da das Bleiakku rel schwer ist.)
Dann schaltet der L293 die 12 Volt dann fast voll durch. Die Drehrichtung gebe ich über die die beiden anderen Ports an...

Also warum sollten die Motoren sich bei Werten > 500 auf einmal die Drehrichtung ändern?

Das muss ich mir gleich mal anschauen bzw. ausprobieren .. Hoffentlich habe ich da kein totalen "Denkfehler"... das wäre ja unschön....

vielen Dank...

oberallgeier
13.01.2010, 20:54
... Also warum sollten die Motoren sich bei Werten > 500 auf einmal die Drehrichtung ändern ...... Weils im Programm steht *ggg* (ich weiß, dass das jetzt ne doooofe Antwort ist).


'>>> Motor_l rückwärts
If Motor_l < 512 Then
Dir_l = 0
Portc.6 = 1
Portc.7 = 0
Portd.4 = 1
Speed_l = Motor_l * 2
Speed_l = 1023 - Speed_l
Pwm1a = Speed_l
End If

'>>> Motor_l vorwärts
If Motor_l > 512 Then
Dir_l = 1
Portc.6 = 0
Portc.7 = 1
Portd.4 = 1
Speed_l = Motor_l * 2
Pwm1a = Speed_l
End If
Da werden zur Drehrichtungsumkehr bei <512 oder > 512 verschiedene Pinne auf PORTC und PORTD geschaltet - und so der Moto rtreiber auf "andere Richtung" gepolt. Hoffentlich hattest Du zum Nachbau auch einen geeigneten Schaltplan, in dem die entsprechenden Eingänge des Motortreibers angesprochen werden (klick für Datenblatt). (http://focus.ti.com/lit/ds/symlink/l293d.pdf)

Tja - und jetzt steht der Regler natürlich auf dem Schlauch, wenn er so in die Gegend von über 400 kommt - da bleibt das Gefährt wohl stehen - und fährt vermutlich erst wieder bei 700 ... 800 in die andere Richtung an. Der muss nämlich diese Drehmomentlücke überwinden - der Regler. Das Problem kenne ich aus eigenen Arbeiten an meiner kleinen autonomen Dose (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=466776&sid=468a3974eb7b56088af83cdb2bda94c7#466776) (ziemlich unten im Posting) *ggg* - deswegen ruht dort momentan meine Arbeit an der Regelung *nochmehrggg*. Und mir fiel bisher keine sinnvolle Routine ein, mit der ich mithilfe von offsets und so diese Drehmomentlücke überbrücken kann . . . . Denn auch meine Motoren laufen genaugenommen bei PwM {0 ... 255} (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=435362&sid=07854ede7027e982d4caef6aa44adf94#435362) nur sinnvoll ab etwa 50 und sind bei 150 praktisch am Maximum.

Welchen maximalen Strom ziehen Deinen Motoren? Bist Du sicher, dass diese Trümmer nicht mehr als 600 mA ziehen (denk mal an den Anfahrstrom - oder an den Blockierstrom - vielleicht nicht nur denken sondern mal nachmessen, am Besten ohne Moto rtreiber). Leider steht auf den hübschen Motoren keine Stromangabe. Und schau auch mal, ob überhaupt Spannung vom Moto rtreiber ausgegeben wird - oder ob der schon sein Leben ausgehaucht hat. 600 mA hat man als Anlaufstrom schnell überschritten . . . .

i_make_it
14.01.2010, 08:08
Also die Problematik der Drehmomentlücke und des praktikablen Wertebereiches sind bei dem Quellcode ja nicht wirklich ein Problem.

Da überall zwei Werte für vorwärts und für Rückwertsdrehung der Motoren stehen, die in diesem Fall zwar identisch (512) sind, sollte es eigentlich möglich sein einmal aus dem Code eine Fahrroutine ohne Reglung nur für Vorwärtsfahrt und Rückwärtsfahrt zu schreiben.
Dabei wird der Wert halt einmal automatisch von 512 an bis 0 dekrementiert bzw von 512 bis 1023 inkrementiert.
unter jedes Rad ein Stück Papier und vor und hinter den Robby je eine schwere 1,5l Colaflasche oder sonst ein Gewicht. Den Wert der Variablen lässt man sich in einem Display oder per codierten LEDs anzeigen.
sobald die Papiere weggeschoben werden hat man einen Startwert und hebt den Robby an damit er keinen Burnout der Reifen hinlegt.
Wenn der obere sinnvolle Wert der Maximaldrehzahl erreicht ist, wird der Wert auch erfasst.
So bekommt man seine Grenzwerte.
Jetzt ändert man entweder alle Werte im Beispielcode entsprechend, oder man schreibt eine Routine die den Bereich von 0-1023 auf die 0-255 des PWM skaliert und die Lücke als toten Bereich ausnimmt, oder aber man baut einen Motortreiber auf der das übernimmt, so das durch die Motoranpassung das PWM von 0-255 voll ausgeschöpft werden kann.
Wobei das dann eine Sache von Kanonen und Spatzen wäre.
Aber für Jemand der Motorregler entwickeln will wäre das eine Schöne Aufgabe.

Richard
14.01.2010, 18:23
Ich bin ja noch nicht ganz so weit, habe aber beim Testen
Vom Motortreiber + Motor natür lich auch festgestellt das ich
den motor nicht bis PWM 0 steuern kann. Also habe ich halt
das PWM Signal schrittweise laangsam erhöht bis der Motor
Anläuft und dann noch etwas dazugegeben das nichts ruckelt
und ich den Motor Von Hand mit Zage bewaffnet nicht stoppen kann.

Danach war das dann mein PWM Start Wert. Analog das gleiche
mit den PWM Endwert. Da fehlen dann allerdings eine Menge
PWM Werte/Steuerwerte. :-(

Ich wollte deshalb den übrig gebliebenen nutzbaren PWM
Bereich etwas strecken in dem ich z.B. bei einer Rampe
..For pwm = 50 (min Startwert) to pwm xyz Step o,x.. probiere,
wenns denn klappt? Leider bin ich dann abgelenkt worden. :-)

Den PID Regler selber habe ich noch nicht begonnen, Extrem viel
gelesen und hier aufgepasst. Das Prinzip ist ja nicht wirklich
unverständlich, aber wenn ich mir dann z.B. das Beispiel Prog.
in Bascom anschaue.......hmmmm. Wenn ein Programmierer auch
gut ( für sich mit seinem Wissen was er sich bei seinem Progamm gedacht hat) Dokumentiert, ist das für Außenstehende immer noch viel zu
wenig Doku. ;=( Aber hinter jeder Zeile Code ein Hanbuch einfügen
ist kaum möglich und (ich) mache das ja auch nicht!

Gruß Richard

Richard
14.01.2010, 18:40
(Die laufen erst ab diesen Wert so richtig an, da das Bleiakku rel schwer ist.)
Dann schaltet der L293 die 12 Volt dann fast voll durch. Die Drehrichtung gebe ich über die die beiden anderen Ports an...

Also warum sollten die Motoren sich bei Werten > 500 auf einmal die Drehrichtung ändern?



Das leuchtet mir auch nicht wirklich ein? Es ist klar, wenn man bei einen Auto/Moped bei 0 Drehzahl die Kupplung kommen läßt, säuft die Karre
ab. Eine gewisse Grundkraft muß gegeben sein, aber die sollte dann
auch bis zur Maximalen Leistung gesteigert werden können ohne bei
230 km/h schlagartig auf "Rasen" = Rückwärz zu schalten!

Das ergibt beim Moped "Straßenflechte". :-(

Gruß Richard

RP6conrad
14.01.2010, 19:07
Für eine PID regelung zu implementieren ist erst eine Messung notwendig. Da kan nichts geregelt werden ohne zu messen. Dafur braucht men encoder um die Radgeschwindigkeit zu vermessen.
PWM regelung mit eine H-brucke geht auf verschiedene Weise:
1. Enable wird mit PWM gesteurt, beide Inputs von H-brucke geben die Drehrichtung vor. Brauchts du 3 pins/H-brucke.
2. Enable immer high, eine Input auf PWM, die andere H oder L für die Drehrichtung. Brauchts du 2 pins/H-brucke.
3. PWM an Input 1, inverse von PWM an Input 2, enable immer auf high.
Brauchts du nur 1 µpin + inverter. Auf diese Weise gibt 50% PWM speed 0, 0% PWM ist full speed forward, 100% ist full speed backward.
Die PWM wert is immer die sollvorgabe von Geschwindigkeit. Der ist-wert von Geschwindigkeit musst du erfassen mit eine Messung. Und dan kan nachgeregelt werden.

schilly
16.01.2010, 16:30
Hallo,

vielen Dank für die vielen Tips und Hinweise.. Werde das in den nächsten Tagen verarbeiten.. Am liebsten gleich schon, aber ich sitze hier im Datacenter, und das rauschen in meinen Ohren ist kein Meeresrauschen, sprich Arbeit... Wenn 8000 User wieder arbeiten können, werde ich hoffentlich bald danach loslegen können.
Ich denke aber durch Eure Hinweise, sollte ich das Problem lösen können.

So aus dem Kopf herraus muss ich mir mein PWM noch einmal anschauen... wie gesagt, da nutze ich Werte zwischen 300-500... Habe das auch nicht hinterfragt...

Gruß Schilly

oberallgeier
16.01.2010, 16:47
Hallo Richard, hi alle,


... Eine gewisse Grundkraft ... bis zur Maximalen Leistung gesteigert ... ohne bei 230 km/h schlagartig auf ... Rückwärz zu schalten ...Immerhin ist diese "elektrische Bremse" - oder Motorbremse - ziemlich effektiv. Bei meinem MiniD0 (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=432909&sid=8e5811e176d6b6e24c189c4a9617eae7#432909) habe ich mir mal die unterschiedlichen Reaktionen angesehen und diese drei Varianten (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=465839&sid=8e5811e176d6b6e24c189c4a9617eae7#465839) gemessen: V1 = abgestuftes "Fuss-vom-Gas", V2 = Fuss sofort gaanz weg vom Gas und V3 = "Vollgas zurück" - sprich - elektrisch mit maximalem PWM-Wert bremsen - das heißt soviel wie: Gegenschub. Dazu muss natürlich genug Reifenhaftung vorhanden sein . . . . Die Messdiagramme sind im genannten Posting verlinkt.

Übrigens sind im verlinkten Thread auch die von mir schon oben beschriebenen Messungen zur Sprungantwort enthalten - von denen RP6conrad wohl spricht.

Bammel
16.01.2010, 20:43
Hallo,

ich habe ebenfalls das Buch und hatte ebenfalls den Code verwendet. Und natürlich klappte nichts!
Grund hierfür ist das bei dem Cybot-Pimp das RN-Control verwendet wird das meines wissen nen extra Co-Controller hat!? Habe da Buch leider momentan nicht zur Hand.
Und meines wissens nach ist die Drehrichtung PWM gesteuert! also über 50% PWM = vorwärts und unter 50% = rückwärts.

Aber ich muss dazu sagen wenn man sich wirklich mit der Materie auseinander setzt und das auch will. Ist es wirklich garnicht so schwer!

Ich habe bei meinem Projekt einen 8bit PWM zu verfühung gehabt. und ab einen wert von 130 lief der Motor erst an. Trotzdem konnte ich dort noch viel Regeln. Ich habe es allerdingt bei einem PI-Regler belassen was vollkommen ausreichend ist und war.

Hier (https://www.roboternetz.de/phpBB2/viewtopic.php?p=474658#474658) findest du den passenden Post dazu. Dort habe ich ein wenig beschrieben wie ich es angestellt habe . Und noch ein kleines Video mit einem vergleich mit und ohne Regelung reingestellt.

Gruß, Bammel

Richard
17.01.2010, 09:21
Immerhin ist diese "elektrische Bremse" - oder Motorbremse - ziemlich effektiv. Bei meinem MiniD0 (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=432909&sid=8e5811e176d6b6e24c189c4a9617eae7#432909) habe ich mir mal die unterschiedlichen Reaktionen angesehen und diese drei Varianten (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=465839&sid=8e5811e176d6b6e24c189c4a9617eae7#465839) gemessen: V1 = abgestuftes "Fuss-vom-Gas", V2 = Fuss sofort gaanz weg vom Gas und V3 = "Vollgas zurück" - sprich - elektrisch mit maximalem PWM-Wert bremsen - das heißt soviel wie: Gegenschub. Dazu muss natürlich genug Reifenhaftung vorhanden sein . . . . Die Messdiagramme sind im genannten Posting verlinkt.


Moin oberallgeier

Das habe ich natürlich alles schon gelesen. :-) Hier hat mich halt
die Art der Drehrichtungsumkehr gewundert. Bei (meinen) Motortreiber
mache ich das halt über Steuerpins 00/11 Bremsen 01/10 rechts/links.
Damit bleibt dann der PWM Bereich großer und ne Vollbremsung klappt
trotzdem.

Gruß Richard

schilly
17.01.2010, 12:10
Hallo Bammel,


Hallo,

Und meines wissens nach ist die Drehrichtung PWM gesteuert! also über 50% PWM = vorwärts und unter 50% = rückwärts.


TREFFER !
ich hatte ursprünglich einen Miniaturtreiber Motortreiber TB6612FNG gekauft. Grund was, das war mein erster Motortreiber, und ich fand die Dokumentation recht gut. Und den da verwendeten Code macht genau das, was Du oben angesprochen hattest.

Ich werde jetzt noch mal ein paar Tests durchjführen, (mit den Werten spielen). Und dann kann ich die Regelung in meinen Coder "überführen".

Lustig ist: Da dachte man, man hätte schon so viele Probleme gelöst und im "Griff" und da bemerkt man, das man einiges wohl doch noch nicht verstanden hat aber tatsächlich benutzt...

Geht Euch genau so?

Gruß Schilly

oberallgeier
17.01.2010, 12:38
... hatte ursprünglich einen Miniaturtreiber Motortreiber TB6612FNG ... war mein erster Motortreiber ...Den hatte ich auf einem babyorangutan von pololu. Leider ging er (der Treiber - und danach gleich die Platine) über den Jordan, weil pololu den Typ garnicht genannt - und ich keine Doku hatte.


... Da dachte man ... da bemerkt man ... Geht Euch genau so ...Ich will jetzt nicht sagen, dass ALLE meiner Postings die älter als ein halbes Jahr sind, eher Müll erzählen oder dass alle meiner Aufbauten die das gleiche Alter erreicht haben nix taugen - aber manchmal . . . . Deprimierend ist es, dass ich daran merke, wie langsam ich dazulerne :( :(

@schilly. Was ich schon immer fragen wollte: Ist die offene Encodescheibe nicht zuuu exponiert und dadurch staubanfällig und durch Kratzer gefährdet? Wieso sieht in Deiner Bildergalerie zu Roby 2.0 im vierten Bild von oben das Rad nicht wirklich fluchtend mit der Welle aus??

Bammel
17.01.2010, 12:47
Freut mich das dir das geholfen hat ;-)

Freu mich schon ein paar bewegte Bilder zu sehen ;-)

schilly
17.01.2010, 13:09
Hallo Bammel,


Freut mich das dir das geholfen hat ;-)

Freu mich schon ein paar bewegte Bilder zu sehen ;-)

damit kann ich dienen .. Roby Version 1.0.. http://www.youtube.com/results?search_query=schilly9000&search_type=&aq=f Version 2.0 (siehe Bild oben) kommt nach...

Gruß Schilly

Bammel
17.01.2010, 13:25
UI...

schick schick.. udn er fährt ja echt super genau!
aber vedammt laut der kleine?! ist dass das kleine chassis von robotikhardware?

schilly
17.01.2010, 13:52
Hallo Bammel,

UI...

schick schick.. udn er fährt ja echt super genau!
aber vedammt laut der kleine?! ist dass das kleine chassis von robotikhardware?

Ja, das ist von Robotikardware. Und das die so laut sind, habe ich aber in einigen Berichten gelesen. Das ist ok...

Genau ist natürlich relativ. Ich war auch der Meinung: x Sekunden link x Sekunden rechts würden total ausreichen, um meine Objekte zu greifen. Das klappt auch so ganz gut. Aber wie ich bei dem grossen Roboter gemerkt habe ist, das ich mit solchen Befehlen nicht weiterkomme. Darum bin ich auch relativ spät dazu gekommen die Motoren regeln zu wollen. Der Geradeauslauf ist (mit ein paar Anpassungen) recht ordentlich. Das ändert sich aber schnell, wenn man mal mit unterschiedlichen geschwindigkeiten arbeitet. Und die Encoder wollte ich ja nicht umsonst eingebaut haben...

Gruß Schilly

Bammel
17.01.2010, 14:15
Beim meinem WEIRDO arbeite ich ja mit mm ich möchte das Ganze dann noch so ausbauen wie in dem Buch bei dem THX-1 mit den Koordinaten und Winkel zur Null und Zielposition. Aber mit Ketten ist dies quasie unmöglich deshalb entwerfe ich z.Z. ein neues Chassis!

Aber genau Dies mit den Koordinaten ist doch geade zu perfekt für deine Bedürfnisse.

schilly
17.01.2010, 16:58
Hallo Oberallgeier

[quote=schilly]
@schilly. Was ich schon immer fragen wollte: Ist die offene Encodescheibe nicht zuuu exponiert und dadurch staubanfällig und durch Kratzer gefährdet?

http://www.schilly.net/typo3temp/pics/ee75b49f17.jpg

Bis jetzt fährt mein Roby nur in der Wohnung. Da ist es mit dem Schmutz nicht so weit her.. Na, wenn das meine Frau hören könnte :-)
Aber Du siehst auf dem Bild, das da schon ein paar Fussel landen könnten. Ich habe mir auch schon darüber gedanken gemacht. Eine Losung für mich habe ich schon gefunden. Mal schauen ob sie auch praktikabel ist. Ich habe an unserer Tür einen "Windschutz" angebracht. So eine Leist mit "Haren" daran... Die war zu lang. Und als ich das abgeschnittene Teil in der Hand hatte, dachte ich mir, das könnte man prima anbringen. Ich möchte an der Stelle die Sensorik schützen.. Eine Art Käfig bzw. diese Schmutzfänger soll dabei helfen.


Wieso sieht in Deiner Bildergalerie zu Roby 2.0 im vierten Bild von oben das Rad nicht wirklich fluchtend mit der Welle aus??
Ui.. da sprichste was an... Ich habe mir von Conrad eine Drehmitgeber gekauft. der Macht aus 6mm 4mm (ist wohl so eine Art Poti/schalterhalterung gewesen. Die 4mm Gewindestange habe ich mit einem 1 mm Bohrer (Feihand) quer zur Achse durchlöchert... Waren ein paar versuche nötig. Dort konte ich mit diesem beigefügten Bolzen die 6 Kant-Drehmitgeber anbringen. Darauf das Rad mit einer Mutter gekontert... Ich werde das alles Dokumentieren.. aber ich glaube, Ihr wisst worauf ich hinauswill..
Für mich ist der Geradeauslauf ok. Und da mir die Räder eh zu klein sind, werde ich beim tauschen der Räder (ich möchte da mehr höhe gewinnen, da die durchgeschnittenen Überraschungsplastikeier unten über den Boden schleifen bzw. durch Möbelräder ersetzen) hoffentlich Höhe gewinnen.
Kurz gesagt... Das Eiert schon rum.. Aber erst mal zu vernachlässigen.. Mir ist klar, das Regelkreise sowas nicht gerne mögen... ;-)

Gruß Schilly[/img]

Bammel
02.02.2010, 16:05
Hi gibt es von dir was neues? funktioniert die regelung nun?

schilly
03.02.2010, 12:57
Hi gibt es von dir was neues? funktioniert die regelung nun?

Hallo Bammel,

ja, seit ca. 3-4 Tagen hab ich es am laufen. Ich möchte alles auch schön dokumentieren. Man sieht sehr schön, wie der Regler den Geradeauslauf regelt. schwangt minimal.. aber dadurch sehe ich sehr gut wie es funktioniert.

Ich hab mich noch nicht gemeldet, weil ich überhaupt nicht mit dem Timer1 klarkomme.

ich sende heute abend mal die 3 Zeilen rein.. Aber beim duchlaufen einer Zählschleife von 1-1023 verhält sich der Motor überhaupt nicht so, wie gewünscht. Ich habe jetzt mehrere Tage im Netz gesuch und ich mach wohl einen Fehler in den PWM Settings...

Ich nutze einen ATMEGA88 mit eine 16Mhz quarz... Register angeschaut und direkt gesetzt. Über Baskom... auch... aber irgendwas ist falsch...

bis heute abend...

Gruß Schilly

schilly
03.02.2010, 19:46
Hallo,

wie angedroht, gebe ich mal hier einen Status:
Der PID Regler regelt. Das sieht für mich (ich hab hier noch keine Werte an den PID Parametern vorgenommen) total gut aus...

Was nicht funktioniert wie erwartet hat mit dem PWM Timer1 zu tun. Ich habe schon eine Menge gelesen, leider reicht es noch nicht...

Was ich möchte:
0 - 1023 geschwindigkeit der Motoren regeln.
512 soll stopp sein.

Was er bisher macht:

auweia: alo geschätzt von 0 total schnell bit ca. 200 dan langsamer und dann ab 350 wieder schneller... und dann ganz komisch bis hoch nach 1023.

Woran es liegen könnte:
Ich habe viel gelesen, aber ich glaube die 10 bit Auflösung kommt nicht bei mir an, weil ich die Register dafür falsch setze.

Ich denke die Bespiele passen nicht zu meinem Atmega88... Aber die Doku des AVR muss ich mir wohl noch genauer anschauen. Thema Register...

Ich nutze den Atmega88 mit extenen 16Mhz Quarz.. Ohne Teiler....


Das hier funktioniert... aber ich möchte ja Werte twichen 0-1023.. Wenn ich aber PWM = 10 angebe, habe ich in meiner hochzählschleife nicht die oben erwarteten Ergebnisse.

Config Timer1 = Pwm , Pwm = 9 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down
Pwm1a = 0
Pwm1b = 0
Tccr1b = Tccr1b Or &H02 '-> = Prescaler 8... aber brauch ich das?

Was ich nicht wirklich verstehe: Was mach "Or $H02" ?

Wenn ich das hier so nutze Teiler = 8 PWM = 1951 HZ bei 9 bit und dann 10 bit einstelle bringt mich das leider auch nicht weiter.

Tccr1a = &B10100010
Tccr1b = &B10000010

hmm... wie gesagt ein Zwischenstatus... Aber ist schon doll das Teil geradeaus laufen zu lassen... cool...

Gruß Schilly

Che Guevara
03.02.2010, 20:33
Hallo Schilly,

das mit dem


Tccr1b = Tccr1b Or &H02

hab ich auch nie richtig verstanden. Du kannst aber einfach schreiben:


Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescaler = 8

Sieh dir doch mal die PWM-Signale mitm Oszi an (falls vorhanden). Vielleicht pfuscht dir ja da irgendwas dazwischen, weswegen das Signal verkrümmt wird. Nur so eine Idee, aber mein Oszi hat mir schon oft geholfen!

Ansonsten gefällt mir dein Projekt sehr gut :-)
Wäre nett, wenn du noch den funktionierenden PID-Code posten könntest.

Gruß
Chris

i_make_it
04.02.2010, 17:51
&D = Dezimale Notation (wird in der Regel weggelassen)

&H = Hexadezimale Notation

&B = Binäre Notation

Im Falle des Codeschnipsels

Tccr1b = Tccr1b Or &H02

Wird also das "Timer/Counter1 Control Register B – TCCR1B" verändert, in dem seine bisherige
Einstellung mit dem Wert &H02 verodert wird.

Das Ergebniss ist, das unabhängig von allen anderen Bits das Bit2,
also das mittlere Bit also CS11 von Clock Select gesetzt wird.
------------------Seite 110 unten---------
Bit 2:0 – CS12:0: Clock Select
The three Clock Select bits select the clock source to be used by the Timer/Counter, see Figure
49 and Figure 50.

clkI/O/8 (From prescaler)
------------------------------------------
http://www.atmel.com/dyn/resources/prod_documents/doc2503.pdf

Das ist der einfachste Weg einzelne Bits zu setzen unabhängig
davon wie die anderen Bits aussehen und ohne diese in irgendeiner Form zu beeinflussen.

Bsp. OR:
Register----11011001
Modifikator-00101010
--------------------
Ergebniss---11111011

Gemäs der boolschen Schaltalgebra wird der Ausgang 1 sobald mindestens ein Eingang 1 ist.
Im Gegensatz um Exklusiv ODER wo der Ausgang nur 1 wird wenn nur einer der Eingänge 1 ist

Bsp. XOR:
Register----11011001
Modifikator-00101010
--------------------
Ergebniss---11110011

Bei einer verundung (AND) sieht das dann so aus.

Bsp. AND:
Register----11011001
Modifikator-00101010
--------------------
Ergebniss---00001000

Mit NOR kann man dann Bits setzen wenn sie nicht gesetzt sind.
Bsp. NOR:
Register----11011001
Modifikator-00101010
--------------------
Ergebniss---00000100


Mit NAND kann man dann Bits selektiv wieder löschen.
Bsp. NAND:
Register----11011001
Modifikator-00101010
--------------------
Ergebniss---11110111


Bsp.:
Tccr1b = Tccr1b Or &H02

Register----11011001
Modifikator-00000010
--------------------
Ergebniss---11011011


Tccr1b = Tccr1b nand &H02
Register----11011011
Modifikator-00000010
--------------------
Ergebniss---11011001

schilly
07.02.2010, 16:45
Hallo,

vielen Dank erst mal für Eure Hilfe. Das setzen der Register ist mir jetzt völlig klar.
Leider ist das aber auch schon die einzig Gute neue Nachricht. Ich hab das Gefühl, ich verstehe immer weniger.
Die PID Regelung habe ich mal her rausgenommen (im Code siehe ein paar Antworten früher) und habe einen Zählerschleife im Werteberich zwischen 0-1023 durchlaufen lassen. Und siehe da, der Motor beschleunigt sauber von 0 -1023 ohne eine bestimmte Wertelücke. Verändere ich aber die Settings für den Timer1, bekomme ich eine Lück bzw. kommt das typische pfeifen. Ich muss mir noch mal genauer anschauen, was der Motor nun wirklich an PWM erwartet...
Sobald ich den PID Regler wieder reinnehme, bekomme ich keinen sauberen Wertebereich für die Regelung. Ich hatte ja mal einen Wert (Motor_l = 400) eingetragen und das passte noch zufällig ganz gut. Aber nicht für den ganzen Wertebereich. Ich habe mir im Display die zu grundlegenden Steuerbefehle z.B. (Motor_l = 550) die dazugehörenden Fahrtbefehle nach der PID Regelung ausgeben lassen... Das passt aus meiner Sicht auch nicht wirklich, denn speed_r (ist die Variable. die dann für PWM1a übergeben wird das doppelte von Motor_l sein soll.. Hm.. wie kommt man hier auf den Faktor 2 bzw. die Verdopplung?
Speed_l = Motor_l * 2
Na, ich werde mal die Probleme versuchen in Ihre einzelbestandteile zu zerlegen. Aber derzeit geht nicht wirklich was...
Ich versuch mal meine Fragen hier noch mal anzubringen, wo ich denke dass hier der Fehler liegen könnte.

1. Was ist die ideale RB35 Motor Config Timer1 Einstellung?
PWM = 10 klaro... 0-1023 aber hat ich muss mit die Auswirkungen auf mein System bei Änderung der Teilers klarmachen. Hat das Auswirkungen auf das Motorverhalten.

2. Warum ist ausgerechnet die Verdoppelung hier das Ergebnis? Speed_l = Motor_l * 2
Hängt wahrscheinlich mit der Regelung zusammen?

3. Unterschiede zwischen den Code für einen Atmega32 und meiner Atmega88 Umgebung.. Da werde ich mit dir Register noch mal genauer anschauen und vergleichen. Datenblatt. Vielleicht mal die Werte direkt setzen.

4. Mit schwirrt auch folgendes im Kopf rum: Ich meine doch schon längst mal auch einen Motor zwischen 0-1023 laufen gehabt zu haben, der bei 512 auf 0 Umdrehungen geht, und die Maxima bei u und 1023 hat. Das bekomme ich auch nicht wirklich mehr hin. (Hatte ich aber eigentlich schon… aber kann auch sein, dass ich das mit Servos nur hinbekommen habe... Und das hängt natürlich an den PWM Definitionen... Das werde ich glaube ich als erstes angehen...

Naja... nach vielen Stunden, bin ich jetzt erst mal platt. Wird hoffentlich noch was werden.

Gruß Schilly

Bammel
07.02.2010, 17:50
Ich würde sagen man sollte das ganze nochmal völlig von vorne angehen!

Erstmal wie sieht deine Hardware aus!? und der jetzige code dazu?

Ichw eiß noch das meine motoren bei einer zu hohen pwm frequenz anfingen zu pfeifen.

schilly
03.03.2010, 10:34
Hallo Bammel

Ich würde sagen man sollte das ganze nochmal völlig von vorne angehen!

JA, der Tip hat geholfen. Ich habe einfach völlig übersehen, das für diese Lösung:

PWM 0 MAX vor
PWM 513 Motor stopp
MWM 1023 MAX zurück

ein inverse von PWM notwendig ist und das z.B. ein C-MOS IC 4093 (den ich glücklicherweise hier noch liegen habe) ein Lösung darstellen kann.

siehe:


PWM an Input 1, inverse von PWM an Input 2, enable immer auf high.
Brauchts du nur 1 µpin + inverter. Auf diese Weise gibt 50% PWM speed 0, 0% PWM ist full speed forward, 100% ist full speed backward.

Ich habe wirklich viel gelesen, aber da ist das centstück einfach erst sehr spät gefallen.

Ich habe alles soweit auf einem Steckboard aufgebaut. Den eigendlichen Test werde ich heute hoffentlich duchführen können. Hier ein Link, der das noch einmal zeigt... http://www.elo-web.de/elo/mikrocontroller-und-programmierung/avr-anwendungen/drehzahlsteuerung-mit-dem-attiny13

Vielen Dank noch mal an alle...

[highlight=red:758ed88ade] JA ES FUNKTIONIERT AUCH BEI MIR[/highlight:758ed88ade] :-)

Doumentation folgt!

Gruß Schilly