www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Butterfly Natürlicher Logarithmus?


Autor: bluewhile (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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:
volatile double ADC_Out(uint16_t adc)
{
    return ((4250/(log(adc/(1024-adc))+(4250/298)))-273);
}

Wenn ich nun
#include <math.h>
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?

Beitrag #2107622 wurde von einem Moderator gelöscht.
Autor: Serieller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Serieller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: bluewhile (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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....

Autor: bluewhile (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
statt
utoa()
 verwende ich nun
dtostre( ADC_Out(ADC_Read(0)),buffer,10)
, aber ich habe wohl noch irgendwo einen Fehler in der formel amsonsten 
scheint es zu funktionieren - DANKE!

Autor: DerAlbi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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) )

Autor: bluewhile (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jaja ;D hab es nun endlich zum laufen gebracht:
volatile float ADC_Out(uint16_t adc)
{
    return (float)(4250.0/(log((-1.0*adc)/(adc-1024.0))+(4250.0/298.0))-273.0);
  
}

PAAAAAAAAAAARTYYYYYYY :D

Autor: eProfi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Beitrag #2111119 wurde vom Autor gelöscht.
Autor: Zwölf Mal Acht (hacky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dabei ist der Log() gar nicht so schwierig :
http://www.ibrtses.com/embedded/logarithms.html
aber wenn die Leute die ganze math Library dabei haben wollen...

Autor: eProfi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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:
__flash int TEMP_Celcius_pos[] =    // Positive Celcius temperatures (ADC-value)
        {                           // from 0 to 60 degrees
            806,796,786,775,765,754,743,732,720,709,697,685,673,661,649,
            636,624,611,599,586,574,562,549,537,524,512,500,488,476,464,
            452,440,429,418,406,396,385,374,364,354,344,334,324,315,306,
            297,288,279,271,263,255,247,240,233,225,219,212,205,199,193,
            187,
        };

__flash int TEMP_Celcius_neg[] =    // Negative Celcius temperatures (ADC-value)
        {                           // from -1 to -15 degrees
            815,825,834,843,851,860,868,876,883,891,898,904,911,917,923,
        };
     
__flash int TEMP_Farenheit_pos[] =  // Positive Farenheit temperatures (ADC-value)
        {                           // from 0 to 140 degrees
        938, 935, 932, 929, 926, 923, 920, 916, 913, 909, 906, 902, 898, 
        894, 891, 887, 882, 878, 874, 870, 865, 861, 856, 851, 847, 842, 
        837, 832, 827, 822, 816, 811, 806, 800, 795, 789, 783, 778, 772, 
        766, 760, 754, 748, 742, 735, 729, 723, 716, 710, 703, 697, 690, 
        684, 677, 670, 663, 657, 650, 643, 636, 629, 622, 616, 609, 602, 
        595, 588, 581, 574, 567, 560, 553, 546, 539, 533, 526, 519, 512, 
        505, 498, 492, 485, 478, 472, 465, 459, 452, 446, 439, 433, 426, 
        420, 414, 408, 402, 396, 390, 384, 378, 372, 366, 360, 355, 349, 
        344, 338, 333, 327, 322, 317, 312, 307, 302, 297, 292, 287, 282, 
        277, 273, 268, 264, 259, 255, 251, 246, 242, 238, 234, 230, 226, 
        222, 219, 215, 211, 207, 204, 200, 197, 194, 190, 187, 
        };

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.