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







Zitieren

Lesezeichen