(Ja ich weiß, kann man auch mit ISR machen, aber zum testen reicht ein
delay :))
Bei recht konstanter Raumtemperatur mache ich folgendes:
1. adc_init_temperature() und dann Temperatur auslesen. Ich erhalte eine
plausible Temperatur. z.b. 0x201 oder mit Finger drauf 0x208
2. adc_init() und dann ADC auslesen. Funktioniert bestens.
3. adc_init_temperature() und dann Temperatur auslesen. Das Ergebnis
weicht stark vom ersten ab und ist nicht mehr sinnvoll z.b. 0x101 oder
mit Finger drauf 0x107
4. adc_init() und dann ADC auslesen. Funktioniert bestens.
Was mache ich falsch? Warum erhalte ich einen falschen Wert beim zweiten
mal auslesen der internen Temperatur des MCU?
... denke, sieht so aus weil
ADC0.CTRLC = 0x10, hier wird VDD (>1.1V) als Ref. selected UND danach
für Tp internal Ref. 1.1V ... jetzt braucht der Klotz Zeit um die
vorhandenen internen Chipkapazitäten auf 1.1V zu entladen. Das wäre auch
plausibel mit deinen beobachten Werten, die viel kleiner sind, weil der
ADC länger Vref >1.1V sieht.
Es gibt verschiedenen Lsg. dazu, z.B. kurz warten nach Vref change oder
Rescaling und Vref 2.5V oder auch 4.3V je nach Tp, Vdd, Fclk ...
ODER setze mal VREF.CTRLB ... dann wäre die Zeit zum Einschwingen von
Vref Thema, aber deine Beobachtung spricht eher für den ersten Hinweis.
Bit 1 – ADC0REFEN ADC0 Reference Force Enable
Writing a '1' to this bit forces the voltage reference for the ADC0 to
be running, even if it not requested.
Writing a '0' to this bit allows to automatic enable/disable of the
reference source by the peripheral.
... und z.B. ADC0.CTRLC = 0x10 ... , Magic Numbers zu sehen ist ganz
böse!
Ich habe nach dem VREF setzen 300ms eingebaut.
Ich bekomme jetzt beim ersten und zweiten lesen 0x103 bei beiden raus.
Das Problem daran ist aber, dass es zu wenig ist. Sprich es wären ca.
150K. Da ich noch tippen kann, denke ich, es ist wärmer.
Am konvertieren der Temperatur sollte es nicht liegen, die habe ich im
Grunde 1:1 aus dem Datenblatt übernommen. Werfe ich da 0x204 rein, kommt
ca. 2X°C bzw. knapp 296k raus, was schon hin kommt.
Ich versteh es nicht :-(
Zurückrechnen auf VRef geht nicht.
Ich lese den ADC Wert aus dem Register, der Wert wird mit dem Geräte
spezifischen Wert (Verstärkung und Offset) multipliziert bzw. abgezogen.
Dabei wird, wenn ich das richtig verstehe, angenommen, dass VREF 1,1V
ist. Raus kommt dann ein Wert in Kelvin.
Ich habe mal etwas getestet:
Wenn ich VREF auf 1,5V setze, steigt der ADC Wert über VREF 1,1V
Wenn ich VREF auf 2,5V setze, sinkt der ADC Wert unter VREF 1,5V
Wenn ich VREF auf 4,5V setze, sinkt der ADC Wert unter VREF 2,5V
Irgendwas ist hier doch faul. Ich weiss nicht weiter.
Freue mich über jegliche Hinweise.
eventuell ........
2. Silicon Errata Issues
2.1 Errata Details
- Erratum is not applicable.
X Erratum is applicable.
* This silicon revision was never released to production.
2.2 Device
2.2.1 The Temperature Sensor is Not Calibrated on Parts with Date Code
727, 728 and 1728 (Year 2017,
Week 27/28)
The temperature sensor is not calibrated on parts with date code 727/728
(used on QFN packages) and 1728 (used
on SOIC packages).
Work around
If temperature sensor calibration data is required, devices with the
affected date code may be returned through the
Microchip RMA service. Devices with this date code are no longer shipped
by Microchip.
mfg