PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : H-Brücke mit PWM



Gobstar
21.09.2005, 10:28
Hi Leute, ich habe vor kurzem erfolgreiche meine H-brücke aufgebaut und die auch schon geproggt..das Anfangsprogramm war jedoch relativ simpel und das hoch und runterzählen der PWM hat der hauptprozzi. Ich hab es so programmiert, dass ich über eine Softwareserielle immer einen wert schick (2 räder, 2 brücken, 2 serielle)
-1023 bis -1= pwm links, 0=stopp,1 bis 1023 pwm rechts, dass sie die werte die ich vom hauptprozzi schick.
Jetzt will ich allerdings nicht mehr vom hauptprozzi aus anfahren und abbremsen lassen, sonder will das die brücke übernehmen lassen, doch bisher hab ich es nicht gebacken gekriegt, wer kann mir helfen?
( Hauptprozzi M16, Brücke M8 )
Hier mal das vorherige Programm und den einenregelungsversuch


$regfile = "m8def.dat"
$crystal = 16000000
$baud = 19200

Config Pinb.1 = Output
Config Pinb.2 = Output

Config Pind.5 = Output
Config Pind.6 = Output
Config Pind.7 = Output
Enable Interrupts

Dim A As Word
Dim I As Integer

Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 8
Open "Comc.3:19200,8,n,1" For Input As #1




Do
Portd.6 = 1
Portd.7 = 1

Input #1 , I
Print I
Select Case I
Case Is > 0 : Gosub Rechts
Case 0 : Gosub Stopp
Case Is < 0 : Gosub Links
End Select
Loop


Links:
A = I * -1
Pwm1a = 0
Pwm1b = A
Return

Rechts:
Pwm1a = I
Pwm1b = 0
Return

Stopp:
Pwm1a = 0
Pwm1b = 0
Return


End

Nicht funktionierende Eigenregelung:


$regfile = "m8def.dat"
$crystal = 16000000
$baud = 19200

Config Pinb.1 = Output
Config Pinb.2 = Output

Config Pind.5 = Output
Config Pind.6 = Output
Config Pind.7 = Output
Enable Interrupts

Dim A As Word
Dim I As Integer
Dim L As Integer
Dim R As Integer
Dim R1 As Integer
Dim S1 As Integer
Dim S2 As Integer

Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Compare B Pwm = Clear Down , Prescale = 8
Open "Comc.3:19200,8,n,1" For Input As #1

Portd.6 = 1
Portd.7 = 1

Do

I = Inkey(#1)
Select Case I
Case Is > 0 : Gosub Rechts
Case 0 : Gosub Stopp
Case Is < 0 : Gosub Links
End Select
Loop


Links:
A = I * -1
If R > 0 Then
For R1 = R To 0 Step -25
Pwm1a = R1
Pwm1b = 0
Next
End If
If L < 1 Then
For L = 0 To A Step 25
Pwm1b = L
Pwm1a = 0
Next
End If
Pwm1b = A
Pwm1a = 0
Return

Rechts:
If A > 0 Then
For L = A To 0 Step -25
Pwm1b = L
Pwm1a = 0
Next
End If
If R < 1 Then
For R = 0 To I Step 25
Pwm1a = R
Pwm1b = 0
Next
End If
Pwm1a = I
Return

Stopp:
If A > 0 Then
For S1 = A To 0 Step -50
Pwm1b = S1
Pwm1a = 0
Next
End If
If R > 0 Then
For S2 = R To 0 Step -50
Pwm1a = S2
Pwm1b = 0
Next
End If

Return


End

Vielleicht steh ich ja auch auf der leitung oder man kann es viel einfacher machen..bitte helft mir, bin halt nicht der progger vor dem herren..


Gruss Gobstar

21.09.2005, 16:04
hmm so beim durchsehen hab ich mich gefragt: wenn der proz z.b. in die "stop-funktion" springt woher weiss der dann was "A" ist dieser wert wird nur in der "Links"- Sache gesetzt und davor nicht.
auch bei den anderen sachen wie R,L usw ist am anfang kein wert zugeordnet.
versuch am anfang vor der "do-loop" sache diesen variablen einen wert zu geben z.b.:
A=0
L=0
...

vielleicht sieht jemand anderes noch ebs und kann mal was dazuschreiben

CU

21.09.2005, 17:49
Jo, hatt ich auch schon drin, dachte halt dass der Wert eh anfangs vll. als 0 definiert ist..aber auch wenn ich es vorher angebe, funzt es nicht, leider


Gruss Stefan

Felixx87
21.09.2005, 18:48
ich hab zwar keinen schimmer vom Programmieren aber warum hast du die wenn dann sache im nicht wieder nach obe gegeben?

vl. ist der affe dort begraben? also das das ding nicht weiß was er machen soll wenn die IF Clause unerfüllt iss ???