Vorzeichen drehen

Gast #6714691
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren