Forum: Mikrocontroller und Digitale Elektronik Problem Bascom code


von Chriz80 (Gast)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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

...

von zipp (Gast)


Lesenswert?

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!

von zipp (Gast)


Lesenswert?

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...

von Chriz80 (Gast)


Lesenswert?

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

von Chriz80 (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.