Forum: Mikrocontroller und Digitale Elektronik Problem mit ADC/UART


von Doran S. (utzer)


Lesenswert?

Hallo,

ich habe ein Programm für einen ATmega32 geschrieben. Da wird eine 
Spannung mit dem ADC gemessen.
Die eigentlich Messung funktioniert auch, ich erhalte den ADC-Wert ohne 
Probleme.
Doch dieser Wert ist nun in einem int.
Nun möchte ich daraus die Spannung berechnen. Wie das eigentlich 
funktioniert ist mir auch klar, mit dem Taschenrechner funktioniert auch 
alles, nur im µC nicht.
Meine Referenzspannung beträgt 5V. Ich setzte einen Spannungsteiler ein, 
1k nach Masse, 10k nach Plus, in der Mitte ist der ADC-Pin.
somit erhalte ich bei 12V einen Wert von ca. 223.

Ich habe bereits versucht, nun mit dem Mikrocontroller die Spannung zu 
errechnen und über den UART auszugeben, doch leider bisher ohne Erfolg.

Hier Mein Versuch:
1
        int wert;
2
  double ua;
3
  double volt;
4
  char a[100];
5
6
  uart_init();    //UART-initialisierung
7
8
    wert=lesen(0); //Nun liegt in "wert" 223....
9
    ua=(wert/1023)*5;
10
    volt=(ua/1000)*(10000+1000);
11
12
    sprintf(a, "%f", volt);
in "a" liegt jetzt leider nun "?" was mache ich falsch???
Mein UART funktioniert soweit ganz gut......
Ich glaube, mein größstes Problem ist die Umrechnung von double nach 
char a[100]

wo liegt der Fehler?

mfg

utezr

von Michael U. (amiga)


Lesenswert?

Hallo,

Doran S. schrieb:
>
1
>         int wert;
2
>   double ua;
3
>   double volt;
4
>   char a[100];
5
> 
6
>   uart_init();    //UART-initialisierung
7
> 
8
>     wert=lesen(0); //Nun liegt in "wert" 223....
9
>     ua=(wert/1023)*5;
10
>     volt=(ua/1000)*(10000+1000);
11
> 
12
>     sprintf(a, "%f", volt);
13
>
> in "a" liegt jetzt leider nun "?" was mache ich falsch???

ich übe mal etwas C (muß ich sowieso immernoch...

>     ua=(wert/1023)*5;
 Was amcht der Compiler?
223/1023 = 0 (ist ja alles Integer)
0 * 5 ist immernoch 0 (eigentlich nuß man nicht weitermachen...)

Oder irre ich da?

Gruß aus Berlin
Michael

von Doran S. (utzer)


Lesenswert?

Hallo,
1
  double wert=223;
2
  double ua;
3
  double volt;
4
  char a[100];
5
6
  uart_init();    //UART-initialisierung
7
8
    ua=(wert/1023)*5;
9
    volt=(ua/1000)*(10000+1000);
10
11
    sprintf(a, "%f", volt);

Wenn ich jetzt aber "a" über den UART ausgeben, dann kommt immernoch nur 
"?".....

was jetzt????

mfg

utzer

von holger (Gast)


Lesenswert?

>Wenn ich jetzt aber "a" über den UART ausgeben, dann kommt immernoch nur
>"?".....

Du hast ein sprintf() ohne Floating Point Support gelinkt.
Wie ging denn das noch im makefile?

von Gast (Gast)


Lesenswert?

Forumsuche nach "printf fragezeichen" sollte dir weiterhelfen.

von Doran S. (utzer)


Lesenswert?

Hallo,

vielen Dank für die Hilfe, es funktioniert nun, nachdem ich dashier...

http://www.mikrocontroller.net/articles/FAQ#Aktivieren_der_Floating_Point_Version_von_sprintf_beim_WinAVR_mit_AVR-Studio

...durchgeführt hatte.

Ich verstehe zwar ehrlich gesagt nicht genau, was das macht(irgentwas 
wegen dem Komma????)
Aber es funktioniert.....


mfg

utzer

von Gast (Gast)


Lesenswert?

Warum steht in dem von dir verlinkten Artikel

..."Beim WinAVR/AVR-Studio wird standardmässig eine Version der 
printf-Bibliothek verwendet, die keine Floating Point Verarbeitung 
unterstützt. Die meisten Programme benötigen keine Floating Point 
Unterstützung, sodass hier wertvoller Programmspeicherplatz gespart 
werden kann.

Benutzt man dann allerdings eine printf Variante für die Ausgabe von 
Floating Point Zahlen, so erscheint an Stelle der korrekt formatierten 
Zahl lediglich ein '?'. Dies ist ein Indiz, dass die Floating Point 
Verarbeitung im Projekt aktiviert werden muss."...

von Doran S. (utzer)


Lesenswert?

Hallo,

danke an Gast, für den Hinweis :-)
Allerdings fällt mir jetzt auf, dass meine Spannungsmessung nur ca. 
stimmt, und 11,98 anzeigt, statt 12,2(Multimeter).....
Liegt das an der Referenzspannung, ich verwende AVR-Studio und da kann 
man die noch mit so einem "Regler" einstellen(hab ich auf 5V 
gestellt)..... ich habe aber natürlich auch
REFS0 auf '1' gesetzt und REFS1 auf '0'..... also auch 5V(da der AVR ja 
mit 5V betrieben wird).....

Wie muss ich eigentlich die Fuses programmieren???
Was macht eigentlich der Statur "reserviert"(bei der Referenzspannung)?


mfg

utzer

von Karl H. (kbuchegg)


Lesenswert?

Doran S. schrieb:
> Hallo,
>
> danke an Gast, für den Hinweis :-)
> Allerdings fällt mir jetzt auf, dass meine Spannungsmessung nur ca.
> stimmt, und 11,98 anzeigt, statt 12,2(Multimeter).....

Dein 1k Widerstand wird nicht genau 1k haben.
Dein 10k Widerstand wird nicht genau 10k haben.

> Wie muss ich eigentlich die Fuses programmieren???

Kommt drauf an, was du erreichen willst.

> Was macht eigentlich der Statur "reserviert"(bei der Referenzspannung)?

Nichts. Das Bitmuster hat sich Atmel für zukünftige Erweiterungen (bei 
anderen Prozessoren) reserviert. Auf deinem µC macht diese Einstellung 
nichts, auf einem anderen µC könnte sie irgendetwas sinnvolles machen.

von spess53 (Gast)


Lesenswert?

Hi

>Liegt das an der Referenzspannung, ich verwende AVR-Studio und da kann
>man die noch mit so einem "Regler" einstellen(hab ich auf 5V
>gestellt)..... ich habe aber natürlich auch
>REFS0 auf '1' gesetzt und REFS1 auf '0'..... also auch 5V(da der AVR ja
>mit 5V betrieben wird).....

Das sind zwei paar Schuhe. Wenn du die Einstellung vom AVR-Studio nutzen 
willst müssen REFS0/1 beide 0 sein (und Jumper richtig setzen). Bei 
deiner Einstellung wird VCC als Referenz benutzt. Allerdings solltest du 
dich nicht unbedingt auf beide Werte verlassen.
Wenn du genauer messen willst, passe deinen Spannungsteiler an und 
benutze die interne Referenz.

>Was macht eigentlich der Statur "reserviert"(bei der Referenzspannung)?

Nimm es mal als: NICHT BENUTZEN!

MfG Spess

von Doran S. (utzer)


Lesenswert?

ok, danke

utzer

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
Noch kein Account? Hier anmelden.