Hallo,
ich möchte mit einem Encoder 250 Teilungen der nach dem Auswerten 1000
Zählimpulse hat mir den Winkel Seriell auf meinem Hterm anzeigen lassen.
dazu muß ich 1000/360= 2.777 Grad Pro Schritt Rechnen richtig ?
jetzt habe ich aber bei der Ausgabe ein Problem, das der Wert überhaupt
nicht stimmt.
das mit Sicherheit an meiner Schreibweise für die Ausgabe liegt. Da hab
ich natürlich schon verschiedene Varianten ausprobiert, aber aktuell
habe ich es so, da wird mir nur ein ? \r\n angezeigt
1
printf("\r\n %f",enc_delta/1000*2.77);
1
volatilefloatenc_delta;
Wie kann ich das richtig ausgeben das ich mir den winkel von 0-360 Grad
ausgeben kann ?
kann mir das Bitte jemand zeigen, ich habe auch ein Buch wo das mit den
Ausgabeformaten steht, mit % i, d, f, c usw. aber Irgenwie steig ich da
gerade nicht durch.
Grüsse Huber
Du hast den Dreisatz einfach nur falsch angewendet.
Überlege Dir, ob dein zu berechnender Winkel zu 360 oder 1000 gehört!
Überlege Dir, ob Dein enc_delta zu 360 oder 1000 gehört!
Wenn Dir das klar ist, erstelle die passende Verhältnisgleichung.
Im übrigen hilft es bei der Erstellung von Gleichungen die
physikalischen Einheiten mitzuführen. Kommt die richtige einheit raus,
ist die Wahrscheinlichleit hoch das die Gleichung stimmt. Passt die
Einheit des Ergebnisses nicht, stimmt die Gleichung nicht.
also dasmit der berechnug bekomme ich dann schon hin, mein Problem ist
die richtige Ausgabe.
ich dachte, wenn ich mit komma Zahelen rechne, dann muss ich die
Variable in float benennen und bei der Ausgabe auch auf float achten
"%f" da kommt nur ein ? raus und %d kommt nur irgendwas mit +30000 und -
30000 am terminal
1
#define F_CPU 16000000UL
2
#define BAUD 9600UL
3
4
#include<util/delay.h>
5
#include<string.h>
6
#include<stdlib.h>
7
#include<stdio.h>
8
#include<ctype.h>
9
#include<avr/io.h>
10
#include<avr/interrupt.h>
11
#include"serial2.h"
12
13
FILEmystdout=FDEV_SETUP_STREAM(uart_putchar,uart_getchar,_FDEV_SETUP_RW);// Wandelt putchar und getchar in printf um
Michael H. schrieb:> also dasmit der berechnug bekomme ich dann schon hin, mein Problem ist> die richtige Ausgabe.
Das sieht hier aber ganz anders aus.
Der Encoder gibt dir 1000 Inkremente / 360°.
Ein Inkrement entspricht demnach einem Tausendstel von
dreihundertsechzig grad.
Klingelts!?
Hauke Haien schrieb:> Michael H. schrieb:>> also dasmit der berechnug bekomme ich dann schon hin, mein Problem ist>> die richtige Ausgabe.>> Das sieht hier aber ganz anders aus.> Der Encoder gibt dir 1000 Inkremente / 360°.> Ein Inkrement entspricht demnach einem Tausendstel von> dreihundertsechzig grad.> Klingelts!?
1
printf("\r\n %d",enc_delta*0.36);
1
printf("\r\n %i",enc_delta*0.36);
1
printf("\r\n %f",enc_delta*0.36);
1
printf("\r\n %c",enc_delta*0.36);
1
printf("\r\n %o",enc_delta*0.36);
1
printf("\r\n %s",enc_delta*0.36);
1000*0.36= 360
aber ich bekomme ja das richtige Ausgabeformat nicht hin, das es mir den
Wert richtig im Terminal anzeigt, egal was ich von oben genannten
probiere bekomme ich irgend etwas auf dem Terminal angezeigt aber keine
komma Zahl.
Ausgabe float variable:
float value = 0.0;
printf("value = %f\n",value);
Das stimmmt schon so. Allerdings ist die Frage ob die Verwendung von %f
im printf in den AVR Bibliotheken überhaupt realisiert ist. Denn die
Verwendung von float kostet ziemlich viel Ressourcen. Das muss dir aber
ein AVR Experte beantworten.
In der Regel ist es besser rein mit Integer-Variablen zu arbeiten,
sprich also mit Festkomma Zahlen. und dafür dann eine eigene
Ausgabefunktion zu schreiben.
Es kann sogar sein, dass Du solche ausgabe Funktionen wie printf()
sowieso allein implementieren musst. Eventuell sind sie zwar bekannt,
und könnten verwendet werden aber die eigentliche Implementation fehlt
ganz.
Denn bezogen auf den eigentlichen Mikrocontroller IC ist ja ohne
konkrete Anwendung und Schaltung ja erstmal nicht klar, wo solche
Ausgaben überhaupt erfolgen sollen.
Aber wie oben geschrieben, das ist ein Thema für einen AVR Experten der
den Compiler genau kennt.
hier ist mal meine Serial.h dateies muss doch möglich sein den wert
ausgeben zu können.
weil oben gennnant integer (Ganzzahl) mit festkomma Zahlen. Ich will
nicht float unbedingt hernehmen, aber ich dachte float ist di einzige
Bezeichnung mit der ich kommastellen darstellen kann
1
/*serial2.h*/
2
3
4
#ifdef UCSR0A
5
6
//Initialisiert UART gegebener Oszillatorfrequenz und Baudrate
7
voiduart_init(longOszi,longBaud)
8
{
9
if((Oszi/16L/Baud-1)>30)
10
{
11
UBRR0L=(unsignedchar)(Oszi/16L/Baud-1);
12
UBRR0H=(unsignedchar)((Oszi/16L/Baud-1)>>8);
13
UCSR0A=0;
14
}
15
else
16
{
17
//Falls Teilerwert zu klein => Rundungsfehler
18
//Daher doppelte Rate waehlen
19
UBRR0L=(unsignedchar)(Oszi/8L/Baud-1);
20
UBRR0H=(unsignedchar)((Oszi/8L/Baud-1)>>8);
21
UCSR0A=(1<<U2X0);
22
}
23
24
UCSR0B=UCSR0B|(1<<TXEN0)|(1<<RXEN0);
25
UCSR0C=UCSR0C|(1<<UMSEL01)|(1<<UCSZ01)|
26
(1<<UCSZ00);
27
}
28
29
//Sendet 1 Byte an UART
30
intuart_putchar(chardata,FILE*stream)
31
{
32
while(!(UCSR0A&(1<<UDRE0)));
33
UDR0=(char)data;
34
return0;
35
}
36
37
//Empfaengt 1 Byte vom UART
38
staticintuart_getchar(FILE*STREAM)
39
{
40
while(!(UCSR0A&(1<<RXC0)));
41
return(UDR0);
42
}
43
44
#else
45
46
//Initialisiert UART gegebner Oszillatorfrequenz und Baudrate
Frickelfritze schrieb:> int main()> {> unsigned int hundertselgrad = 18234;> while (1)> {> printf("Winkel ist %u.%02u Grad\r\n", hundertselgrad/100,> hundertselgrad%100);> //delay_ms(1000);> hundertselgrad += 456;> }
Danke, das ist ein Traum. unter welchen Schlagwort kann ich denn das
noch im Netz finden. alles aber das steht nicht in meinem Buch
Michael H. schrieb:> aber ich bekomme ja das richtige Ausgabeformat nicht hin, das es mir den> Wert richtig im Terminal anzeigt, egal was ich von oben genannten> probiere bekomme ich irgend etwas auf dem Terminal angezeigt aber keine> komma Zahl.
Das liegt wahrscheinlich an die printf-Geschichte, da muss man was am
Linker oder so einstellen damit printf auch %f kann. Ich umgehe das nur
immer mit folgendem Code weshalb ich da nicht genau sagen kann was da im
Busch ist.
1
...
2
floatmyFloat=3.1415;
3
charmyValueToSend[7];
4
...
5
dtostrf(myFloat,// Variable die zum String gewandelt werden soll
6
6,// Gesamtzahl der Stellen incl. Komma
7
4,// Zahl der Nachkommastellen
8
myValueToSend);// String-Variable, in die die Wandlung soll