Hallo
Ich habe ein Problem in meinem Bascom code den ich nicht finde.
Es zeigt sich so - Das Programm lässt sich ohne Fehler umwandeln . In
der Praktischen Anwendung funktioniert es nicht ganz so wie es soll .
Hab da wohl einen Denkfehler drinne.
Es geht eigentlich darum einen wert über adc einzulesen mit einem
anderen Wert abzugleichen (Soll-istwert) das Ergebnis als PWM
weiterzugeben um einen Motor anzusteuern . Quasi Drehrichtung und
Geschwindigkeit .
Nur liegt das Problem darin das die eine Drehrichtung direkt und
dauerhaft Geschalten wird. Die andere Drehrichtung schaltet sich wie
gewollt zu aber auch nimmer ab - Ergebnis ist dann ein defekter
Motortreiber .Hoffe ihr habt eine Idee oder einen guten Tip.
Hier mal der Code:
'Reg für controller
$regfile = "M32def.dat"
'festlegen Quarzfrequenz
$crystal = 1000000
$framesize = 32
$swstack = 32
$hwstack = 32
'Eingänge und Ausgänge konfigurieren
'port Motor rechts
Config Portd.2 = Output
'port Motor links
Config Portd.3 = Output
'weitere Ports
Config Portd.4 = Output
Config Portd.5 = Output
Config Portd.6 = Output
'config timer 1 als Pwm ausgang
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Up , Compare B
Pwm = Clear Up , Prescale = 1
'ADC um Grundstellung und iststellung feststellen
Config Adc = Single , Prescaler = Auto , Reference = Aref
Start Adc
Start Timer1
'Variablen zur festlegung von Soll und Istwert
Dim Grundstellung As Integer
Dim Iststellung As Integer
Dim Grundstellung_kleiner As Integer
Dim Grundstellung_groesser As Integer
Dim Grund1 As Integer
Dim Grund2 As Integer
Dim Grund3 As Integer
Dim Grund4 As Integer
Dim Ist1 As Integer
Dim Ist2 As Integer
Dim Ist3 As Integer
Dim Ist4 As Integer
Dim E As Integer
Dim F As Integer
Dim H As Integer
'pd-regler
Dim P As Integer
Dim D As Integer
Dim Kp As Integer
Dim Kd As Integer
Dim Pd As Integer
Dim Pd_word As Word
Dim Error As Integer
Dim Errorlast As Integer
'initialisierung Festlegen der Grundstellung
Grund1 = Getadc(0)
Grund2 = Getadc(0)
Grund3 = Getadc(0)
Grund4 = Getadc(0)
'ermitteln grundstellung
E = Grund1 + Grund2
E = E + Grund3
E = E + Grund4
Grundstellung = E / 4
Grundstellung_kleiner = Grundstellung - 5
Grundstellung_groesser = Grundstellung + 5
'stellwerte pd regler für pwm wert
Kp = 2.5
Kd = 2.8
'hauptprogramm
Do
'ermitteln iststellung
Ist1 = Getadc(0)
Ist2 = Getadc(0)
Ist3 = Getadc(0)
Ist4 = Getadc(0)
H = Ist1 + Ist2
H = H + Ist3
H = H + Ist4
Iststellung = H / 4
'Schwungrad recht drehen
If Grundstellung_kleiner > Iststellung Then
Gosub Pd_rechts
End If
'schwungrad links drehen
If Grundstellung_groesser < Iststellung Then
Gosub Pd_links
End If
Loop
Pd_rechts:
'fehlerdifferenz feststellen
Error = Grundstellung - Iststellung
'fehlerdifferenz mit p-faktor multiplizieren
P = Error
P = P * 1.7
'fehlerdifferenz mit vorhergehendem Fehler
D = Error - Errorlast
D = D * 1.3
Pd = P + D
Pd_word = Pd
Errorlast = Error
'pwm nicht unter 0
If Pd_word < 0 Then Pd_word = 0
'pwm = pd wert
Compare1b = Pd_word
Enable Timer1
'Motorport rechts
Portd.3 = 0
Portd.2 = 1
Waitms 3
Disable Timer1
Portd.2 = 0
Return
Pd_links:
'fehlerdifferenz feststellen
Error = Iststellung - Grundstellung
'Fehlen mit kp multiplizieren
P = Error
P = P * 1.7
'Fehler mit kd Faktor multiplizieren
D = Error - Errorlast
D = D * 1.3
Pd = P + D
Pd_word = Pd
Errorlast = Error
'pwm nicht über 1023 = 10 Bit
If Pd_word > 1023 Then Pd_word = 1023
'pwm = pd wert
Compare1b = Pd_word
Enable Timer1
'motorport links
Portd.2 = 0
Portd.3 = 1
Waitms 3
Disable Timer1
Portd.3 = 0
Return
End
Gruß Chris
Frag doch mal die Bascom-Hilfe, was passiert, wenn man Integer-Variablen mit gebrochenen Konstanten verrechnet. Und schau Dir auch mal an, wie man viele Dinge auch ohne Fließkommazahlen erledigen kann: festkommaarithmetik ...
D = Error - Errorlast D = D * 1.3 ... das mag bascom nicht nimm dafür eine temporäre variable. also Dtemp = Error - Errorlast D = Dtemp * 1.3 no body is perfect!
zipp schrieb: > D = Error - Errorlast > D = D * 1.3 > > ... das mag bascom nicht > nimm dafür eine temporäre variable. also > Dtemp = Error - Errorlast > D = Dtemp * 1.3 > > no body is perfect! vergiss das ganz schnell, war im falschen compiler...
Hallo . Erstmal danke für die Antworten . Leider bringen die mich im Moment nicht weiter . Werde mich jetzt erstmal um die Fließkommazahlen zu kümmern. gruß Christian
SO ... Hab das mit den Drehrichtungen hin bekommen. Allerdings Will mein PWM in die eine Drehrichtung nicht so wie in die andere . Das heißt der Spannungswert sollte links und rechts gleichgroß sein (bei gleichem Winkel) liegt aber 30% drunter ... woran kann das denn liegen ?? gruß christian
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.