Forum: Mikrocontroller und Digitale Elektronik Vorzeichen drehen


von Berno (Gast)


Lesenswert?

Guten Morgen,

ich hänge etwas mit einer Funktion welche mir die ADC Werte in Grad 
ausgebne soll.
Auf Grund der Lage der Sensoren müssen 3 Werte Invertiert werden. was 
jedoch komischerweise falsche Werte ausgibt.

1
#define DegreeMulti    0.4245
2
3
//werden in anderer Funktion geschriebe
4
unsigned int  Cal_RX;  
5
unsigned int  Cal_RY;   
6
unsigned int  Cal_LX;
7
unsigned int  Cal_LY;
8
//-------------------------------------
9
10
/*************************************************************************
11
 single read from ADC at channel
12
*************************************************************************/
13
uint16_t ADC_Read( uint8_t channel ){
14
15
  // Kanal waehlen, ohne andere Bits zu beeinflußen
16
  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
17
  ADCSRA |= (1<<ADSC);                // eine Wandlung "single conversion"
18
  while (ADCSRA & (1<<ADSC) ) { ; }          // auf Abschluss der Konvertierung warten
19
  
20
  return ADCW;                    // ADC auslesen und zurückgeben
21
}
22
23
/*************************************************************************
24
 average measurement from channel with n samples 
25
*************************************************************************/
26
uint16_t ADC_Read_Avg( uint8_t channel, uint8_t nsamples ){
27
  uint32_t sum = 0;        // beachte: Wertebereich der Summenvariablen
28
  for (uint8_t i = 0; i < nsamples; ++i ) {
29
    sum += ADC_Read( channel );
30
  }
31
32
  return (uint16_t)( sum / nsamples );
33
}
34
35
36
37
void GetDegree(void){
38
  Degree_LX = (Degree_LX + (signed int)(ADC_Read_Avg(7,5)-Cal_LX) * DegreeMulti) /2;
39
  Degree_LY = (Degree_LY + (signed int)(ADC_Read_Avg(6,5)-Cal_LY) * DegreeMulti) /2;
40
  Degree_RX = (Degree_RX + (signed int)(ADC_Read_Avg(5,5)-Cal_RX) * DegreeMulti) /2;
41
  Degree_RY = (Degree_RY + (signed int)(ADC_Read_Avg(4,5)-Cal_RY) * DegreeMulti) /2;
42
  
43
    
44
  {char Buffer[20];itoa(Degree_LX, Buffer, 10 );uart_puts( Buffer );}  
45
  uart_puts(" ; ");    
46
  {char Buffer[20];itoa(Degree_LY, Buffer, 10 );uart_puts( Buffer );}  
47
  uart_puts("  /  ");    
48
  {char Buffer[20];itoa(Degree_RX, Buffer, 10 );uart_puts( Buffer );}  
49
  uart_puts(" ; ");    
50
  {char Buffer[20];itoa(Degree_RY, Buffer, 10 );uart_puts( Buffer );}  
51
  uart_puts("\r\n");    
52
}


So sind alle Werte plausibel und korrekt.
Das komisch aussehende mit der Division durch 2 usw. ist nur um eine 
kleine Trägheit in den Wert zu bekommen.

Mache ich jetzt hinterher
1
Degree_LX=-Degree_LX;
Und lasse mir dioe Werte ausgeben
kommen z.B. statt 90° nur ca 29° oder ähnliches

Kann mir das bitte jemand erklären

von Hermann G. (df2ds)


Lesenswert?

Wie/wo  ist denn Degree_LX überhaupt deklariert?

von Wolfgang (Gast)


Lesenswert?

Berno schrieb:
> ich hänge etwas mit einer Funktion welche mir die ADC Werte in Grad
> ausgebne soll.

Was geben die ADC-Werte an und in welchem Bereich liegen sie.
Wie sieht die Formel für die Umrechnung aus, die du mit deiner Funktion 
implementieren möchtest?

von Julius (Gast)


Lesenswert?

Ein Integer dividiert man effizienter, wenn man es um ein Bit nach 
rechtsverschiebt.

von Julius (Gast)


Lesenswert?

Also bei einer Division durch 2. sorry vergessen.

von Berno (Gast)


Lesenswert?

Vielen Dank für die Anteilnahme!

Ich hatte einen gravierenden Denkfehler und habe positive mit negativen 
Werten verwurstelt so das nur noch Mist rauskam.

Es funktioniert alles und das Verhalten war plasiebel.


closed

von Wolfgang (Gast)


Lesenswert?

Julius schrieb:
> Ein Integer dividiert man [durch 2] effizienter, wenn man es um ein Bit nach
> rechtsverschiebt.

Heutige Compiler wissen das und können solche offensichtlichen Dinge 
selbst optimieren.

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.