mikrocontroller.net

Forum: Compiler & IDEs adc mess falsch


Autor: ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

zuerst danke an alle die für diese Web Seite verantwörtlich sind.

ich bin neu im Gebiet der uC. Ich habe schon einige Tutorials
durchgearbeitet und "spiele" selber noch mit dem MyAVR-Board mit einem
Mega8 ein bischen herum.

Meine Frage.
Ich will z.B. ein 0-2,3V Spannungssignal auf einem PinF0 von atmega128 
einlesen und in ein digital 10-stellige Wert umwandeln.
Der Wert muss dann über UART ausgegeben werden.

Ich benutze dazu fast 1:1 das Tutorial.
weil mein RefSpannung:3,2v ist habe ich mein analog eingang direkt ohne 
Transtor an PinF0 angeschlossen.

Was mich da wundert, Für den gleichen analog Werte sind meine 
Rückgabewerten unterschiedliche. Ich denke brauche also, dass mein 
Fehler bei der Ermittlung des Mittelwert liegt.
Wie koregiere ich das?

Danke im Voraus.


#include <avr/io.h>
#include <inttypes.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#include <string.h>

#include "uart.h"
#include "adc.h"

// define global variables
int ADIteiler=0;
char s[20];

void Adc_portinit(void) //Initialsierung
{  
  DDRF = 0x00;  // define as Input
  PORTF = 0x00;    //enables Pull-Up on PC0
}//end Adc_portinit()
  
unsigned int ADC_Read(unsigned char Mux_channel) 
{
  uint8_t i;
  uint16_t result = 0;
   
  ADCSRA = (1<<ADEN);         //enables the ADC
  ADCSRA |= (1<<ADPS2) | (1<<ADPS0);   //determine the division factor between the XTAL frequency and the input clock to the ADC. 
                    //ADC division factor auf 8 setzen Tmin = 20 , Tmax = 80 systemt clock F_CPU = 4000000
  
  ADMUX = Mux_channel;  // Analog Channel Selection  
  ADMUX |= (1<<REFS0) | (1<<REFS1);//int. REF Voltage Reference Selection
  ADMUX |= (0<<ADLAR);  //the result is right adjusted

  

  ADCSRA |= (1<<ADSC);// The ADC initialization and made a dummy readout
  while(ADCSRA & (1<<ADSC));
  result = ADCW;      // ADCW must be read once
    result = 0;// otherwise the result of the next transformation is not taken over
                          
  
  //Now reads 4 times the similar tension and selected channel channel 
  //and then calculate the average value divided by 4. Because the ADC measeres 0..1023,
  //and the Port however can only 0..255 show
  for(i=0; i<4; i++) 
  {    
    ADCSRA |= (1<<ADSC);  //a single conversion
    
    while(ADCSRA & (1<<ADSC));//waiting on conversion closing 
    
    result += ADCW;
  }
  
  ADCSRA &= (0<<ADEN);          // ADC reanables
  
  result /= 4;
    
  return result;
}//end int ADC_Read() 

void Send_adcValue(char* ADC_Value, int Length)
{
  Adc_portinit();

  if(strcmp(ADC_Value, "adc") == 0)
  {
    uart0_puts ("\r\n");
      uart0_puts ("Messwert: ");
        unsigned int result = ADC_Read(0);// Reading the Analog on PinF 0,
                      // Thus ADF0. In result steht das Ergebnis.    
    utoa( result, s, 10 );   // convert HEX-Zahlen in Ascii
    uart0_puts( s );
  }
  else
  uart0_puts("error");
}//Send_adcValue()


Autor: LordZiu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Um welche Werte schwankt es denn?

Autor: ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@LordZiu
Für den gleichen analog Werte sind meine Digitalen Rückgabewerten 
unterschiedliche.
gruß

Autor: ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also die digitalen Werte

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> weil mein RefSpannung:3,2v ist
>   ADMUX |= (1<<REFS0) | (1<<REFS1);//int. REF Voltage Reference Selection

Da passt was nicht. Die ADMUX-Einstellung ist für
"Internal 2.56V Voltage Reference with external capacitor at AREF pin"

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ulrich schrieb:
> Also die digitalen Werte

Ja schon.
Aber in welcher Größenordnung 'schwankt' der Wert?

Bei konstanter Spannung
  a) schwankt der Wert um +/- 100
  b) schwankt der Wert um +/- 1 oder 2

eine kleine Schwankung wirst du immer haben, es sei denn du nimmst mehr 
als 4 Werte zum mitteln. b) ist also nicht beunruhigend. a) hingegen IST 
beunruhigend.

Autor: ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Stefan B
danke
genau hast du recht!
>>mein RefSpannung:3,2v
ist in HW settings angegeben.
Sonst mein AREF ist doch an Kondensator angeschlossen.

Leider kriege ich immer für den gleichen analog Werte unterschiedliche 
Digitalen Rückgabewerten.

gruß

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ulrich schrieb:

> Leider kriege ich immer für den gleichen analog Werte unterschiedliche
> Digitalen Rückgabewerten.

Widerspricht das deiner Ehre oder warum windest du dich so, endlich mal 
ein paar konkrete Zahlenwerte für 'unterschiedliche Digitalen 
Rückgabewerten" zu nennen?

Autor: ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Karl heinz Buchegger
danke
Messungsergebnisse:
DigitalWert               Vin
95,96,93,94,93---------->1
491,491,490,491--------->2
691,690,689------------->2,5
887,887,888,887--------->3
931,930,932,930--------->3,1
975,973,974,976--------->3,2
1023-------------------->3,5

Also dann sage ich, dass bei konstanter Spannung
    b) schwankt der Wert um +/- 1 oder 2

ist also nicht beunruhigend

>>eine kleine Schwankung wirst du immer haben, es sei denn du nimmst mehr
>>als 4 Werte zum mitteln.

kann ich denn die Schwankung beseitigen wenn ich die 4 Werte Mittellung 
entferne?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ulrich schrieb:

> ist also nicht beunruhigend

Genau. Deine Werte sind im Rahmen dessen was man erwarten kann.

> kann ich denn die Schwankung beseitigen wenn ich die 4 Werte Mittellung
> entferne?

Nicht entfernen.
Mehr Werte zum mitteln nehmen!
Aber: Je mehr Werte du mittelst, desto länger dauert auch die Messung.

Autor: ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielen Dank

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.