Die Digitalanzeige
Wer kennt das nicht, man hat eine Drehbank oder Fräsmaschine mit einer "komischen" Spindelsteigung von z.B 0,8mm/Umdrehung.
Wieviele Umdrehungen muss man doch gleich für einen Verfahrweg von 5,5mm machen???
Um lästigen Rechnereien ein Ende zu bereiten, wurde diese Anzeige entwickelt.
Schaltplan
Die Anzeige besteht aus einer Displayplatine und drei identischen Controllerplatinen. Die Steuerung für je eine Zeile übernimmt ein Mikrocontroller aus dem Hause Atmel. Eingaben sind über eine Zifferntastatur möglich. Um auswählen zu können welche Zeile über die Tastatur bedient werden soll, ist ein zusätzlicher Schalter auf der Displayplatine angebracht. Die Tastatur wird über 4066 ICs an die entsprechende Controllerplatine durchgeschaltet. Die einzelnen Anoden der Siebensegmentanzeigen sind zu einem Bussystem zusammengefasst und werden über die Kathoden gemultiplext. Das spart Ausgänge am Controller und senkt den Stromverbrauch.Schaltplan der Displayplatine
Schaltplan der Controllerplatine
Platine
Die Platine wurde mit dem Layoutprogramm EAGLE erstellt. Mit dem, für die private Nutzung kostenfreien, ULP von www.matwei.de ist es möglich 3D-Bilder der Platine zu erzeugen. Dieses ULP erzeugt eine Datei, welche mit dem ebenfalls kostenfreien Programm POV-Ray in ein 3D-Bild gerendert werden kann. Die 3D-Marcos für die Siebensegmentanzeigen, die Tastatur und den Schalter wurden von mir erstellt.Displayplatine
Controllerplatine
Die Ätzvorlagen gibts hier. (Achtung: Diese sind bereits gespiegelt, sodass sie direkt auf eine Folie gedruckt werden können!!!)
Die Platine für das Display ist mit einer Menge Drahtbrücken zu bestücken. Für den der sich diese Arbeit ersparen will, habe ich auch die Ätzvorlage für eine Doppelseitige Platine generiert. Die Vorlagen sind schon gespiegelt, sodass jeweils die bedruckte Seite direkt auf dem Platinenmaterial liegen muss.
Da man auf den Bildern die Drahtbrücken nicht alle erkennen kann, hier noch eine Bestückungshilfe:
Bilder der realen Digitalanzeige
Sensoren
Die Controllerplatinen haben einen vierpoligen Anschluss für verschiedene Sensoren (+5V, Masse, Eingang1, Eingang2).Bisher wurde der Prototyp mit einem optischen Inkremental-Impulsgeber (Wegerfassung) und einem Hall-Sensor(Drehzahlerfassung) getestet.
1. Inkremental-Impulsgeber (Encoder)
Funktionsweise:
Dreht man die Schlitzscheibe nach rechts, so wird zuerst Sensor 1 beleuchtet und nach einer gewissen Zeit erst Sensor 2. Sensor 1 wird auch zuerst wieder im Schatten sein, während Sensor 2 noch eine Zeit weiterbeleuchtet wird. Dreht man die Schlitzscheibe nach links kehrt sich der Prozess um. Mit diesen Informationen kommt man zu folgenden Signaldiagrammen:
Linkslauf:
Rechtslauf:
Um eine ausreichende Auflösung zu erreichen, sollte ein Sensor mit mindestens 500 Impulsen/Umdrehung verwendet werden (besser 1000 oder 2000).
Mit 500 Impulsen meint der Hersteller 500 Löcher in der Schlitzscheibe. Bei diesem Projekt werden die steigende und die fallende Flanke der Sensoren ausgewertet, bei zwei Sensoren sind das in diesem Beispiel 2000 Flanken/Umdrehung also eine "Vervierfachung" der Auflösung.
Der Encoder wird nicht, wie man vermuten könnte mit der Spindel verbunden, sondern direkt mit dem Schlitten.
Das ganze muss jetzt "nur" noch spielfrei sein.
2. Hall-Sensor
Der hier verwendete Sensor TLE4905L ist eigentlich nicht nur ein reiner Hall-Sensor, er beinhaltet zusätzlich einen Verstärker und eine Schmitt-Trigger-Stufe für den Ausgang. Es steht also ein digitales Signal zur Verfügung. Der Sensor wurde nach dem Applikationsvorschlag im Datenblatt angeschlossen, der Lastwiderstand RL wird als Pullup im Controller programmiert. Für die Drehzahlmessung ist ein Eingang an der Controllerplatine ausreichend, der andere wird einfach offen gelassen. Zur Abnahme der Drehzahl wird ein Magnet an die Welle der Maschine angebracht. Der Sensor wird in geringem Abstand zum Magnet an der Maschine fixiert.
Programmierung
!!! Die Programme befinden sich im Moment noch in der Testphase !!!Quellcode für die Wegerfassung: (Syntax highlighted mit
G
e
S
H
i
mit Anpassungen für BascomAVR von mir)' ***************************************** ' * Wegerfassung für eine Drehbank * ' * mit ATMega 16 * ' * Version 1.1a * ' * © by Stefan Weigert * ' ***************************************** ' Beschaltung ' PortA.0...A.7 Ansteuerung der Anoden der 7-Segmentanzeigen über 100R A.0=a A.1=b ... A.7=dp ' PortC.0...C.7 Ansteuerung der gemeinsamen Kathoden der Anzeigen C.0=MSB C.7=LSB über Transistor ' PortB.0...B.7 über 4066 an Tastaturmatrix ' PortD.0...D.1 frei ' PortD.2 (INT0) Inkrementalgeber ' PortD.3 (INT1) Inkrementalgeber ' PortD.4...D.6 frei $regfile = "m16def.dat" 'Dem Compiler vorgeben welcher Controller benutzt wird $crystal = 16000000 'Taktfrequenz in Hz vorgeben Ddra = &B11111111 'PortA alles Ausgänge Ddrb = &B00000000 'PortB alles Eingänge Ddrc = &B11111111 'PortC alles Ausgänge Ddrd = &B00000000 'PortD alles Eingänge Portd = &B00001100 'Pullups für INT0 und INT1 setzen Mcucr = &B00000101 'INT0 und INT1 auf steigende UND fallende Flanke einstellen Gicr = &B11000000 'INT0 und INT1 aktivieren On Int0 Interrupt0 'Sprungadresse für INT0 definieren On Int1 Interrupt1 'Sprungadresse für INT1 definieren Config Kbd = Portb , Debounce = 30 'Tastaturmatrix mit Entprellzeit definieren Dim Eeprom_dummybyte As Eram Byte At &H00 'Das erste Byte im EEProm könnte bei einem Reset verfälscht werden Dim Eeprom_durchmesserflag As Eram Byte At &H01 'Speichervariable im EEProm = 1 wenn Durchmesser angezeigt werden sollen Dim Eeprom_richtungsflag As Eram Byte At &H02 'Speichervariable im EEprom rechts/links addieren/subtrahieren Dim Eeprom_schrittwert As Eram Long At &H03 'Speichervariable im EEprom für Wert für einen Schritt des Inkrementalgebers $eepromhex 'den Compiler anweisen den EEProminhalt im Intel-Hex-Format auszugeben $eeprom 'die folgenden Daten werden im EEProm gespeichert Data 0 , 0 , 0 , 1000& 'Daten für das EEprom (Byte , Byte, Byte , Long) Grundeinstellungen $data 'den Compiler anweisen, dass weitere Daten in den 'Flash-Speicher abgelegt werden sollen Dim N As Word At &H60 'n = allgemeine Zählvariable Dim Stelle As Byte At &H62 'Schleifenvariable für die Stellenauswahl Dim Encoderstatusalt As Byte At &H63 'Variable für den "alten" Encoderstatus Dim Encoderstatusneu As Byte At &H64 'Variable für den "neuen" Encoderstatus Dim Schrittwert As Long At &H65 'Variable für den Encoderschritt in Nanometer Dim Taste As Byte At &H69 'Variable für die Tastenauswahl Dim Menuepunkt As Byte At &H70 Dim Messwert As Long At &H71 'angezuzeigender Wert Dim Anzeigewert As Long At &H75 Dim Anzeigewertascii As String * 8 At &H79 'Zeichenkette des anzuzeigenden Wertes (Textes) Dim Asciizeichen(8) As Byte At &H79 Overlay 'Byteweise Ausgabe ermöglichen Dim Kommaflag As Bit At &H88 'Flag bei 1 wird das Komma dargestellt Displaytest: For Encoderstatusalt = 0 To 3 Anzeigewertascii = Lookupstr(encoderstatusalt , Testwerte) For N = 1 To 1500 Gosub Anzeigen Next N Next Encoderstatusalt Init: Encoderstatusalt = Pind And 12 'INT0 und INT1 ausmaskieren Schrittwert = Eeprom_schrittwert '0 .. +32767 in Nanometer If Eeprom_durchmesserflag = 1 Then Schrittwert = Schrittwert * 2 End If If Eeprom_richtungsflag = 1 Then Schrittwert = Schrittwert * -1 End If Messwert = 0 'Startwert Enable Interrupts 'Interrupts global feischalten Main: Do Kommaflag = 1 'Flag = 1 wenn ein Komma angezeigt werden soll Gosub Messwerttest Gosub Anzeigen Taste = Getkbd() If Taste = 13 Then Gosub Hauptmenue End If Loop Messwerttest: Anzeigewert = Messwert If Anzeigewert > 2145000000 Or Anzeigewert < -2145000000 Then Disable Interrupts Kommaflag = 0 Anzeigewertascii = "FLoAtEd " For N = 0 To 2500 Gosub Anzeigen Next N Messwert = 0 Enable Interrupts Elseif Anzeigewert > 2100000000 Or Anzeigewert < -2100000000 Then Kommaflag = 0 Anzeigewertascii = "FLoAtinG" Elseif Anzeigewert > 0 Then Anzeigewertascii = Str(anzeigewert) Gosub Ruecken Elseif Anzeigewert < 0 Then Anzeigewert = Anzeigewert * -1 Anzeigewertascii = Str(anzeigewert) Gosub Ruecken Asciizeichen(1) = 45 'negatives Vorzeichen Else Anzeigewertascii = " 0000" End If Return Anzeigen: 'Anzeige in Abhängigkeit der gespeicherten Asciizeichen die Segmente schalten For Stelle = 0 To 7 Select Case Asciizeichen(stelle + 1) Case 45 : Porta = 64 '- Case 48 : Porta = 63 '0 Case 49 : Porta = 6 '1 Case 50 : Porta = 91 '2 Case 51 : Porta = 79 '3 Case 52 : Porta = 102 '4 Case 53 : Porta = 109 '5 Case 54 : Porta = 125 '6 Case 55 : Porta = 39 '7 Case 56 : Porta = 127 '8 Case 57 : Porta = 111 '9 Case 65 : Porta = 119 'A Case 67 : Porta = 57 'C Case 69 : Porta = 121 'E Case 70 : Porta = 113 'F Case 71 : Porta = 125 'G Case 72 : Porta = 118 'H Case 73 : Porta = 6 'I Case 76 : Porta = 56 'L Case 80 : Porta = 115 'P Case 83 : Porta = 109 'S Case 85 : Porta = 62 'U Case 98 : Porta = 124 'b Case 99 : Porta = 88 'c Case 100 : Porta = 94 'd Case 104 : Porta = 116 'h Case 105 : Porta = 4 'i Case 110 : Porta = 84 'n Case 111 : Porta = 92 'o Case 114 : Porta = 80 'r Case 116 : Porta = 120 't Case 117 : Porta = 28 'u Case 121 : Porta = 110 'y Case Else : Porta = 0 End Select If Stelle = 4 And Kommaflag = 1 Then Porta = Porta + 128 End If Portc.stelle = 1 Waitus 100 Portc.stelle = 0 Next Stelle Return Ruecken: Asciizeichen(8) = Asciizeichen(7) 'einmal auf jeden Fall Rücken (Vorzeichenstelle) Asciizeichen(7) = Asciizeichen(6) Asciizeichen(6) = Asciizeichen(5) Asciizeichen(5) = Asciizeichen(4) Asciizeichen(4) = Asciizeichen(3) Asciizeichen(3) = Asciizeichen(2) Asciizeichen(2) = Asciizeichen(1) Asciizeichen(1) = 0 If Anzeigewert < 1000000000 Then Asciizeichen(8) = Asciizeichen(7) Asciizeichen(7) = Asciizeichen(6) Asciizeichen(6) = Asciizeichen(5) Asciizeichen(5) = Asciizeichen(4) Asciizeichen(4) = Asciizeichen(3) Asciizeichen(3) = Asciizeichen(2) Asciizeichen(2) = 0 End If If Anzeigewert < 100000000 Then Asciizeichen(8) = Asciizeichen(7) Asciizeichen(7) = Asciizeichen(6) Asciizeichen(6) = Asciizeichen(5) Asciizeichen(5) = Asciizeichen(4) Asciizeichen(4) = Asciizeichen(3) Asciizeichen(3) = 0 End If If Anzeigewert < 10000000 Then Asciizeichen(8) = Asciizeichen(7) Asciizeichen(7) = Asciizeichen(6) Asciizeichen(6) = Asciizeichen(5) Asciizeichen(5) = Asciizeichen(4) Asciizeichen(4) = 0 End If If Anzeigewert < 1000000 Then Asciizeichen(8) = Asciizeichen(7) Asciizeichen(7) = Asciizeichen(6) Asciizeichen(6) = Asciizeichen(5) Asciizeichen(5) = 48 End If If Anzeigewert < 100000 Then Asciizeichen(8) = Asciizeichen(7) Asciizeichen(7) = Asciizeichen(6) Asciizeichen(6) = 48 End If If Anzeigewert < 10000 Then Asciizeichen(8) = Asciizeichen(7) Asciizeichen(7) = 48 End If Return Hauptmenue: Kommaflag = 0 Menuepunkt = 0 Do Taste = Getkbd() Select Case Taste Case 12 : Exit Do Case 13 : If Menuepunkt < 7 Then Incr Menuepunkt Else Menuepunkt = 1 Select Case Menuepunkt Case 1 : Anzeigewertascii = "nuLL " Case 2 : Anzeigewertascii = "PrESEt " Case 3 : Anzeigewertascii = "diA on " Case 4 : Anzeigewertascii = "diA oFF " Case 5 : Anzeigewertascii = "StEP SEt" Case 6 : Anzeigewertascii = "StEP UP " Case 7 : Anzeigewertascii = "StEP dn " End Select Case 14: Select Case Menuepunkt Case 1 : Messwert = 0 Gosub Done Kommaflag = 1 Return Case 2 : Gosub Preset Kommaflag = 1 Return Case 3 : Eeprom_durchmesserflag = 1 Schrittwert = Eeprom_schrittwert Schrittwert = Schrittwert * 2 If Eeprom_richtungsflag = 1 Then Schrittwert = Schrittwert * -1 End If Gosub Done Kommaflag = 1 Return Case 4 : Eeprom_durchmesserflag = 0 Schrittwert = Eeprom_schrittwert If Eeprom_richtungsflag = 1 Then Schrittwert = Schrittwert * -1 End If Gosub Done Kommaflag = 1 Return Case 5 : Gosub Stepset Kommaflag = 1 Return Case 6 : Eeprom_richtungsflag = 0 Schrittwert = Eeprom_schrittwert If Eeprom_durchmesserflag = 1 Then Schrittwert = Schrittwert * 2 End If Gosub Done Kommaflag = 1 Return Case 7 : Eeprom_richtungsflag = 1 Schrittwert = Eeprom_schrittwert Schrittwert = Schrittwert * -1 If Eeprom_durchmesserflag = 1 Then Schrittwert = Schrittwert * 2 End If Gosub Done Kommaflag = 1 Return End Select End Select Gosub Nokey Gosub Anzeigen Loop Return Preset: Disable Interrupts Messwert = 0 Gosub Messwerttest Gosub Anzeigen Gosub Nokey Do Taste = Getkbd() Select Case Taste Case 0 : '1 If Messwert <= 214499900 And Messwert >= -214499900 Then Messwert = Messwert * 10 If Messwert < 0 Then Messwert = Messwert - 1000 Else Messwert = Messwert + 1000 Else Gosub Error End If Case 1 : '2 If Messwert <= 214499800 And Messwert >= -214499800 Then Messwert = Messwert * 10 If Messwert < 0 Then Messwert = Messwert - 2000 Else Messwert = Messwert + 2000 Else Gosub Error End If Case 2 : '3 If Messwert <= 214499700 And Messwert >= -214499700 Then Messwert = Messwert * 10 If Messwert < 0 Then Messwert = Messwert - 3000 Else Messwert = Messwert + 3000 Else Gosub Error End If Case 4 : '4 If Messwert <= 214499600 And Messwert >= -214499600 Then Messwert = Messwert * 10 If Messwert < 0 Then Messwert = Messwert - 4000 Else Messwert = Messwert + 4000 Else Gosub Error End If Case 5 : '5 If Messwert <= 214499500 And Messwert >= -214499500 Then Messwert = Messwert * 10 If Messwert < 0 Then Messwert = Messwert - 5000 Else Messwert = Messwert + 5000 Else Gosub Error End If Case 6 : '6 If Messwert <= 214499400 And Messwert >= -214499400 Then Messwert = Messwert * 10 If Messwert < 0 Then Messwert = Messwert - 6000 Else Messwert = Messwert + 6000 Else Gosub Error End If Case 8 : '7 If Messwert <= 214499300 And Messwert >= -214499300 Then Messwert = Messwert * 10 If Messwert < 0 Then Messwert = Messwert - 7000 Else Messwert = Messwert + 7000 Else Gosub Error End If Case 9 : '8 If Messwert <= 214499200 And Messwert >= -214499200 Then Messwert = Messwert * 10 If Messwert < 0 Then Messwert = Messwert - 8000 Else Messwert = Messwert + 8000 Else Gosub Error End If Case 10 : '9 If Messwert <= 214499100 And Messwert >= -214499100 Then Messwert = Messwert * 10 If Messwert < 0 Then Messwert = Messwert - 9000 Else Messwert = Messwert + 9000 Else Gosub Error End If Case 12 : '+/- Messwert = Messwert * -1 Case 13 : '0 If Messwert <= 214500000 And Messwert >= -214500000 Then Messwert = Messwert * 10 Else Gosub Error End If Case 14 : Exit Do 'Enter End Select Gosub Messwerttest Gosub Nokey Gosub Anzeigen Loop Gosub Done Enable Interrupts Return Stepset: Disable Interrupts Messwert = 0 Gosub Messwerttest Gosub Anzeigen Gosub Nokey Do Taste = Getkbd() Select Case Taste Case 0 : '1 If Messwert <= 3276000 Then Messwert = Messwert * 10 Messwert = Messwert + 1000 Else Gosub Error End If Case 1 : '2 If Messwert <= 3276000 Then Messwert = Messwert * 10 Messwert = Messwert + 2000 Else Gosub Error End If Case 2 : '3 If Messwert <= 3276000 Then Messwert = Messwert * 10 Messwert = Messwert + 3000 Else Gosub Error End If Case 4 : '4 If Messwert <= 3276000 Then Messwert = Messwert * 10 Messwert = Messwert + 4000 Else Gosub Error End If Case 5 : '5 If Messwert <= 3276000 Then Messwert = Messwert * 10 Messwert = Messwert + 5000 Else Gosub Error End If Case 6 : '6 If Messwert <= 3276000 Then Messwert = Messwert * 10 Messwert = Messwert + 6000 Else Gosub Error End If Case 8 : '7 If Messwert <= 3276000 Then Messwert = Messwert * 10 Messwert = Messwert + 7000 Else Gosub Error End If Case 9 : '8 If Messwert <= 3275000 Then Messwert = Messwert * 10 Messwert = Messwert + 8000 Else Gosub Error End If Case 10 : '9 If Messwert <= 3275000 Then Messwert = Messwert * 10 Messwert = Messwert + 9000 Else Gosub Error End If Case 12 : Exit Do Case 13 : '0 If Messwert <= 3276000 Then Messwert = Messwert * 10 Else Gosub Error End If Case 14 : Exit Do 'Enter End Select Gosub Messwerttest Gosub Nokey Gosub Anzeigen Loop If Taste = 14 Then Messwert = Messwert / 1000 Eeprom_schrittwert = Messwert Schrittwert = Eeprom_schrittwert If Eeprom_durchmesserflag = 1 Then Schrittwert = Schrittwert * 2 End If If Eeprom_richtungsflag = 1 Then Schrittwert = Schrittwert * -1 End If Gosub Done End If Messwert = 0 Enable Interrupts Return Nokey: Do Taste = Getkbd() Gosub Anzeigen Loop Until Taste = 16 Return Error: Anzeigewertascii = "Error " For N = 0 To 600 Gosub Anzeigen Next N Return Done: Anzeigewertascii = " donE" For N = 0 To 600 Gosub Anzeigen Next N Return Interrupt0: Disable Interrupts Encoderstatusneu = Pind And 12 Select Case Encoderstatusalt Case 0 : Messwert = Messwert + Schrittwert Case 4 : Messwert = Messwert - Schrittwert Case 8 : Messwert = Messwert - Schrittwert Case 12 : Messwert = Messwert + Schrittwert End Select Encoderstatusalt = Encoderstatusneu Enable Interrupts Return Interrupt1: Disable Interrupts Encoderstatusneu = Pind And 12 Select Case Encoderstatusalt Case 0 : Messwert = Messwert - Schrittwert Case 4 : Messwert = Messwert + Schrittwert Case 8 : Messwert = Messwert + Schrittwert Case 12 : Messwert = Messwert - Schrittwert End Select Encoderstatusalt = Encoderstatusneu Enable Interrupts Return Testwerte: Data "diSPLAy " , "tESt " , "88888888" , "LEnGth "
Quellcode für die Drehzahlerfassung: (Syntax highlighted mit
G
e
S
H
i
mit Anpassungen für BascomAVR von mir)' ********************************************** ' * Drehzahlerfassung an einer Drehbank * ' * mit ATMega 16 * ' * Version 1.1a * ' * © by Stefan Weigert * ' ********************************************** ' Beschaltung ' PortA.0...A.7 Ansteuerung der Anoden der 7-Segmentanzeigen über 82R A.0=a A.1=b ... A.7=dp ' PortC.0...C.7 Ansteuerung der gemeinsamen Kathoden der Anzeigen C.0=MSB C.7=LSB über Transistor ' PortB.0...B.7 über 4066 an Tastaturmatrix ' PortD.0...D.1 frei ' PortD.2 (INT0) Drehzahlsensor (z.B.Hallsensor) mit 1Impuls pro Umdrehung ' PortD.3...D.6 frei $regfile = "m16def.dat" 'Dem Compiler vorgeben welcher Controller benutzt wird $crystal = 16000000 'Taktfrequenz in Hz vorgeben Ddra = &B11111111 'PortA alles Ausgänge Ddrb = &B00000000 'PortB alles Eingänge Ddrc = &B11111111 'PortC alles Ausgänge Ddrd = &B00000000 'PortD alles Eingänge Portd.2 = 1 'Pullup für INT0 setzen Mcucr = &B00000011 'INT0 auf steigende Flanke einstellen Dim Zeitwert As Long At &H60 'Zeitwert zwischen zwei Sensorimpulsen Dim Zeitwertlow As Word At &H60 Overlay 'HighWord des Zeitwertes wird durch Timerüberlauf erhöht Dim Zeitwerthigh As Word At &H62 Overlay 'LowWord des Zeitwertes ist der Timerstand selbst Dim Drehzahlascii As String * 8 At &H64 'Zeichenkette des anzuzeigenden Wertes (Textes) Dim Asciizeichen(8) As Byte At &H64 Overlay 'Byteweise Ausgabe ermöglichen Dim Drehzahl As Long At &H72 'Variable für die Drehzahl Dim N As Word At &H76 'n = allgemeine Zählvariable Dim Stelle As Byte At &H78 'Schleifenvariable für die Stellenauswahl Dim Anzeigewert As Long At &H79 Config Timer1 = Timer , Prescale = 8 'Timer1 (16Bit) als Timer konfigurieren und mit 1/8 des Systemtaktes betreiben On Ovf1 Timerueberlauf1 'Bei Timerüberlauf (alle 500µs) zur Subroutine 'Timerueberlauf1' springen On Int0 Interrupt0 'Sprungadresse für INT0 definieren Enable Ovf1 'TimerInterrupt1 aktivieren Enable Int0 Displaytest: For Zeitwert = 0 To 3 Drehzahlascii = Lookupstr(zeitwert , Testwerte) For N = 1 To 1500 Gosub Anzeigen Next N Next Zeitwert Enable Interrupts 'Interrupts global feischalten Init: Zeitwert = 0 Anzeigewert = 0 Drehzahl = 0 Stop Timer1 Timer1 = 0 Start Timer1 Main: Do Anzeigewert = Drehzahl If Anzeigewert > 99999 Then Drehzahlascii = "to HiGh " Else Drehzahlascii = Str(anzeigewert) Gosub Ruecken End If For N = 1 To 400 Gosub Anzeigen Next N Loop Anzeigen: For Stelle = 0 To 7 Select Case Asciizeichen(stelle + 1) 'Anzeige in Abhängigkeit der gespeicherten Asciizeichen die Segmente schalten Case 45 : Porta = 64 '- Case 48 : Porta = 63 '0 Case 49 : Porta = 6 '1 Case 50 : Porta = 91 '2 Case 51 : Porta = 79 '3 Case 52 : Porta = 102 '4 Case 53 : Porta = 109 '5 Case 54 : Porta = 125 '6 Case 55 : Porta = 39 '7 Case 56 : Porta = 127 '8 Case 57 : Porta = 111 '9 Case 65 : Porta = 119 'A Case 67 : Porta = 57 'C Case 69 : Porta = 121 'E Case 70 : Porta = 113 'F Case 71 : Porta = 125 'G Case 72 : Porta = 118 'H Case 73 : Porta = 6 'I Case 76 : Porta = 56 'L Case 80 : Porta = 115 'P Case 83 : Porta = 109 'S Case 85 : Porta = 62 'U Case 98 : Porta = 124 'b Case 99 : Porta = 88 'c Case 100 : Porta = 94 'd Case 104 : Porta = 116 'h Case 105 : Porta = 4 'i Case 110 : Porta = 84 'n Case 111 : Porta = 92 'o Case 114 : Porta = 80 'r Case 116 : Porta = 120 't Case 117 : Porta = 28 'u Case 121 : Porta = 110 'y Case Else : Porta = 0 End Select Portc.stelle = 1 Waitus 100 Portc.stelle = 0 Next Stelle Return Ruecken: If Anzeigewert = 0 Then Drehzahlascii = " 0 U" Return End If Asciizeichen(8) = 85 Asciizeichen(7) = 0 If Anzeigewert < 100000 Then Asciizeichen(6) = Asciizeichen(5) Asciizeichen(5) = Asciizeichen(4) Asciizeichen(4) = Asciizeichen(3) Asciizeichen(3) = Asciizeichen(2) Asciizeichen(2) = Asciizeichen(1) Asciizeichen(1) = 0 End If If Anzeigewert < 10000 Then Asciizeichen(6) = Asciizeichen(5) Asciizeichen(5) = Asciizeichen(4) Asciizeichen(4) = Asciizeichen(3) Asciizeichen(3) = Asciizeichen(2) Asciizeichen(2) = 0 End If If Anzeigewert < 1000 Then Asciizeichen(6) = Asciizeichen(5) Asciizeichen(5) = Asciizeichen(4) Asciizeichen(4) = Asciizeichen(3) Asciizeichen(3) = 0 End If If Anzeigewert < 100 Then Asciizeichen(6) = Asciizeichen(5) Asciizeichen(5) = Asciizeichen(4) Asciizeichen(4) = 0 End If If Anzeigewert < 10 Then Asciizeichen(6) = Asciizeichen(5) Asciizeichen(5) = 0 End If Return Interrupt0: Zeitwertlow = Timer1 Timer1 = 0 Drehzahl = 120000000 / Zeitwert Zeitwert = 0 Return Timerueberlauf1: Incr Zeitwerthigh If Zeitwert > 4000000 Then Disable Int0 Zeitwert = 0 Drehzahl = 0 Enable Int0 End If Return Testwerte: Data "diSPLAy " , "tESt " , "88888888" , "rotAtion"
Die fertigen Hexfiles: Wegerfassung Drehzahlerfassung
Für die Wegerfasung können und sollten noch die Grundeinstellungen ins EEProm geladen werden: Grundeinstellungen
Kurzanleitung für den Normalbetrieb (der Wegerfassung):
1. Nach dem Einschalten- es wird ein Displaytest ausgeführt
- diverse Einstellungen werden geladen
- Anzeige wird genullt
- die Digitalanzeige geht in den Normalbetrieb und würde auf Bewegungen des Encoders reagieren
Im Normalbetrieb können außer dem Verfahrweg zwei Meldungen auf dem Display erscheinen:
- die Digitalanzeige zeigt "FLoAtinG" an
Ist der Anzeigewert größer als 2100mm bzw. kleiner als -2100mm besteht die Gefahr eines internen Variablenüberlaufes.
Solange "FLoAtinG" im Display steht kann man den Messwert durch Richtungsumkehr "retten".
- die Digitalanzeige zeigt "FLoAtEd"
Der Messwert lag über 2145mm bzw. unter -2145mm.
Der Messwert ist auch nach Richtungsumkehr unbrauchbar.
2. Bedienung
- über den Schiebeschalter (3 Stufen) wird ausgewählt, welche Achse bedient werden soll
- aus dem Normalbetrieb heraus ist zunächst nur die Taste "0" der Tastatur aktiv, mit dieser gelangt man ins Menü
- Das Menü besitzt 7 Menüpunkte, welche mit der "0" durchgetoggelt werden können (nach dem letzten Menüpunkt wird wieder der erste angezeigt usw.)
Im Display werden je nach Menüpunkt unterschiedliche Texte angezeigt (rudimentär soweit es halt mit einer 7-Segmentanzeige möglich ist)
- mit der Taste "*" gelangt man zurück ins Hauptmenü
Menüpunkt 1 die Digitalanzeige zeigt "nuLL"
- wird jetzt die Taste "#" gedrückt, wird die Anzeige für diese Achse genullt
- die Digitalanzeige zeigt kurz "donE"
- die Digitalanzeige ist wieder in der Hauptmenüebene
Menüpunkt 2 die Digitalanzeige zeigt "PrESEt"
- wird jetzt die Taste "#" gedrückt, kann man einen beliebigen Wert voreinstellen (mit 1μm Genauigkeit)
- mit der Taste "*" wird das Vorzeichen getauscht
- die Ziffern sind eben die Ziffern
- Fehleingaben werden durch "Error" angezeigt und ignoriert (Wert zu groß/klein)
- mit "#" wird die Eingabe abgeschlossen
- die Digitalanzeige zeigt kurz "donE"
- die Digitalanzeige ist wieder in der Hauptmenüebene
Menüpunkt 3 die Digitalanzeige zeigt "diA on"
- wird jetzt die Taste "#" gedrückt, wird die eingestellte Schrittweite des Encoders verdoppelt (diA = Diameter = Durchmesser)
- Diese Funktion ist eigentlich nur für die Stichachse einer Drehbank sinnvoll.
- (z.B. bei einen Fahrweg von 1mm verringert den Bauteildurchmesser um 2mm ... usw.)
- die Digitalanzeige zeigt kurz "donE"
- Die Einstellung wird im EEProm gespeichert und bleibt so auch nach Ausschalten erhalten!!!
- die Digitalanzeige ist wieder in der Hauptmenüebene
Menüpunkt 4 die Digitalanzeige zeigt "diA oFF"
- wird jetzt die Taste "#" gedrückt, wird die einfache eingestellte Schrittweite des Encoders verwendet
- die Digitalanzeige zeigt kurz "donE"
- Die Einstellung wird im EEProm gespeichert und bleibt so auch nach Ausschalten erhalten!!!
- die Digitalanzeige ist wieder in der Hauptmenüebene
Menüpunkt 5 die Digitalanzeige zeigt "StEP SEt"
- wird jetzt die Taste "#" gedrückt, wird die Schrittweite des Encoders eingestellt (in nm -> ja nano!!!)
Das ist die wichtigste Einstellung an der ganzen die Digitalanzeige.
Diese Schrittweite gibt an, was eine Flanke des Encoders an Weg entspricht
(mit einem Trick kann man den Wert mittels der Digitalanzeige selbst ermitteln -> kommt später)
Fehleingaben werden durch "Error" angezeigt und ignoriert (Wert zu groß/klein)
Der Wert ist immer positiv
- Die Ziffern sind wieder die Ziffern
- mit "#" wird die Eingabe abgeschlossen
- die Digitalanzeige zeigt kurz "donE"
- Die Einstellung wird im EEProm gespeichert und bleibt so auch nach Ausschalten erhalten!!!
- die Digitalanzeige ist wieder in der Hauptmenüebene
Menüpunkt 6 die Digitalanzeige zeigt "StEP UP"
- wird jetzt die Taste "#" gedrückt, kann die Zählrichtung der die Digitalanzeige verändert werden
- was hier welcher Logik entspricht hängt auch davon ab, wo welcher Encoderkanal an der Platine angeschlossen ist.
- Sagen wir mal: beim Drehen des Enoders im Urzeigersinn zählt die Anzeige jetzt vorwärts -> entgegen rückwärts
- die Digitalanzeige zeigt kurz "donE"
- Die Einstellung wird im EEProm gespeichert und bleibt so auch nach Ausschalten erhalten!!!
- die Digitalanzeige ist wieder in der Hauptmenüebene
Menüpunkt 7 die Digitalanzeige zeigt "StEP dn"
- wird jetzt die Taste "#" gedrückt, kann die Zählrichtung der die Digitalanzeige verändert werden
- was hier welcher Logik entspricht hängt auch davon ab, wo welcher Encoderkanal an der Platine angeschlossen ist.
- Sagen wir mal: beim Drehen des Enoders im Urzeigersinn zählt die Anzeige jetzt rückwärts -> entgegen vorwärts
- die Digitalanzeige zeigt kurz "donE"
- Die Einstellung wird im EEProm gespeichert und bleibt so auch nach Ausschalten erhalten!!!
- die Digitalanzeige ist wieder in der Hauptmenüebene
3. Ermittlung und Einstellung der Encoderschrittweite
- folgende Schritte sind für jede Achse einzeln durchzuführen
- sicherstellen, dass "diA oFF" ausgewählt ist
- im Menü Stepset den Wert 1000 Einstellen (1000nm)
- den toten Gang für eine Richtung aus der Maschine fahren
- Anzeige nullen
- einen längeren (ganz genau bekannten) Weg in die gleiche Richtung fahren (10cm Lehre ?! je weiter desto besser)
- die Digitalanzeige zeigt jetzt die Schitte an, die für diesen Weg nötig waren.
Rechnen:
"ganz genau bekannter Weg" / Anzeigewert = Weite pro Schritt
Weite pro Schritt in nm umrechnen und bei "StEP SEt" einstellen -> fertig