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.