BASTIUniversal
05.02.2006, 13:05
Hallo!
Ich hab jetzt seit ein paar Tagen meinen Drucksensor laufen, der bringt auch gute Werte. Für eine exakte Druckmessung brauche ich aber noch die genaue Betriebsspannung und die Temperatur.
Für die Temperatur nehme ich einen LM35, den ich irgendwo ausgeschlachtet hab.
Für die Betriebsspannugn nehme ich den internen Bandgap von meinem Mega48 und rechne die Spannung folgendermasen aus:
1,1V (Vom Bandgap) / ADC-Wert * 1023 = Betriebsspannung
Die Temperatur vom LM35 (der gibt 10mV/°C) lese ich direkt am ADC ein. Da bekomme ich eine Auflösung von ca. 1°C.
Jetzt habe ich ein Programm geschrieben, das zuerst den Bandgap liest, dann den LM35. Das ganze wird an den PC geschickt.
Nun hab ich damit aber ein sehr seltsames Problem:
Wenn ich beide Werte nacheinander einlese bekomme ich 2 mal den gleichen Wert. Dieser Wert entspricht aber weder dem des Bandgap noch dem des Temp. Sensor!
Lese ich beides einzeln ein, so bekomme exakt stimmende Werte (z.B. 35 für den LM35 und 224 für den Bandgap)!
Es geht aber noch besser...nehme ich den gleichen Code und füge ein 500ms Pause zwischen den Messungen ein, so bekomme ich stimmende Werte die aber um ca. +-10 schwanken. Stecke ich den LM35 aus, so stimmt der Bandgapwert nichtmehr und anstatt das der Wert des LM35 wild schwankt, stellt sich der auf den Wert 317 ein.
Hier der Code:
$regfile = "M48def.dat"
$crystal = 16000000
$baud = 19200
Dim Ref As Word , Temp As Word , L As Byte , H As Byte , Ad As Bit
Declare Sub Temp
Declare Sub Bandgap
Adcsra = &B10010111
Sreg.7 = 1
Do
Bandgap
Waitms 500
Temp
Print Ref ; ";" ; Temp
Wait 1
Loop
Sub Temp
Admux = &B01000011
Adcsra.6 = 1
Do
If Adcsra.4 = 0 Then
L = Adcl
H = Adch
Ref = Makeint(l , H)
Adcsra.4 = 1
Ad = 1
End If
Loop Until Ad = 1
Ad = 0
End Sub
Sub Bandgap
Admux = &B01001110
Adcsra.6 = 1
Do
If Adcsra.4 = 0 Then
L = Adcl
H = Adch
Temp = Makeint(l , H)
Adcsra.4 = 1
Ad = 1
End If
Loop Until Ad = 1
Ad = 0
End Sub
End
Ich bin ratlos!
Ich hab jetzt seit ein paar Tagen meinen Drucksensor laufen, der bringt auch gute Werte. Für eine exakte Druckmessung brauche ich aber noch die genaue Betriebsspannung und die Temperatur.
Für die Temperatur nehme ich einen LM35, den ich irgendwo ausgeschlachtet hab.
Für die Betriebsspannugn nehme ich den internen Bandgap von meinem Mega48 und rechne die Spannung folgendermasen aus:
1,1V (Vom Bandgap) / ADC-Wert * 1023 = Betriebsspannung
Die Temperatur vom LM35 (der gibt 10mV/°C) lese ich direkt am ADC ein. Da bekomme ich eine Auflösung von ca. 1°C.
Jetzt habe ich ein Programm geschrieben, das zuerst den Bandgap liest, dann den LM35. Das ganze wird an den PC geschickt.
Nun hab ich damit aber ein sehr seltsames Problem:
Wenn ich beide Werte nacheinander einlese bekomme ich 2 mal den gleichen Wert. Dieser Wert entspricht aber weder dem des Bandgap noch dem des Temp. Sensor!
Lese ich beides einzeln ein, so bekomme exakt stimmende Werte (z.B. 35 für den LM35 und 224 für den Bandgap)!
Es geht aber noch besser...nehme ich den gleichen Code und füge ein 500ms Pause zwischen den Messungen ein, so bekomme ich stimmende Werte die aber um ca. +-10 schwanken. Stecke ich den LM35 aus, so stimmt der Bandgapwert nichtmehr und anstatt das der Wert des LM35 wild schwankt, stellt sich der auf den Wert 317 ein.
Hier der Code:
$regfile = "M48def.dat"
$crystal = 16000000
$baud = 19200
Dim Ref As Word , Temp As Word , L As Byte , H As Byte , Ad As Bit
Declare Sub Temp
Declare Sub Bandgap
Adcsra = &B10010111
Sreg.7 = 1
Do
Bandgap
Waitms 500
Temp
Print Ref ; ";" ; Temp
Wait 1
Loop
Sub Temp
Admux = &B01000011
Adcsra.6 = 1
Do
If Adcsra.4 = 0 Then
L = Adcl
H = Adch
Ref = Makeint(l , H)
Adcsra.4 = 1
Ad = 1
End If
Loop Until Ad = 1
Ad = 0
End Sub
Sub Bandgap
Admux = &B01001110
Adcsra.6 = 1
Do
If Adcsra.4 = 0 Then
L = Adcl
H = Adch
Temp = Makeint(l , H)
Adcsra.4 = 1
Ad = 1
End If
Loop Until Ad = 1
Ad = 0
End Sub
End
Ich bin ratlos!