Forum: Mikrocontroller und Digitale Elektronik Atmega128 AD-Wandlung


von Daniel F. (mcnanuk)


Lesenswert?

Ich habe ein Problem mit meiner AD-Wandlung. Ih vermute den Fehler am 
Board, und wenn ich da die Beschreibung schaue (D072 von Display 3000), 
dann sehe ich folgenden Text zum ARef:

>Lötbrücke ARef bridge (J8):
>Einige (acht) Eingänge des Controllers können analoge Werte auswerten. >Wer sehr 
exakteWerte braucht, der findet am ATMega128 einen spezielle >Port für eine 
Referenzspannung:
>ARef. Oft wird eine externer Zuführung von ARef nicht benötigt (dann ist >ARef 
mit der Versorgungsspannung von 5V verbunden) – dafür haben wir >Vorbereitungen 
getroffen:
>Der Eingang ARef (Auf der Platine mit AR gekennzeichnet, zwischen F0 und >E3) 
kann über die Lötbrücke (J8) mit Vcc (5V) verbunden werden. Diese >Lötbrücke ist 
standardmäßig NICHT geschlossen. Sollten Sie die ARef für >das Anlegen einer 
eigenen Referenzspannung benötigen, so muss die Brücke >offen >sein. Solange Sie 
diese Brücke geschlossen ist, steht zudem außen >an den Pads des ARef-Anschluss 
die normale 5-Volt-Versorgungsspannung >für andere >Nutzungen zur Verfügung – wenn 
die Leitung durchtrennt ist, >legen Sie an diesem Pad bitte Ihre eigene 
Refernzspannung an.
>Hinweis für Experten: Bitte nutzen Sie nicht die interne Referenzspannung >des 
Controllers, solange Sie ARef mit Vcc verbunden haben.
>Aref hat einen eigenen 100nF Kondensator, der bereits von uns eingelötet >wurde.
1
void init_adc(void)
2
{
3
 //ADC aktivieren, Prescaler 128 da 16 Mhz
4
 ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);   
5
}
6
7
uint16_t readADC(uint8_t mux)
8
{
9
  uint8_t i;
10
  uint16_t result;
11
 
12
  ADMUX = mux;                      // Kanal
13
  ADMUX |= (0<<REFS1) | (0<<REFS0); 
14
 
15
  /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
16
     also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
17
  ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung 
18
  while ( ADCSRA & (1<<ADSC) ) {
19
     ;     // auf Abschluss der Konvertierung warten 
20
  }
21
  result = ADCW;  // ADCW muss einmal gelesen werden,
22
                  // sonst wird Ergebnis der nächsten Wandlung
23
                  // nicht übernommen.
24
 
25
  /* Messung, 100 mal und mitteln
26
     damit der Wert beim Auslesen stabiler 
27
   ist, weniger flackert.
28
  */
29
  result = 0; 
30
  for( i=0; i<100; i++ )
31
  {
32
    ADCSRA |= (1<<ADSC); 
33
    while ( ADCSRA & (1<<ADSC) ) {
34
      ; 
35
    }
36
    result += ADCW;  
37
  }
38
 
39
  result /= 100;                
40
 
41
  return result;
42
}

Ih schliesse nun meine Spannungsleitung an PF0 an. Und speichere das 
Wandlungsergebnis mit readADC(0).

Jedoch ist das Ergebnis immer 0. Ich habe auch schon 5V an den AR Port 
angelegt. Gebracht hat es nix.

Weiss jemand Rat ?

von Oliver J. (skriptkiddy)


Lesenswert?

result += ADCW;


ADCW--> heißt jetzt ADC und ist 16 bit groß. Result auch. Was meinst du 
passiert, wenn du 100 mal aufsummierst?

von Daniel F. (mcnanuk)


Lesenswert?

Hmmm also auf dem Atmega644 hat dieser Code funktioniert.
Selbst wenn ich ADCW in ADC umbenenne, und die Schleife nur einmal 
laufen lasse, kommt 0 bei rum.

Laut Handbuch sind die Beiden Pins ARef und GND nicht verbunden, und ich 
könnte eine Lötbrücke schliessen. Damit wäre ARef fest 5V, und ich 
könnte keine andere Spannung wählen.

Deshalb habe ich an diesen Pins, von extern VCC und GND angeschlossen. 
5V eben.

Trotzdem kommt nichts heraus. Oder liegt der Fehler wo ganz anders?

von Stefan O. (avrstefan)


Lesenswert?

Hab grade die Register nicht im Kopf. Hast du es schon mal mit der 
internen Referenzspannung probiert? Esterne AREF rentiert sich nur mit 
guten Spannungsreferenzen.

Was erwartest du dir mit der Mittelung über 100 Messwerte, ist dein 
Messsignal so mit Rauschen übersäht? Normalerweise sollten 4 - 16 Werte 
für eine Mittelung ausreichen, wenn das Signal nicht zu unruhig ist und 
man keine Mittelung über mehrere Perioden usw. benötigt. (Kommt aber 
natürlich immer auf den speziellen Anwendungsfall an.)

von Karl H. (kbuchegg)


Lesenswert?

Daniel F. schrieb:

> Laut Handbuch sind die Beiden Pins ARef und GND nicht verbunden, und ich
> könnte eine Lötbrücke schliessen.

Entgegen dem Rat im Handbuch möchtest du das nicht tun.
ARef ist mit einem Kondensator gegen Masse geschaltet (laut Handbuch) 
und genau das willst du haben.
Entgegen dem Rat im Handbuch wählst du AVcc als Referenzspannung lieber 
per Software aus als per Hardware.

> Deshalb habe ich an diesen Pins, von extern VCC und GND angeschlossen.
> 5V eben.

Das war schlecht.

von Daniel F. (mcnanuk)


Lesenswert?

Die 100 waren keine Absicht, mehr ein verzweifelter Versuch.
Interne Referenzspannung habe ich auch schon versucht.

ADMUX |= (1<<REFS1) | (1<<REFS0);

Aber auch hier das gleiche Ergebnis. Ich denke ich muss wirklich diese
Lötbrücken schliessen. Jedenfalls verstehe ich den Text so. (über meinem
Code).

Karl heinz Buchegger, ich will so wenig wie nötig an dem Board rumlöten. 
Aber so wie es aussieht, muss ich es tun. Wenn ich nun die Lötbrücke 
schliesse, und die Lötbrücke für AGND, dann ist bei
ADMUX |= (0<<REFS1) | (0<<REFS0);

meine ARef == 5V ... oder ?
Kann ich sie dann überhaupt noch auf 2,56 V bringen? Ich denke nicht.

von ich (Gast)


Lesenswert?

> ADMUX |= (0<<REFS1) | (0<<REFS0);

Was willst du damit erreichen?
Null oder irgendwas kommt immer irgendwas raus und nicht Null. Wenn du 
die Bits löschen willst, musst du verunden.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

1/ Lass das Board so wie im Auslieferungszustand.
Also die ARef Lötbrücke offen und nicht mit externen 5V verbunden.

2/ Wie gibt du welche Messspannung auf Pin PF0? Schaltplan so?

Vcc o----+
         |
    10k  #
    Poti #<---------o PF0
         #
         |
GND o----+

3/ Wie sieht das vollständige Programm aus? Quellcode?
Aus deiner Beschreibung geht nicht hervor, ob und wo init_adc() 
aufgerufen wird. Ohne geht es aber nicht!

von Daniel F. (mcnanuk)


Lesenswert?

Stefan B. schrieb:
> 1/ Lass das Board so wie im Auslieferungszustand.
> Also die ARef Lötbrücke offen und nicht mit externen 5V verbunden.

Okay

> 2/ Wie gibt du welche Messspannung auf Pin PF0? Schaltplan so?
>
> Vcc o----+
>          |
>     10k  #
>     Poti #<---------o PF0
>          #
>          |
> GND o----+

Nein nicht so, sondern:
 Vcc o----+ ---------o PF0

 GND o----+

Ich beziehe diese Entscheidung auf diesen Satz im Datenblatt:
The single-ended voltage inputs refer to 0V (GND).

> 3/ Wie sieht das vollständige Programm aus? Quellcode?
> Aus deiner Beschreibung geht nicht hervor, ob und wo init_adc()
> aufgerufen wird. Ohne geht es aber nicht!
1
#include <stdlib.h>
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
#include <avr/pgmspace.h>
5
#include <util/delay.h>
6
#include <string.h>
7
#include "glcd-Display3000-211.h"
8
9
10
#define KEY_DDR         DDRD
11
#define KEY_PORT        PORTD
12
#define KEY_PIN         PIND
13
#define KEY1            1
14
#define KEY4            4
15
#define KEY5            5
16
#define KEY6            6
17
#define KEY7            7
18
#define ALL_KEYS        (1<<KEY1  | 1<<KEY4| 1<<KEY5| 1<<KEY6| 1<<KEY7)
19
 
20
#define F_CPU 16000000UL
21
22
 
23
volatile uint8_t key_state;                                // debounced and inverted key state:
24
                                                  // bit = 1: key pressed
25
volatile uint8_t key_press;                                // key press detect
26
 
27
  
28
29
 
30
ISR( TIMER0_OVF_vect )                            // every 10ms
31
{
32
  static uint8_t ct0, ct1, rpt;
33
  uint8_t i;
34
 
35
  TCNT0 = (uint8_t)(int16_t)-(F_CPU / 1024 * 10e-3 + 0.5);  // preload for 10ms
36
 
37
  i = key_state ^ ~KEY_PIN;                       // key changed ?
38
  ct0 = ~( ct0 & i );                             // reset or count ct0
39
  ct1 = ct0 ^ (ct1 & i);                          // reset or count ct1
40
  i &= ct0 & ct1;                                 // count until roll over ?
41
  key_state ^= i;                                 // then toggle debounced state
42
  key_press |= key_state & i;                     // 0->1: key press detect 
43
}
44
 
45
///////////////////////////////////////////////////////////////////
46
//
47
// check if a key has been pressed. Each pressed key is reported
48
// only once
49
//
50
uint8_t get_key_press( uint8_t key_mask )
51
{
52
  cli();                                          // read and clear atomic !
53
  key_mask &= key_press;                          // read key(s)
54
  key_press ^= key_mask;                          // clear key(s)
55
  sei();
56
  return key_mask;
57
}
58
 
59
void init_PWM(void)
60
{
61
  //setting PWM-Ports as output
62
    DDRE |= (1 << PE3); 
63
  OCR3A = 0;
64
65
  TCNT3 = 0;
66
  TCCR3A |= 1<<COM3A1 | 1<<COM3A0 | 1<<WGM30;  //8 Bit fast PWM, 
67
  TCCR3B |= 1<<WGM32 | 1<<CS32;  //256 Prescaler
68
} 
69
 
70
/* Initialisiert den AD Wandler */
71
void init_adc(void)
72
{
73
 //ADC aktivieren, Prescaler 128
74
 ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);   
75
}
76
77
uint16_t readADC(uint8_t mux)
78
{
79
  uint8_t i;
80
  uint16_t result;
81
 
82
  ADMUX = mux;                      // Kanal
83
  ADMUX |= (0<<REFS1) | (0<<REFS0); // interne Referenzspannung nutzen
84
 
85
  /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
86
     also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
87
  ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung 
88
  while ( ADCSRA & (1<<ADSC) ) {
89
     ;     // auf Abschluss der Konvertierung warten 
90
  }
91
  result = ADC;  // ADC muss einmal gelesen werden,
92
                  // sonst wird Ergebnis der nächsten Wandlung
93
                  // nicht übernommen.
94
 
95
  /* Messung, 100 mal und mitteln
96
     damit der Wert beim Auslesen stabiler 
97
   ist, weniger flackert.
98
  */
99
  result = 0; 
100
  for( i=0; i<4; i++ )
101
  {
102
    ADCSRA |= (1<<ADSC); 
103
    while ( ADCSRA & (1<<ADSC) ) {
104
      ; 
105
    }
106
    result += ADC;  
107
  }
108
 
109
  result /= 4;                
110
 
111
  return result;
112
}
113
114
int main( void )
115
{
116
  unsigned char buffer[30];  
117
  uint8_t i;
118
  uint16_t adcval;
119
  init_PWM();
120
init_adc();
121
122
  DDRC = 0b11111111;
123
124
  PORTD &= ~(1<<PD5);    // PWM Pumpe aus. 
125
126
    KEY_DDR &= ~ALL_KEYS;               // konfigure key port for input
127
    KEY_PORT |= ALL_KEYS;             // and turn on pull up resistors
128
 
129
  TCCR0 = (1<<CS02)|(1<<CS00);    // divide by 1024
130
    TIMSK |= 1<<TOIE0;    // enable timer interrupt
131
   
132
  LCD_Init();  // caution: this also defines SPI for the display and also PortB (all ports but MISO are output) 
133
  
134
  delay_ms(1000);
135
       LCD_Cls(black);  
136
 
137
    sei();
138
  adcval = readADC(0);
139
  LCD_Cls(black);
140
  Orientation = Portrait180;
141
  LCD_Print(itoa(adcval,buffer,10), 1, 1, 2, 1, 1, green, black);
142
 
143
  while(1){
144
145
    OCR3A = 180;
146
147
  if( get_key_press( 1<<KEY1 ) ) {
148
  adcval = readADC(0);
149
        LCD_Cls(black);
150
    Orientation = Portrait180;
151
    LCD_Print(itoa(adcval,buffer,10), 1, 1, 2, 1, 1, green, black);
152
    }
153
  
154
155
156
  }
157
}
158
159
//  Enhanced delay-routine (wait) as as the standard delay routine (_delay_ms) is not able to delay
160
//  more than 17 ms maximum as of the used 8-bit-timer (depending on used crystal)
161
void delay_ms(uint16_t period)   //delay routine (milliseconds)
162
{
163
  for(unsigned int i=0; i<=period; i++)
164
    _delay_ms(1);
165
}

von Daniel F. (mcnanuk)


Lesenswert?

init_adc();

Das hatte ich tatsächlich vergessen. Aber was jetzt angezeigt wird ist 
nicht besser. jetzt wird permanent 1023 angezeigt. Die ARef stimmt wohl 
noch nicht.

von Karl H. (kbuchegg)


Lesenswert?

Daniel F. schrieb:
> Stefan B. schrieb:
>> 1/ Lass das Board so wie im Auslieferungszustand.
>> Also die ARef Lötbrücke offen und nicht mit externen 5V verbunden.

Genau

>> Vcc o----+
>>          |
>>     10k  #
>>     Poti #<---------o PF0
>>          #
>>          |
>> GND o----+
>
> Nein nicht so, sondern:
>  Vcc o----+ ---------o PF0
>

OK.
Kann man machen.
Deine 100 * 1024 werden dann zwar überlaufen, aber das siehst du dann 
schon. 0 darf dann nicht mehr rauskommen (oder das wäre extremer Zufall)


> uint16_t readADC(uint8_t mux)
> {
>   uint8_t i;
>   uint16_t result;
>
>   ADMUX = mux;                      // Kanal
>   ADMUX |= (0<<REFS1) | (0<<REFS0); // interne Referenzspannung nutzen

Na ja.
Was erwartest du?

Extern hast du keine Referenzspannung angeschlossen (was ok ist)
und mit dieser Einstellung wählst du aus
  AREF, internal VRef turned off

Diese Einstellung sagt also: Benutze die Spannung, die ich an ARef 
angelegt habe.
Du hast aber keine angelegt (was gut ist)

Datenblatt lesen!
Um AVcc als Referenzspannung einzustellen musst du

   ADMUX |= (0<<REFS1) | (1<<REFS0);

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Daniel F. schrieb:
> init_adc();
>
> Das hatte ich tatsächlich vergessen. Aber was jetzt angezeigt wird ist
> nicht besser. jetzt wird permanent 1023 angezeigt. Die ARef stimmt wohl
> noch nicht.

Der Wert stimmt exakt bei dieser Beschaltung.

> Nein nicht so, sondern:
>  Vcc o----+---------o PF0

Wenn ARef = Vcc misst du die angelegten Vcc 5V. Wenn ARef intern kleiner 
5V (habe im Datenblatt nicht nachgesehen, welche ARef du einstellst), 
zeigt 1023 Vollausschlag des 10-Bit ADC d.h. ggf. Übersteuerung 
gegenüber eingestelltem ARef.

Experimentiere mal mit dem Potentiometer und lese dir das Tutorial zum 
ADC durch.

von Daniel F. (mcnanuk)


Lesenswert?

Karl heinz Buchegger schrieb:
> ADMUX |= (0<<REFS1) | (1<<REFS0);

Danke das hab ich auch gerade gesehen.

So nun zeigt der AD Wandler wenigstens was an :)
Aber die Werte springen wie wild auf und ab.

Mein analogsignal liegt bei 400 mV. Da sollten doch 5v als VRef locker 
passen. Maximumsignal ist 1V.
Das heisst doch pro AD-Wert passen knapp 5 mV rein, und ich sollte dann 
bei ca 200 als AD-Wert landen. Oder liege ich falsch...

Alles sehr merkwürdig grade für mich. Der Code hat auf dem STK 500 
wunderbar gepasst. Nur hier stimmt irgendwas nicht.

von Karl H. (kbuchegg)


Lesenswert?

Daniel F. schrieb:
> Karl heinz Buchegger schrieb:
>> ADMUX |= (0<<REFS1) | (1<<REFS0);
>
> Danke das hab ich auch gerade gesehen.
>
> So nun zeigt der AD Wandler wenigstens was an :)
> Aber die Werte springen wie wild auf und ab.

Was heißt "wie wild auf und ab"?
Die letzte Stelle mag unter Umständen um +-1 oder 2 schwanken, aber der 
Rest müsste stabil stehen.

von Daniel F. (mcnanuk)


Lesenswert?

nein vollig willkürlich ... 134 600 800 5 1000 33 und so weiter

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Daniel F. schrieb:

> Mein analogsignal liegt bei 400 mV. Da sollten doch 5v als VRef locker
> passen. Maximumsignal ist 1V.

Was ist das genau für ein "Analogsignal"? Woher kommt das? Das hört sich 
fast nach einem Line-In bzw. Audiosignal an.

Schwankt die Anzeige auch, wenn du mit einem Spannungsteiler 
(Potischaltung s.o.) und einem konstanten Gleichspannungssignal 
experimentierst?

> Alles sehr merkwürdig grade für mich. Der Code hat auf dem STK 500
> wunderbar gepasst. Nur hier stimmt irgendwas nicht.

Hast du schon die Hardware beider Boards verglichen, wie das Messignal 
beim Eingang in den ADC auf beiden Boards stabilisiert wird? Achte auf 
den eventuell vorhandenen Kondensator.

von Daniel F. (mcnanuk)


Lesenswert?

Das Signal kommt von einem digitalen Barometer. Die Anzeige ist 
konstant. Die Ausgabe auch....

Das STK 500 ist Geschichte... das war ein anderes Projekt. Das spielt da 
nimmer mit rein.

von Daniel F. (mcnanuk)


Lesenswert?

Ich hab den Code mal aufs Minimum reduziert. Und immer noch zeigt der AD 
Wandler völlig wirre Werte an. volles Spektrum von 0 bis 1023 und 
zurück. jeder Schleifendurchlauf nen völlig andere Wert. Kein Muster 
erkennbar.

Da bin ich mit meinem Latein am Ende. Woran kann sowas liegen? Muss ich 
doch die Lötbrücke schliessen ? Was ist dann die richte Einstellung für 
Aref?
1
#include <stdlib.h>
2
#include <avr/io.h>
3
#include <avr/interrupt.h>
4
#include <avr/pgmspace.h>
5
#include <util/delay.h>
6
#include <string.h>
7
#include "glcd-Display3000-211.h"
8
9
 
10
#define F_CPU 16000000UL
11
12
 
13
/* Initialisiert den AD Wandler */
14
void init_adc(void)
15
{
16
 //ADC aktivieren, Prescaler 128
17
 ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);   
18
}
19
20
21
uint16_t readADC(uint8_t mux)
22
{
23
  uint8_t i;
24
  uint16_t result;
25
 
26
  ADMUX = mux;                      // Kanal
27
  ADMUX |= (0<<REFS1) | (1<<REFS0); // 
28
 
29
  /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
30
     also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
31
  ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung 
32
  while ( ADCSRA & (1<<ADSC) ) {
33
     ;     // auf Abschluss der Konvertierung warten 
34
  }
35
  result = ADC;  // ADC muss einmal gelesen werden,
36
                  // sonst wird Ergebnis der nächsten Wandlung
37
                  // nicht übernommen.
38
 
39
40
  result = 0; 
41
  for( i=0; i<1; i++ )
42
  {
43
    ADCSRA |= (1<<ADSC); 
44
    while ( ADCSRA & (1<<ADSC) ) {
45
      ; 
46
    }
47
    result += ADC;  
48
  }
49
 
50
  result /= 1;                
51
 
52
  return result;
53
}
54
55
int main( void )
56
{
57
  unsigned char buffer[30];  
58
59
  uint16_t adcval;
60
61
62
  init_adc();  
63
  LCD_Init();  // caution: this also defines SPI for the display and also PortB (all ports but MISO are output) 
64
  
65
  delay_ms(1000);
66
       LCD_Cls(black);  
67
68
  adcval = readADC(0);
69
  LCD_Cls(black);
70
  Orientation = Portrait180;
71
  LCD_Print(itoa(adcval,buffer,10), 1, 1, 2, 1, 1, green, black);
72
 
73
  while(1){
74
75
    adcval = readADC(0);
76
  LCD_Cls(black);
77
  Orientation = Portrait180;
78
  LCD_Print(itoa(adcval,buffer,10), 1, 1, 2, 1, 1, green, black);
79
 
80
  delay_ms(1000);
81
82
83
  }
84
}
85
86
//  Enhanced delay-routine (wait) as as the standard delay routine (_delay_ms) is not able to delay
87
//  more than 17 ms maximum as of the used 8-bit-timer (depending on used crystal)
88
void delay_ms(uint16_t period)   //delay routine (milliseconds)
89
{
90
  for(unsigned int i=0; i<=period; i++)
91
    _delay_ms(1);
92
}

von Karl H. (kbuchegg)


Lesenswert?

Daniel F. schrieb:

> Da bin ich mit meinem Latein am Ende. Woran kann sowas liegen? Muss ich
> doch die Lötbrücke schliessen ?

Vergiss endlich mal die Lötbrücke.
Schnapp dir ein Multimeter und miss die Spannung am ARef Pin nach. So 
wie du die Software hast, werden da 5V angezeigt werden (bzw. was du als 
Versorgungsspannung hast).

> Was ist dann die richte Einstellung für
> Aref?

ARef wird für Standardanwendung mit 100nF nach GND verbunden. Die 
Auswahl der Referenzspannung macht man im Programm.
Erst bei Sonderfällen legt man selber eine Spannung an ARef an und wählt 
im Programm aus, dass diese zu verwenden ist.

Leg doch mal eine konstante Spannung mit einem Poti an, damit wir mal 
den unbekannten Ausgang deines Barometers durch etwas Bekanntes ersetzt 
haben.

von Karl H. (kbuchegg)


Lesenswert?

> Das Signal kommt von einem digitalen Barometer.

Was weißt du darüber?

digitales Barometer und ADC ... das passt jetzt erst mal nicht wirklich 
zusammen. Was ist das für ein Teil? Datenblatt?

von Rolf P. (rolfp)


Lesenswert?

Daniel F. schrieb:
> nein vollig willkürlich ... 134 600 800 5 1000 33 und so weiter

Das sieht nach einem offenen Eingang aus. Hast du deine Spannung auch 
wirklich am richtigen Pin angeschlossen?
Oder vielleicht vergessen AGnd anzuschliessen?

Rolf

von Daniel F. (mcnanuk)


Angehängte Dateien:

Lesenswert?

Das Barometer kann digital am PC über RS232 ausgelesen werden, oder 
Analog über ne einfache Leitung

Das Barometer misst Drücke 0...2000mbar und zeigt dabei eine Spannung 
vom 0...1V

Das Funktioniert auch alles.

Am ARef messe ich 5 V konstant.

Die Werte schwanken auch, wenn der Barometer ausgeschalten ist
Airflow DB2 heisst das Ding.

@ Rolf
>Oder vielleicht vergessen AGnd anzuschliessen?
was meinst du damit ? Ich habe dort einen GND Pin neben dem ARef. Aber 
angeschlossen ist da nix.

Ich weiß ich soll es vergessen, aber auch der GND Pin verfügt über eine 
offene Lötbrücke.
>Lötbrücke AGND bridge (J9):
>Ähnliches wie die Vcc Versorgung für Aref gilt für GND von Aref. Auf Wunsch 
>können Sie,
>durch Schließen der Brücke J9 hier AGND (Das Lötpad direkt über Aref, also 
>zwischen F1 und E4 auf die Standard-Masse legen.

von Karl H. (kbuchegg)


Lesenswert?

Daniel F. schrieb:

> Ich weiß ich soll es vergessen, aber auch der GND Pin verfügt über eine
> offene Lötbrücke.
>>Lötbrücke AGND bridge (J9):
>>Ähnliches wie die Vcc Versorgung für Aref gilt für GND von Aref. Auf Wunsch
>>können Sie,
>>durch Schließen der Brücke J9 hier AGND (Das Lötpad direkt über Aref, also
>>zwischen F1 und E4 auf die Standard-Masse legen.

Diese Brücke machst du zu.
Auch beim Mega128 gibt es kein seperates AGND sondern nur ein GND (siehe 
Datenblatt)

Deinen Sensor hast du hoffentlich nicht nur mit der Signalleitung, 
sondern auch mit seiner Masseleitung mit der Masse des Mega128-Boards 
verbunden.

von Daniel F. (mcnanuk)


Lesenswert?

Wiso sollte ich denn die Masse des Barometers an das Board anschliessen. 
Wenn ich Modus 0 wähle, dann wird ddoch die anliegende Spannung gegen 0V 
genommen. Ich weiss beim nicht, wo ich die Masse Ader an das Board 
anschliessen soll und was das für einen Sinn ergibt. Das Barometer ist 
doch ein eigenständiges Gerät nebendran. (Batteriebetrieb)

von Karl H. (kbuchegg)


Lesenswert?

Daniel F. schrieb:
> Wiso sollte ich denn die Masse des Barometers an das Board anschliessen.

Plonk!

(Das war das Geräusch der Stirn die auf dem Tisch aufschlägt)


> Wenn ich Modus 0 wähle, dann wird ddoch die anliegende Spannung gegen 0V
> genommen.

Schon mal gehört, dass elektrische SPannungen Potential-DIFFERENZEN 
sind?

Ohne Masseverbindung haben unterschiedliche Teilnehmer unterschiedliche 
Vorstellungen davon, wo 0 ist.

> Ich weiss beim nicht, wo ich die Masse Ader an das Board
> anschliessen soll und was das für einen Sinn ergibt.

Such dir jemanden der wenigstens die allereinfachsten Grundlagen 
Elektronik zumindest vom Hörensagen kennt. Massen werden IMMER 
miteinander verbunden!

von Daniel F. (mcnanuk)


Lesenswert?

Mea Culpa.... Mea... und so weiter....

passiert mir nie wieder.

Ich danke allen, die sich Zeit genommen und die Mühe gemacht haben, mir 
weiter zu helfen. Mein Projekt wird langsam so groß, dass ich den 
Überblick verliere.

Und wieder trifft das Sprichtwort zu:
Kaum macht man es richtig, schon funktioniert es.

Danke.

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.