Hallo ingo pirker,

Zitat von
ingo pirker
... ich hole den Messert mit 10Bit ab!! ...
Ich finde die (meine) Lösung mit der selbst gemessenen Wertetabelle deswegen genau, weil ich dabei schaltungsinterne Messfehler oder Bauteiltoleranzen ausgleichen könnte. Wenn welche auftreten. Die Regressionskurve mit der seltsamen Formel y = 38512 mal x hoch(-1,0791) heisst ja nix anderes als y (der Abstand in mm) ist gleich 38512 dividiert durch Messwerthoch1,0791 - ich hatte das durch 27000/x angenähert (siehe Kurve). Mittlerweile - in der Schaltung, zusammen mit allen Anwendungen, bekomme ich das bessere Ergebnis mit der Formel
Code:
gpdtmp = adc3_dat; // Übernimm Daten
GPDmm = 25600 / gpdtmp;
if (GPDmm > 999)
GPDmm = 999;
if (GPDmm < 0 )
GPDmm = 0;
return GPDmm;
wobei noch zu ergänzen wäre, dass ich vom Messwert über 12 Messungen einen Mittelwert bilde:
Code:
ISR(ADC_vect) // _VECTOR(21)
{
adc3_sum = adc3_sum + ADC; // ADC-Werte aufsummieren
adc3_cnt++;
if (adc3_cnt >= 12) // Wenn Counter >= x, dann Messwert ausrechnen
// Wenn adc3_counter < x, dann keine Aktion
{ //
adc3_dat = adc3_sum / 12; // Gemittelten ADC-Wert ausrechnen
adc3_sum = 0; // adc3_sum und Counter rücksetzen
adc3_cnt = 0;
}
}
Code ist C, es sind die Variablendeklarationen hier nicht enthalten (hab ich in einer include-Datei). Aufpassen, wenn Du den ADC selbst ausliest: Es muss die Reihenfolge des Auslesens (Low - und High-Byte) strikt eingehalten werden - steht im ATMEL-doc zu Deinem µC. Schreibt man das so wie ich oben in der ISR - einfach "ist gleich ADC", dann regelt das der Compiler sauber "von selbst". Wie das in Bascom geht, weiss ich nicht.
Viel Erfolg.
Lesezeichen