Forum: Mikrocontroller und Digitale Elektronik Analosignal mit Microkontroller auslesen


von µBeginner (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

ich habe folgendes Problem:
Ich möchte mit meiner Magnetsteuerung (s. Datenblatt im Anhang) eine 
Spannung messen, die von einer Kraftmessdose erzeugt wird. Als 
Analogeingang nehme ich den ADC5 des Microcontrollers.
Ich habe dazu ein C-Programm geschrieben (siehe Anhang). Als 
Referenzspannung für den ADC Converter habe ich die internen 2,56 V des 
Microcontrollers genommen.
Gemäß meinem Programm soll die Lampe auf dem Mirkocontroller leuchten, 
sobald eine Spannung von  >= 2,5 V an dem Analogeingang ADC5 (Komport 
Link 2 auf der Magnetsteuerung) gemessen wird.
Mein Problem ist, dass sie sofort leuchtet, sobald nur die geringste 
Spannung (z.B. Finger ranhalten) an dem Eingang anliegt.

Hat da vllt. jemand eine Idee, woran dies liegen könnte? Ich weiß auch 
nicht, an welchen Analogeingang ich die Kraftmessdose noch anschließen 
kann, da sämtliche Analogeingänge von der Magnetsteuerung belegt weden 
:/..
1
#include <avr/io.h>
2
#define F_CPU 8000000UL
3
4
void ADC_Init(void)
5
{
6
  // die Versorgungsspannung AVcc als Referenz wählen und ADC0 als Input Kanal auswählen:
7
  //ADMUX = (1<<REFS0);    
8
  // oder interne Referenzspannung als Referenz für den ADC wählen:
9
   ADMUX = (1<<REFS1) | (1<<REFS0);
10
 
11
  // Bit ADFR ("free running") in ADCSRA steht beim Einschalten
12
  // schon auf 0, also single conversion
13
  ADCSRA = (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0) ;     // Frequenzvorteiler auf 128 stellen; TFmin = 40M TFmax= 160
14
  ADCSRA |= (1<<ADEN);                  // ADC aktivieren
15
 
16
  /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
17
     also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
18
 
19
  ADCSRA |= (1<<ADSC);                  // eine ADC-Wandlung 
20
  while (ADCSRA & (1<<ADSC) ) {         // auf Abschluss der Konvertierung warten
21
  }
22
  /* ADCW muss einmal gelesen werden, sonst wird Ergebnis der nächsten
23
     Wandlung nicht übernommen. */
24
  (void) ADCW;
25
}
26
27
/* ADC Einzelmessung */
28
uint16_t ADC_Read( uint8_t channel )
29
{
30
  // Kanal waehlen, ohne andere Bits zu beeinflußen
31
  ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
32
  ADCSRA |= (1<<ADSC);            // eine Wandlung "single conversion"
33
  while (ADCSRA & (1<<ADSC) ) {   // auf Abschluss der Konvertierung warten
34
  }
35
  return ADCW;                    // ADC auslesen und zurückgeben
36
}
37
38
int main( void )
39
{
40
  uint16_t adcval;
41
  ADC_Init();
42
  DDRD |= (1<<4);
43
 
44
  do {
45
    adcval = ADC_Read(5);  // Kanal ADC5 auswählen
46
  if (adcval >= 1000)
47
  {
48
    PORTD |= (1<<4);
49
  }
50
  else
51
  {
52
    PORTD &= ~(1<<4);
53
  }
54
  } while( 1 ); 
55
  }

von Horst (Gast)


Lesenswert?

Etwas ähnliches zum Ableiten unter 
http://www.grilec.com/avrbastelkiste.html
(zwei mal ADC auslesen)
Vielleicht kannst du davon etwas gebrauchen...

von J. T. (chaoskind)


Lesenswert?

Das Problem ist, das du über deinen Finger 50Hz in den vermutlich recht 
hochohmigen Eingang einkoppelst. Damit ist immer für eine halbwelle oder 
mehr oder weniger, je nach Kopplung. Vermutlich blinkt die LED mit 50Hz. 
Oszillatoren oder Multimeter mit Frequenzmessung vorhanden?

von Karl H. (kbuchegg)


Lesenswert?

µBeginner schrieb:

> Mein Problem ist, dass sie sofort leuchtet, sobald nur die geringste
> Spannung (z.B. Finger ranhalten) an dem Eingang anliegt.

Daraus schliesse ich, dass du zur Zeit den Eingang im Prinzip offen 
hast.

Du unterliegst einem Trugschluss. Ein offener Eingang liegt mit nichten 
auf einem 0V Potential. Ein offener Eingang ist eine Antenne, die sich 
jedes noch so kleine elektromagnetische Feld aus der Umgebung einfängt. 
Und auch dein Körper ist eine Antenne.

Um die Eingangsspannung unter kontrollierten Testbedingungen zu testen, 
musst du schon ein Potentiometer (10k) als Spannungsteiler verschalten. 
Erst dann wirst du feststellen, dass deine ADC Messung einen 
vernnünftigen Wert ergibt, der bei ca. 2V den Ausgang umschaltet. Ein 
offener Eingang, an den du mit dem Finger drann kommst, ist dazu nicht 
geeignet.

von µBeginner (Gast)


Lesenswert?

Vielen Dank Karl Heinz!

Das hat mich ein ganzes Stück weiter gebracht.

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.