Hallo liebe Community, Momentan bin ich dabei mein Inkrementalmesssystem (Anbaumessschieber von Wabeco) mit einem XMega zu verheiraten, damit ich diesen an meiner Fräse anbauen kann... In diesem Beitrag wollte ich die Fachmeinung der Kenner wissen (bin selbst kein Elektrotechniker). Zur Allererst habe ich mit einem Oszilloscop die Ausgänge des Messschiebers überprüft. Ich messe auf der Taktleitung ein Paket, welches etwa 12,5 ms lang ist, danach kommt 170 ms nichts dann kommt das gleiche Paket wieder. Ein Bild des Oszis ist angehängt Oszi1.PNG. ----------------Oszi1.PNG----------------- Anscheinend arbeitet der Messschieber intern in 1/100 mm, denn wenn ich die Messleiste um 0,01 mm verschiebe, so verschwindet auf der Datenleitung (Gelb) das erste "Bit" (oder wie heißt es in den Fachkreisen?). Die negativen Werte sieht man anhand des letzten Paket. Denn dort wird der erste Bit dann "Low" (die restlichen überflüssig). Zu sehen in dem Bild Oszi2.PNG ----------------Oszi2.PNG----------------- Um die Daten auszulesen brauche ich also nur 2 Pins. Bei diesen wird dann der Zustand verglichen und bei Übereinstimmung ist der Bit 0 bei Nichtübereinstimmung ergibt es eine 1. Sollte man eine Funktion zum vergleichen schreiben, welche dann binären Wert liefert. Auf diese Funktion wird von einer anderen Zugegriffen, welche den Wert dann zusammensetzt zu einem Integer. Und dieser Integer ist mein Messwert. ----> Zu den Fragen <---- 1.) Ist der Gedankengang ok? 2.) Gibt es eine elegantere Methode den Pegel auszulesen? 3.) Meinen XMega will ich mit 3,3 V Betreiben (denn sonst mein LCD-Modul Probleme macht), der Messschieber arbeitet bei 1,5 Volts. Ich will einen 4fachen Operationsverstärker nehmen und diesen in einer nichtinvertierender Verstärkerschaltung betreiben um die Spannung zu verdoppeln (zwei TS272). Ist es eine optimale Lösung? 4.) Idee ist, dass der Mikrokontroller eine lineare Regression ausführt und intern nach einer Kalibrierung mittels Prüf-Messwerte die Berechneten(theoretisch richtigen) Werte für die Messung anzeigt. Schafft ein Mikrokontroller eine Lineare Regression zu berechnen? Und das Alles soll für 4 Messschieber Funktionieren!?!? Ich bitte sie um konstruktive Beiträge Viele Grüße Alex
Du kannst z.B. die vorhandene SPI-SChnittstelle von Deinem XMega benutzen, die ist speziell für sowas gemacht. Dann liest Du 3 Byte ein und baust daraus ein Long integer, damit kannst Du alle Werte abbilden, die das Ding liefern kann. Zur Anpassung der Pegel gibt es Artikel in der Artikelsammlung. "lineare Regression" ist ein bischen hochgreifend formuliert. Wieviele Kalibrierungspunkte hast Du denn? Wenn es nur Anfang und Ende mit den jeweiligen Messwerten sind, dann ist der Rest ein Dreisatz. Dass schafft der uC.. :-) Für 4 Signale kannst Du entweder mehrere SPI -Schnittstellen als Software emulieren, oder Du baust Dir aus Logikbausteinen einen Umschalter, mit dem Du immer nur ein Leitungspaar zur SPI durchlässt.
Danke für deine Antwort! SPI zu benutzen ist eine sehr gute Idee. Habe mir nun eine Bidirektionalen 8-Bit Pegelwandler besorgt, durch den ich meine 3,3V für Mikrocontroller bekomme. Habe bischen im Datenblatt des X-Mega's bezüglich der SPI-Interfaces gelesen. Da steht, dass man ja nur 4 Register braucht. Das CTRL, INTCTRL, STATUS und DATA. In das CTRL-Register schreibe ich eine 0x6C da es ja gerade meinen einstellungen entspricht: 01101100 (Clock-Double ist --> 0, SPI-wird eingeschaltet --> 1 ; LSB first --> 1 ; Slave-Modus --> 0 ; SPI-Mode 3 --> 1 --> 1 und Prescaler --> 0 --> 0 ) das in Hexadezimal: 0x6C, also CTRL = 0x6C. Das INTCTRL setze ich 0. Wenn ich nun auf dem Steckboard das alles verdrahte und LCD anschließe, so bekomme ich wirre werte... Mit dem STATUS Register habe ich schwierigkeiten... Ich Kriege je von dem Messschieber 24 Bits, das sind 3 mal 8-Byte Pakete. Ich muss also irgendwie den DATA-Register mit hilfe des STATUS Registers 3 mal pro Datenübertragung auslesen und dabei einen uint32_t erzeugen ?.?.?.? weiß momentan nicht weiter. Kann mir eventuell jemand Literaturhinweis geben? Hier mein Code:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
---------------- Zur Linearen Regression ------------------ Zur Kalibrierung habe ich 7 Wertepaare alle symmetrisch entlang 175 mm verteilt mit Genauigkeit von unter pm 0,01 mm. Die Abschätzung des Quadrat der Standartabweichung lautet:
Nun minimiert man die Parameter bezüglich a und b:
ergibt sich das Gleichungsystem:
Als Lösung des Gleichungsystems erhält man:
und für den Linearen Koeffizienten b:
Hier ist D die Determinante und beträgt:
Wie man nun sieht müssen die 3-fachen Produkte berechnet werden über die Summen der Wertepaare. hmmm Schafft der Mikrokontroller das?
Gast
#2906651
Alexej W. schrieb: > Zur Kalibrierung habe ich 7 Wertepaare alle symmetrisch entlang 175 mm > verteilt mit Genauigkeit von unter pm 0,01 mm. Und wie liegen deine Werte in Relation zu einer Geraden. Eine Kalibrierung ist nur sinnvoll, wenn der Zusammenhang reproduzierbar ist und nicht bei der nächsten Kalibiermessung ganz anders aussieht. Ggf. benötigt man z.B. zusätzlich einen Temperaturfühler für Korrekturen.
Japp das ist dann für Später als Erweiterung gedacht. Aktuell lese ich die Werte manuell ab und berechne diese mit einem kleinen Progrämmchen, die Berechnung dauert zwar kurz auf meinem Werkstatt-Rechner, geht aber. Die Werte weisen eine sehr gute Linearität auf, so dass es wie oben erwähnt nur von der Umgebungstemperatur und dem linearen Wärmeausdehnungskoeffizienten abhängt. Später wollte ich einen PT100 oder sowas an Mikrokontrollen anschließen, welcher dann vergleicht ob die Temperatur im Raum sich geändert hat oder nicht und dann etscheidet ob eine neue Kalibrierung vorgenommen werden muss....
Hallo, Bitte um Hilfe bezüglich Code... Habe nun bischen recheschiert und herausgefunden was ich brauche, es klappt jedoch nicht! Ich muss also 3 Bytes nacheinander auslesen und diese dann in ein uint32_t zusammenfügen. Danach muss ich ja den Wert einmal spiegeln und dann ist er theoretisch fertig. Hier mein Code:
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
46 | |
47 | |
48 | |
49 | |
50 | |
51 | |
52 | |
53 | |
54 | |
55 | |
56 | |
57 | |
58 | |
59 | |
60 | |
61 | |
62 | |
63 | |
64 | |
65 | |
66 | |
67 | |
68 | |
69 | |
70 | |
71 | |
72 | |
73 | |
74 | |
75 | |
76 | |
77 | |
78 | |
Wenn ich das Programm compiliere, so sehe ich auf dem LCD als Position 0, sobalt ich den Messchieber um 0,01mm bewege ändert sich der Wert sofort auf 05792. Bei Wert 0,02 mm ist LCD bei 031586. Wenn ich nun den Messschieber resete, dann ist die LCD-Anzeige bei dem alten Wert, obwohl nach einem Reset die Data-Leitung eine 0 liefert... Sehe momentan keinen Fehler im Code. Bitte um Hilfe Grüße Alex
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.

