Hallo,
ich bin erneut am verzweifeln, nach dem ich es nun endlich geschaft habe
den NTC des Butterflys auszulesen fehlt nur noch der letzte Schritt: das
Umwandeln des ADC-Wertes in Celsius. Dazu habe ich in der Manual (S.22)
eine Formel gefunden:
einbinde kommt folgender Fehler:
gcc plug-in: Error: Object file not found on expected location
C:\Users\Paul\Desktop\AVRBUTTERFLY\default\main.elf
Was mache ich falsch?
Möglicherweise hast du die Mathelibrary nicht dazu gelinkt und die
Funktion log() ist dem Linker unbekannt und es wurde deshalb kein
main.elf erzeugt.
Da sollte es aber eine entsprechende Fehlermeldung des Linkers gegeben
haben. Hast du bereits alle Fenster/Tabs in der IDE (AVR-Studio?) darauf
abgesucht?
Man muss dazu sagen, dass ich normalerweise Java programmiere (und darin
auch mein Abitur mache) und vollkommen neu in C bin. Habe nun wie in dem
Link beschrieben die libm Bibliothek eingebunden und werde das mal
testen....
log(adc/(1024-adc))
adc ist eine Ganzahl. 1024 ist eine Ganzahl. Die ganze Berechung ist
also ganzzahlig. Erst das Ergenis wird zu float konvertiert. Da findet
sich ordentlich numerisches fehlerpotential.
Bleib lieber bei Java, spielkind ;-) Nee scherz :-D
caste alles du float und gut ist.
--> log( ((float)adc) / (1024.0f-adc) )
Danke für das Posten der Lösung.
Von den 16k des atMega169 dürfte jetzt nicht mehr allzuviel frei sein.
Dashalb wird in der Originalversion eine Tabelle verwendet.
Alternative:
Beitrag "ADC-Wert z.B. in Spannung umrechnen und dezimal ausgeben mittels Tabellen, auch Linearisieren"Beitrag "Temperaturmessung mit NTC"
(float) ist überflüssig, 1.0 ebenso
return 4250.0/(log(-adc/(adc-1024.0))+(4250.0/298.0))-273.0;
gleichbedeutend mit
return 4250.0/(log(adc/(1024.0-adc))+(4250.0/298.0))-273.0;
oder noch kürzer:
return 4250/(log(adc/(1024.0-adc))+(4250.0/298))-273;
Probe:
ADC temp
0 -273.000 (undefiniert, da +unendlich)
64 94.848
128 72.084
192 59.150
256 49.871
320 42.439
384 36.070
448 30.345
512 25.000
576 19.840
640 14.695
704 9.388
768 3.686
832 -2.783
896 -10.778
960 -22.555
999 -36.266
Wer wissen will, wie die Tabelle der Butterfly-Software berechnet wird,
im Anhang das Programm dazu.
Zur Auswertung bietet sich eine binäre Suche an, da die Tabelle stetig
fallend ist.
Ich würde auch nicht auf positive und negative Temperaturen
unterscheiden, sondern alles in eine Tabelle packen (wie bei
Fahrenheit), dann bei negativen Werten ein '-' drucken und den Wert
invertieren:
if(t<0){printf("-");t=-t;}
Außerdem am Schluß ein Ansatz, wie man die Genauigkeit mittels
Interpolation verbessern kann.
Außerdem wird in der BF-Software der ADC 8 mal addiert, um genauer zu
werden, danach wird aber durch 8 dividiert - das hätte ich weggelassen.
Hier die Original-Tabellen: