Hallo.
Beim Aufräumen fand ich heute meinen Foucault-Tester wieder und den möchte ich gerne mal näher vorstellen.
Ich hatte damals den Einfall, einen Messschlitten über eine Feingewindestange mit einem Schrittmotor anzutreiben und die gefahrene Strecke nicht mit einer Messuhr, sondern mit einem Microcontroller auszuwerten und die zweite Version, mit der ich meinen 12-Zöller parabolisiert habe, zeige ich hier.
Ich weiss nicht, ob es jemanden interessiert: Das wäre das Programm dazu, das ich damals geschrieben habe:
'******************* PROGRAMM FOUCAULT-TESTER V2.1 *****************************
' ATMEL 89S8252 74HC540 ULN 2803
' von G.H. / Version 2.0 / 13. 01. 2006
'======================== Programmbeschreibung =================================
'FOUCAULT - TESTER für den Newton-Teleskop-Spiegelschliff.
'Messung der Schnittweitendifferenz mit einem Stepper , Schrittweite 3.6° in
'Verbindung mit einem selbstgebauten Mess-Schlitten , der mit einer
'M6-Feingewindestange bewegt wird.(1 Umdrehung = 0.5 mm)
'LCD - Zeile 1 zeigt die Bewegungsrichtung des Steppers , bzw. den Status nach
'dem Loslassen der Links- oder Rechtstaste an.
'LCD - Zeile 2 zeigt die Differenz in mm vom Krümmungsmittelpunkt aus an.
'Die Speed-Taste dient in Verbindung mit der Rechts- oder Linkstaste zur
'Grobeinstellung der Mess-Strecke.
'Verwendet wird ein Stepper Howard Ind. P/N 1-19-4202 , baugleich mit JAMECO
'SM4202 , unipolar , 12V , 150mA. green = P2.2 , white = P2.3 , brown = P2.4
'red = P2.5 , black = common.
'A=white , B=red, A- = green , B- = brown
'Schrittschema für Rechtslauf:
'step1 = A + B , step2 = B + A- , step3 = A- + B- , step4 = A + B-
'================== verfügbare Tasten und Optionen =============================
'Links-Lauf-Taste
'Rechts-Lauf-Taste
'Schnell-Lauf-Taste
'Reset-Taste
'Rechts- und Linkstaste gleichzeitig gedrückt, bewirken ebenfalls ein Reset
'Auto-Reset-Taste : automatische Rückkehr zur Startposition
'Ausgabe der Schrittanzahl über RS232 (z.B. an Hyperterminal / Baudrate 9600)
'============================= Controller ======================================
$large
$regfile = "89s8252.dat" 'verwendeter Controller (ATMEL 8051)
$crystal = 11059200 'Quarzfrequenz in Hertz (11.059 MHz)
'============================ LCD-Display ======================================
Config Lcdpin = Pin , Db4 = P1.4 , Db5 = P1.5 , Db6 = P1.6
Config Lcdpin = Pin , Db7 = P1.7 , E = P1.0 , Rs = P1.1
Config Lcd = 16 * 2 'verwendetes Display (hier:2 x 16 Characters)
'=========================== Tastenbelegung ====================================
Linkstaste Alias P0.0 'hier wird Port 0 für die Tasten verwendet
Rechtstaste Alias P0.2
Speed_taste Alias P0.1
Reset_taste Alias P0.3
Auto_reset Alias P0.4
'============================ Sonderzeichen ====================================
Deflcdchar 0 , 32 , 32 , 32 , 4 , 10 , 17 , 31 , 32 ' Delta
Deflcdchar 1 , 4 , 10 , 21 , 4 , 4 , 4 , 4 , 4 ' Vorlaufpfeil
Deflcdchar 2 , 4 , 4 , 4 , 4 , 4 , 21 , 10 , 4 ' Rücklaufpfeil
'============================== Integers =======================================
Dim Schrittanzahl As Integer
Dim X As Integer 'Schrittanzahl , formatiert für LCD
Dim Y As Integer
Dim Z As Integer
Dim Intervall_faktor As Integer 'Motorgeschwindigkeit
'=============================== Bytes =========================================
Dim Intervall As Byte
Dim Lcd_blink As Byte
Dim Lcd_blink2 As Byte
'=============================== Bits ==========================================
Dim Schritt_1 As Bit
Dim Schritt_2 As Bit
Dim Schritt_3 As Bit 'Zeitflags
Dim Schritt_4 As Bit
Dim Wechsel As Bit 'LCD - Blinken des Richtungspfeiles bei Autoreset
Dim Wechsel2 As Bit
'========================== Timer0 konfigurieren ===============================
Config Timer0 = Timer , Gate = Internal , Mode = 1 '16-Bit Modus
On Timer0 Timer_0_int
Enable Timer0
Enable Interrupts
Priority Set Timer0
'========================== Initialisierung ===================================
Schritt_1 = 0 : Schritt_2 = 0 : Schritt_3 = 0 : Schritt_4 = 0
Schrittanzahl = 0 : Intervall = 0
Linkstaste = 1 : Rechtstaste = 1 : Speed_taste = 1 : Reset_taste = 1
Auto_reset = 1
X = 0 : Y = 0
Cls
Cursor Off 'Cursor unterdrücken
Set P2.2 : Set P2.3 : Set P2.4 : Set P2.5
Locate 1 , 1
Lcd "startposition "
Gosub Ausgabe 'Anzeigen der Grundposition beim Einschalten
'=========================== Hauptprogramm =====================================
Do
'................... Geschwindigkeitseinstellung ...............................
If Speed_taste = 0 Then
Intervall_faktor = &HFA00 '11111010 00000000
Else
Intervall_faktor = &H61A8 '01100001 10101000
End If
'....................letzten Schritt "speichern"................................
If Rechtstaste = 1 And Linkstaste = 1 Then
Stop Timer0
Set P2.2 : Set P2.3 : Set P2.4 : Set P2.5
End If
'.......................... Rechtslauf .........................................
If Rechtstaste = 0 Then 'Mess-Schlitten läuft vorwärts
Start Timer0
If Schrittanzahl = 0 Then
Locate 1 , 1
Lcd "startposition "
Else
Locate 1 , 1
Lcd "direction: " ; Chr(1) ; " "
End If
If Schritt_1 = 1 Then
Reset P2.2 : Set P2.3 : Set P2.4 : Reset P2.5 '1
Incr Schrittanzahl : Gosub Ausgabe
Reset Schritt_1
End If
If Schritt_2 = 1 Then
Set P2.2 : Reset P2.3 : Set P2.4 : Reset P2.5 '2
Incr Schrittanzahl : Gosub Ausgabe
Reset Schritt_2
End If
If Schritt_3 = 1 Then
Set P2.2 : Reset P2.3 : Reset P2.4 : Set P2.5 '3
Incr Schrittanzahl : Gosub Ausgabe
Reset Schritt_3
End If
If Schritt_4 = 1 Then
Reset P2.2 : Set P2.3 : Reset P2.4 : Set P2.5 '4
Incr Schrittanzahl : Gosub Ausgabe
Reset Schritt_4
End If
End If 'Vorlauf
'.......................... Linkslauf ..........................................
If Linkstaste = 0 Then 'Mess-Schlitten läuft rückwärts
Start Timer0
If Schrittanzahl = 0 Then
Locate 1 , 1
Lcd "startposition "
Else
Locate 1 , 1
Lcd "direction: " ; Chr(2) ; " "
End If
If Schritt_1 = 1 Then
Reset P2.2 : Set P2.3 : Reset P2.4 : Set P2.5 '4
Decr Schrittanzahl : Gosub Ausgabe
Reset Schritt_1
End If
If Schritt_2 = 1 Then
Set P2.2 : Reset P2.3 : Reset P2.4 : Set P2.5 '3
Decr Schrittanzahl : Gosub Ausgabe
Reset Schritt_2
End If
If Schritt_3 = 1 Then
Set P2.2 : Reset P2.3 : Set P2.4 : Reset P2.5 '2
Decr Schrittanzahl : Gosub Ausgabe
Reset Schritt_3
End If
If Schritt_4 = 1 Then
Reset P2.2 : Set P2.3 : Set P2.4 : Reset P2.5 '1
Decr Schrittanzahl : Gosub Ausgabe
Reset Schritt_4
End If
End If 'Rücklauf
'............................... Auto-Reset ....................................
If Auto_reset = 0 And Schrittanzahl <= 0 Then 'Zurück zur Startposition
Start Timer0
Intervall_faktor = &HFA00 'Stepper schnell
Do
If Wechsel = 1 Then 'blinkender Richtungspfeil
Locate 1 , 1
Lcd "auto-reset "
Reset Wechsel
End If
If Wechsel2 = 1 Then
Locate 1 , 1
Lcd "auto-reset " ; Chr(1) ; " "
Reset Wechsel2
End If
If Schritt_1 = 1 Then
Reset P2.2 : Set P2.3 : Set P2.4 : Reset P2.5 '1
Incr Schrittanzahl : Gosub Ausgabe
Reset Schritt_1
End If
If Schritt_2 = 1 Then
Set P2.2 : Reset P2.3 : Set P2.4 : Reset P2.5 '2
Incr Schrittanzahl : Gosub Ausgabe
Reset Schritt_2
End If
If Schritt_3 = 1 Then
Set P2.2 : Reset P2.3 : Reset P2.4 : Set P2.5 '3
Incr Schrittanzahl : Gosub Ausgabe
Reset Schritt_3
End If
If Schritt_4 = 1 Then
Reset P2.2 : Set P2.3 : Reset P2.4 : Set P2.5 '4
Incr Schrittanzahl : Gosub Ausgabe
Reset Schritt_4
End If
Loop Until Schrittanzahl = 0
Locate 1 , 1
Lcd "startposition "
Stop Timer0
Set P2.2 : Set P2.3 : Set P2.4 : Set P2.5
End If
If Auto_reset = 0 And Schrittanzahl => 0 Then 'Zurück zur Startposition
Start Timer0
Intervall_faktor = &HFA00
Do
If Wechsel = 1 Then 'blinkender Richtungspfeil
Locate 1 , 1
Lcd "auto-reset "
Reset Wechsel
End If
If Wechsel2 = 1 Then
Locate 1 , 1
Lcd "auto-reset " ; Chr(2) ; " "
Reset Wechsel2
End If
If Schritt_1 = 1 Then
Reset P2.2 : Set P2.3 : Reset P2.4 : Set P2.5 '4
Decr Schrittanzahl : Gosub Ausgabe
Reset Schritt_1
End If
If Schritt_2 = 1 Then
Set P2.2 : Reset P2.3 : Reset P2.4 : Set P2.5 '3
Decr Schrittanzahl : Gosub Ausgabe
Reset Schritt_2
End If
If Schritt_3 = 1 Then
Set P2.2 : Reset P2.3 : Set P2.4 : Reset P2.5 '2
Decr Schrittanzahl : Gosub Ausgabe
Reset Schritt_3
End If
If Schritt_4 = 1 Then
Reset P2.2 : Set P2.3 : Set P2.4 : Reset P2.5 '1
Decr Schrittanzahl : Gosub Ausgabe
Reset Schritt_4
End If
Loop Until Schrittanzahl = 0
Locate 1 , 1
Lcd "startposition "
Stop Timer0
Set P2.2 : Set P2.3 : Set P2.4 : Set P2.5
End If
'...................... Ausgangs-Position des Testers ...........................
If Reset_taste = 0 Then 'Ausgangspositon des Motors
Schrittanzahl = 0 'Messwert auf Null setzen
Locate 1 , 1
Lcd "startposition "
Gosub Ausgabe
Set P2.2 : Set P2.3 : Set P2.4 : Set P2.5 'alle Ausgänge auf high
End If
'................ Reset mit Links- und Rechtstaste (alternativ) ................
If Linkstaste = 0 And Rechtstaste = 0 Then
Set P2.2 : Set P2.3 : Set P2.4 : Set P2.5 'alle Ausgänge auf high
Schrittanzahl = 0 'Messwert auf Null setzen
Locate 1 , 1
Lcd "startposition "
End If
Loop
'======================== Hauptprogramm Ende ===================================
'......................LCD-Ausgabeformatierung .................................
Ausgabe:
X = Abs(schrittanzahl) / 2
Z = Abs(schrittanzahl) / 2
If Schrittanzahl < 0 Then
Locate 2 , 7
Lcd "-"
Else
Locate 2 , 7
Lcd " "
End If
Locate 2 , 1
Lcd Chr(0) ; "2f = "
If X < 10 Then 'LCD - Anzeige für Strecke unter 1/10mm Weg
Locate 2 , 8
Lcd "0.0" ; X ; " mm "
End If
If X > 9 And X < 100 Then 'LCD - Anzeige für Strecke über 1/10mm
Locate 2 , 8 'Weg unter 1mm
Lcd "0." ; X ; " mm "
End If
If X > 99 Then 'LCD - Anzeige für Strecke über 1mm Weg
X = X / 100
Y = Z Mod 100
If Y < 10 Then 'LCD-Anzeige für Weg unter 1/10mm (über 1mm Weg)
Locate 2 , 8
Lcd X ; ".0" ; Y ; " mm "
Else
Locate 2 , 8
Lcd X ; "." ; Y ; " mm "
End If
End If
Return
'........................ Interrupt - Routinen .................................
Timer_0_int:
Counter0 = Intervall_faktor 'Vorladewert für Timer0
Start Counter0
Incr Lcd_blink
Incr Intervall
If Intervall = 10 Then
Print Schrittanzahl 'Ausgabe über RS232
Set Schritt_1
End If
If Intervall = 20 Then
Print Schrittanzahl
Set Schritt_2
End If
If Intervall = 30 Then
Print Schrittanzahl
Set Schritt_3
End If
If Intervall = 40 Then
Print Schrittanzahl
Set Schritt_4
End If
If Intervall > 40 Then Intervall = 0
If Lcd_blink = 250 Then 'Ausgabe bei automatic-reset
Set Wechsel
Lcd_blink = 0
Incr Lcd_blink2
End If
If Lcd_blink2 = 2 Then
Set Wechsel2
Lcd_blink2 = 0
End If
Return
'.......................... Programm-Ende ......................................
Alles anzeigen
Vielleicht will ja jemand so etwas Ähnliches machen.
Viele Grüsse
Gerhard
post skriptum: Ich habe noch etwas vergessen: Das Programm wurde mit BASCOM 8051 erstellt. Damit editiert, sieht das gleich bunter und übersichtlicher aus. Simulation ist damit natürlich auch möglich.