13.09.2013, 07:55 PM
Zitat:Original geschrieben von Rumgucker
Zitat:Original geschrieben von christianw.
Und die BG ist, zumindest im AtMega168 nicht 100% temperaturunabhängig.
Der Tiny85 hat intern ne Temperaturmesseinrichtung. Vielleicht geht damit noch was.
Ja, und ziemlich genau.
Beim Atmega168P (der auf dem MotorcontrollerBoard) musste ich Offset und Anstieg korrigieren.
Code:
Const Vcc_comp = 1050 ' Bandgap compensation via measured AVCC by DMM
' Temperaturkompensation nach doc8108.pdf
' 2 Punkt Kalibrierung
' T_offset = ((ADC_T2 - ADC_T1)/(T2 - T1))*(-T1)+ADC_T1
' k = T2 / (ADC_T2 - T_offset)
' T = (ADC_T - T_offset) * k
'
' eigene Werte:
' ADC_T1 = 354 ; T1 = 22.3C
' ADC_T2 = 369 ; T2 = 31.6C
' T_offset = 318 ; k = 0.62
Const T_offset = 318
Const K = 0.62
..
Config Adc = Single , Prescaler = Auto , Reference = Internal_1.1
Waitms 20 'wait for reference to settle
Start Adc
Adc8_get = Getadc(8)
Temp = Adc8_get - T_offset
Temp = Temp * K
Stop Adc
Config Adc = Single , Prescaler = Auto , Reference = Avcc
Waitms 50 'wait for reference to settle
Start Adc
Adc14_get = Getadc(14) ' get AVCC via ADC - DROP first reading (p.251)
Waitms 100
Adc14_get = Getadc(14) ' get AVCC via ADC
Vcc = Vcc_comp / Adc14_get ' Bandgap compensation via measured AVCC by DMM
Nicht vergessen darf man, dass bei einer Umschaltung der Referenz einige Zeit vergehen muss, bis sich die neue Referenz eingeschwungen hat. Bei Verwendung eines externen C an ARef, dauert das je nach Größe des C. Vorallem, wenn man von einer höheren Spannung herunterschaltet. Ein Umweg kann sein, im Zwischenschritt GND als Referenz zu wählen.
Bspw: AVCC (5V) -> GND (0V) -> IBG (1V1)
Laut Datenblatt sollte man das Ergebnis der ersten Messung nach einer (Um)Parametriesierung immer in' Skat drücken. Man kann ja auch die eigene Versorgungsspannung gegen IBG (intern BG Referenz) messen. Da ist die erste Messung hier immer falsch.