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

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