Vorzeichen drehen

Gast #6714691
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 #6714704
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?
Gast #6714744
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

Eine eigene Frage? Dieser Thread ist über 5 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.