Hallo für eine umfangreiche Berechnung habe ich als Funktionsparameter uint16_t. der Rückgabewert ist float. Kann mir jemand beim convert helfen?? Danke im Voraus.
die Konvertierung an sich ;-) AVR verwendet 32 bit meine ich für float ich muss also meinen 16bit-breiten Funktionsparameter casten... nur wie?
1 | float calcTemp(uint16_t adcval) |
2 | {
|
3 | float retValue; // Description: der Rückgabewert ist die gemessene Temperatur in °C |
4 | |
5 | float fl_Uref = 4.4; // Description: Referenzspannung |
6 | float fl_resolutionAdc = 1023; // Description: Auflösung des ADC |
7 | float fl_rSerie = 2500; // Description: Reihenwiderstand zum pt1000 in Ohm |
8 | float fl_Rpt1000_valueA = 0.0039083; |
9 | float fl_Rpt1000_valueB = -0.0000005775; |
10 | |
11 | retValue = (sqrt(10)*sqrt(((float)250 * pow(fl_Rpt1000_valueA, 2)) + fl_Rpt1000_valueB*(((-fl_rSerie)*adcval/fl_resolutionAdc)/(adcval/fl_resolutionAdc-1))-(float)(1000*fl_Rpt1000_valueB))-(float)(50*fl_Rpt1000_valueA))/((float)100*fl_Rpt1000_valueB); |
12 | }
|
Das ergebmis soll mit dem Parameter 319 34°C sein... noch funktioniert es nicht :-(
Die Formel ist definitiv korrekt (habe es mit excel nachgerechnet --> da funktioniert es)
Deine Funktion calcTemp hat keinen Rückgabewert. Mach mal ein "return retValue;" am Ende der Funktion. Ansonsten funktionierts bei mir schon unter Visual Studio. Bei Eingabe von 319 kommt als Ergebnis 34.154675
Man... das ist ist echt peinlich... Danke dir Dennoch ist das Ergebnis nicht richtig... :-( erledigt:
1 | float calcTemp(uint16_t adcval) |
2 | {
|
3 | float retValue; // Description: der Rückgabewert ist die gemessene Temperatur in °C |
4 | |
5 | float fl_Uref = 4.4; // Description: Referenzspannung |
6 | float fl_resolutionAdc = 1023; // Description: Auflösung des ADC |
7 | float fl_rSerie = 2500; // Description: Reihenwiderstand zum pt1000 in Ohm |
8 | float fl_Rpt1000_valueA = 0.0039083; |
9 | float fl_Rpt1000_valueB = -0.0000005775; |
10 | |
11 | |
12 | retValue = (sqrt(10)*sqrt(((float)250 * pow(fl_Rpt1000_valueA, 2)) + fl_Rpt1000_valueB*(((-fl_rSerie)*adcval/fl_resolutionAdc)/(adcval/fl_resolutionAdc-1))-(float)(1000*fl_Rpt1000_valueB))-(float)(50*fl_Rpt1000_valueA))/((float)100*fl_Rpt1000_valueB); |
13 | |
14 | return retValue; |
15 | }
|
Aufruf der Funktion:
1 | float flTemp = calcTemp(319); |
2 | printf("temp: %f\n", flTemp); |
Ausgabe: "temp: ?"
rene schrieb: > Ausgabe: > > "temp: ?" http://www.mikrocontroller.net/articles/FAQ#Aktivieren_der_Floating_Point_Version_von_sprintf_bei_WinAVR_bzw_AVR-Studio
vielen vielen Dank... das hat mir wirklich weitergeholfen 1 A dieses Forum
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.