Leider hab ich keine Seite und bei Youtube hab ich schon ewig nix hochgeladen. An sich wär das aber was, was ich mal gebrauchen könnte. Aber erstmal egal.
Hmm, wenn du mit dem Code was anfangen kannst ... ist in Bascom geschrieben 
Code:
$regfile = "m32def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 16000000
$baud = 9600
Declare Sub Serial0charmatch()
Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 1 , Clockrate = 128
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up , Prescale = 1
Config Timer0 = Timer , Prescale = 1024
On Timer0 Isr0
Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , _
Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
Config Lcd = 20 * 4
Cursor Off
Cls
Config Porta.0 = Input
Config Porta.1 = Output
Config Porta.2 = Output
Config Portb.3 = Output
Portb.3 = 1
Spiinit
Config Serialin = Buffered , Size = 30 , Bytematch = 13
Dim Incoming_str As String * 4
Dim Angle As Integer
Dim Angle_vor As Integer
Dim Angle_low As Byte At Angle Overlay
Dim Angle_high As Byte At Angle + 1 Overlay
Dim Anglereg(2) As Byte
Dim Errorreg(2) As Byte
Dim Adcwert As Long
Dim Tast As Integer
Dim Temp As Long
Dim E As Long
Dim E_vor As Long
Dim E_int As Long
Dim De As Long
Dim Count As Byte
Dim Pos As Long
Dim Turns As Integer
Turns = 0
E_vor = 0
E_int = 0
De = 0
Count = 0
Anglereg(1) = &HFF
Anglereg(2) = &HFF
Errorreg(1) = &H40
Errorreg(2) = &H01
Wait 1
Porta.1 = 1
Porta.2 = 1
Portb.3 = 0
Waitus 10
'Angle_high = Spimove(errorreg(1) , 1)
'Angle_low = Spimove(errorreg(2) , 1)
'Waitus 10
Angle_high = Spimove(anglereg(1) , 1)
Angle_low = Spimove(anglereg(2) , 1)
Waitus 10
Portb.3 = 1
Angle_high = Angle_high And &B00111111
Adcwert = Angle
Enable Interrupts
Enable Timer0
Waitms 500
Do
Count = Count + 1
If Count = 20 Then
Count = 0
If Adcwert = 1000 Then
Adcwert = 17384
Else
Adcwert = 1000
End If
End If
Cls
Locate 1 , 1
Lcd Angle 'anzeigen Istwinkel
Locate 2 , 1
Lcd Adcwert 'anzeigen Sollwinkel
Locate 2 , 10
Lcd E
Locate 1 , 10
Lcd E_int
Locate 3 , 1
Lcd Tast 'anzeigen PWM-Wert
Locate 4 , 10
Lcd Pos
Locate 4 , 1
Lcd Turns
Waitms 100
Loop
Sub Serial0charmatch()
Input Incoming_str Noecho
Print Angle
End Sub
Isr0:
Load Timer0 , 30
Portb.3 = 0
Waitus 5
Angle_high = Spimove(anglereg(1) , 1)
Angle_low = Spimove(anglereg(2) , 1)
Waitus 5
Portb.3 = 1
Angle_high = Angle_high And &B00111111
Temp = Angle - Angle_vor
If Temp < -8192 Then
Turns = Turns + 1
Elseif Temp > 8192 Then
Turns = Turns - 1
End If
Pos = 16384 * Turns
Pos = Pos + Angle
Angle_vor = Angle
' Start Adc
' Adcwert = Getadc(0)
' Adcwert = Adcwert * 16
E = Adcwert - Pos
De = E - E_vor
If De > 400 Then
De = 400
Elseif De < -400 Then
De = -400
End If
E_vor = E
Tast = E * 2
Temp = E_int / 128
Tast = Tast + Temp
Temp = De * 40
Tast = Tast + Temp
If Tast > 0 Then
Porta.1 = 1
Porta.2 = 0
Else
Porta.1 = 0
Porta.2 = 1
End If
Tast = Abs(tast)
Tast = Tast + 400
If Tast > 1023 Then
Tast = 1023
Else
E_int = E_int + E
End If
Compare1a = Tast
Return
Die Probleme, die ich da derzeit habe, hat mit der Größe der Zahlen zu tun. Der Sensor gibt wie gesagt 14 Bit aus, mit Integer kann ich also gerade einmal 4 Umdrehungen abdecken (wobei das je nach Anwendung auch schon reichen kann). Nagut, wöllte ich die Auflösung nicht nutzen, könnte ich ganz leicht mittels Bitshift auf weniger Bit runterskalieren, aber ich wills ja gerne so präzise wie möglich. Jedenfalls hab ich damit erst recht Probleme beim Integrator, da dieser ja in jedem Reglertakt die Abweichung aufaddiert. Bei einem relativ großen Sprung kommt da wirklich viel zusammen und wenn man dann versucht, mit diesem riesigen Wert weiterzurechnen, bekommt man erst recht Probleme. Da verschwinden dann gerne mal Bits und der Regler dreht durch. Hatte zwischendurch schon paar Mal Versionen gehabt, da hat der Motor nicht aufgehört zu drehen. Jedenfalls ist mein nächster Schritt, mal eine vernünftige Kommunikation mit dem Rechner dazu zu basteln, um dann mal den Motor ordentlich modellieren und simulieren zu können. Ich arbeite bei Regelungstechnik doch lieber mit Übertragungsfunktionen, als nur herum zu probieren. Bei meinem letzten Experiment hatte die Verwendung einer Vorsteuerung schon eine enorme Verbesserung gebracht. Die sorgt nämlich dafür, dass der Motor hauptsächlich den Sollwerten entsprechend so angesteuert wird, dass er schon ohne Regelung etwa die Sollbahn abfahren würde. Dann braucht der Regler nur noch die dabei auftretende Abweichung ausregeln.
Lesezeichen