Forum: Mikrocontroller und Digitale Elektronik Spannung sinkt nach dem Anlegen an ADC-Pin


von Andrey (Gast)


Lesenswert?

Hallo liebe Kollegen,

Suche hat nichts gebracht,bin Anfänger, bitte um Hilfe:

AT90USB1287
Spannung am Spannungsteiler (versorgt mit NT): ca. 0,5V.
Verbinde ich nun diesen mit dem Pin vom ADC: ca. 0,8V.
Versorgung vom µC weg: wieder 0,5V.

Was verursacht die Spannungssteigerung?

Folgendes gemacht:
GND vom Teiler liegt an GND vom µC.
ADC Pin hochohmig
ELKO 1µF verzögert nur, keine Wertänderung

/"Hi,
bei den Analogeingängen muß man aufpassen.
Laut Datenblatt sollte die Ausgangsimpedanz der Quelle kleiner 10k 
sein."/

Vielleicht liegt es an der Impendanz? Kenne mich da überhaupt nicht 
aus...

Danke im Voraus!

von spess53 (Gast)


Lesenswert?

Hi

Pull-Up-Widerstand eingeschaltet?

MfG Spess

von Dennis (Gast)


Lesenswert?

Andrey schrieb:
> Vielleicht liegt es an der Impendanz? Kenne mich da überhaupt nicht
> aus...

Dann Oszi ranhängen und Bild posten...

von Michael H. (michael_h45)


Lesenswert?

Andrey schrieb:
> Was verursacht die Spannungssteigerung?
Interner Pullup? ADC doch als Ausgang und nicht als Eingang geschaltet?

Die Pullups haben einen Widerstand von 20..50kOhm. Kommen die +0,3V mit 
deinem Spannungsteiler hin?

von Andrey (Gast)


Lesenswert?

spess53 schrieb:
> Hi
>
> Pull-Up-Widerstand eingeschaltet?
>
> MfG Spess

Meinst Auf Eingang mit aktivem Port? Nein, momentan nur alles auf 
Ausgang bis auf den gebrauchten Pin. Exakt wie im Beispiel vom Prof...



Dennis schrieb:
> Andrey schrieb:
>> Vielleicht liegt es an der Impendanz? Kenne mich da überhaupt nicht
>> aus...
>
> Dann Oszi ranhängen und Bild posten...

Wenn ich wüsste wie´s geht (bin überzeugt es wird nicht einfach wie eine 
Spannungsdifferenz gemessen) ;)

Ich google mal, wenn ich rausfinde wie s geht, tue ichs gerne =)

von Andrey (Gast)


Lesenswert?

Michael H. schrieb:
> Andrey schrieb:
>> Was verursacht die Spannungssteigerung?
> Interner Pullup? ADC doch als Ausgang und nicht als Eingang geschaltet?
>
> Die Pullups haben einen Widerstand von 20..50kOhm. Kommen die +0,3V mit
> deinem Spannungsteiler hin?

DDRF   = 0x7f;      // PF7 auf Eingang, Rest ausgang

Passt doch, oder?

von Harald W. (wilhelms)


Lesenswert?

Andrey schrieb:

> ... bis auf den gebrauchten Pin...

Du verwendest gebrauchte Pins?
Kannst Du Dir keine neuen leisten?
SCNR
Harald

von Uwe (Gast)


Lesenswert?

datenblatt lesen ! IO-Ports ! Innenbeschaltung angucken

von spess53 (Gast)


Lesenswert?

Hi

>Exakt wie im Beispiel vom Prof...

Das will nichts heißen. Wie sieht denn dein Spannungsteiler aus. Auch 
wenn der ADC-Eingang recht hochohmig ist, soll die Quellimpedanz <10k 
sein.

MfG Spess

von Michael H. (michael_h45)


Lesenswert?

Andrey schrieb:
> Passt doch, oder?
Meinst du, einen Pullup bräuchte man bei einem Ausgang? Die gibts 
natürlich auch bei Eingängen.
Also zeig mal den ganzen Code oder zumindest, was im PORTF Register 
steht.

Wie sieht dein Spannungsteiler aus? Was passiert, wenn du dem ~35k nach 
5V parallelschaltest? Ich prophezeie +0,3V...

von Andrey (Gast)


Lesenswert?

spess53 schrieb:
> Hi
>
>>Exakt wie im Beispiel vom Prof...
>
> Das will nichts heißen. Wie sieht denn dein Spannungsteiler aus. Auch
> wenn der ADC-Eingang recht hochohmig ist, soll die Quellimpedanz <10k
> sein.
>
> MfG Spess

+12V -> NTC (momentan ca. 80kOhm)-> parallel:

- ADC
- 4,2kOhm -> GND
- 1µF -> GND

von Andrey (Gast)


Lesenswert?

Michael H. schrieb:
> Andrey schrieb:
>> Passt doch, oder?
> Meinst du, einen Pullup bräuchte man bei einem Ausgang? Die gibts
> natürlich auch bei Eingängen.
> Also zeig mal den ganzen Code oder zumindest, was im PORTF Register
> steht.
>
> Wie sieht dein Spannungsteiler aus? Was passiert, wenn du dem ~35k nach
> 5V parallelschaltest? Ich prophezeie +0,3V...

PORTF unbelegt...also Nuller...?

Teiler siehe bitte oben. Danke!

von Karl H. (kbuchegg)


Lesenswert?

Andrey.
Ich will dir nicht ins Handwerk pfuschen.
Aber wenn du qualifizierte Hilfe willst, dann
* zeige deine Schaltung
* zeige dein Programm

Hör auf die Dinge zu beschreiben, sondern zeig sie einfach.
* Eine Schaltung zeigt man am einfachsten, indem man einen Schaltplan 
postet.
* Ein Programm zeigt man am einfachsten, indem du das Programm postest.

Das hat den Vorteil, dass es für dich einfach ist, und die Helfer hier 
alle Informationen haben, die sie brauchen (und wenn nicht, dann fragen 
sie nach)

Seit fast einer Stunde geht hier nix weiter. Hättest du gleich 
Schaltplan und Programm gezeigt, wäre dein Problem wahrscheinlich schon 
längst gelöst.

Hilf UNS, DIR zu helfen!

von Andrey (Gast)


Angehängte Dateien:

Lesenswert?

1
#include "avr/io.h"
2
#include "avr/wdt.h"
3
#include <stdint.h>
4
#include "avr/interrupt.h"
5
6
7
// Initialisierung der Prozessorperipherie
8
9
void system_init(void)
10
{
11
 // den Watchdog abschalten
12
 MCUSR=0;    
13
 wdt_disable();  
14
15
 // JTAG abschalten
16
 MCUCR=0x80;    
17
 MCUCR=0x80;    
18
19
 // CPU Vorteiler 1:1 (Aufgabe 6 von V5)
20
 CLKPR=0x80;
21
 CLKPR=0x00;
22
23
 // USART1 einstellen
24
 UBRR1 =25;
25
 UCSR1A=0x00;
26
 UCSR1B=0x98;
27
 UCSR1C=0x06;
28
29
 // PORTE
30
 PORTE  =  0x04;              // zuerst nur die Ausgabe einer 0 an PE0 vorbereiten, LED aus, Pullup an PE2 (Boot)
31
 DDRE  |=  0x01;              // jetzt PE0 auf Ausgabe stellen,  das Modul ist ab jetzt sicher deaktiviert
32
 DDRE  |=  0x4A;              // jetzt auch PE6 und PE1 auf Ausgang stellen, dazu PE3 wegen der LED
33
34
 DDRF   = 0x7f;                // PF7 auf Eingang, Rest ausgang
35
 DDRB   = 0x1F;               // Fur LED
36
37
 DIDR0  = 0x80;                // Eingangsbuffer abschalten
38
 ADCSRA = 0x07;               // ADC deaktiviert,Messung aus,Single Run,Interrupt aus,Teiler 128=125kHz
39
 ADCSRB = 0x00;                // Free Run if ADATE in ADSCRA set, ansonsten keine Wirkung
40
 ADMUX  = 0x67;                // AVCC,linksbündig,ADC7 single ended (ohne Gain)
41
42
 //Timer0 Einstellungen               fur die ISR
43
//  SREG = 0x80;
44
  TCCR0A = 0x02;              //CTC-Mode
45
  TCCR0B = 0x05;               //CTC-Mode, Prescaler x1024
46
  OCR0A  = 255;
47
  TIMSK0 = 0x02;
48
  TCNT0  = 0;
49
  //TIFR0  = 0x02;
50
51
 //Timer1 Einstellungen               fur PWM
52
 TCCR1B = 0x00;               // Zähler gestoppt
53
 TCCR1A = 0x82;               // OC.1A set at TOP, clear when OCR1A reached (siehe Table 14-2)
54
                      // OC.1B normal port, OC.1C normal port, Mode 14
55
 DDRB  |= 0x20;               // PB5 auf Ausgang setzen - sonst kommt nichts raus
56
 ICR1   = 30;                 // Teilerfaktor setzen, im Mode 14 steht der Endwert in ICR1 - 64,5 kHz
57
 TCCR1B = 0x18;               // Mode 14, Zähler noch gestoppt
58
 OCR1A  = 22;                 // Mittelstellung bei 1,5ms
59
 TCCR1B = 0x19;               // Zähler laeuft!
60
}
61
62
 volatile uint16_t i=0;
63
 volatile   int8_t   x_k    =0;        // Ist-Wert
64
       uint8_t w_k    =0x3C;      // Führungsgröße = 60°
65
 volatile  int8_t  e_k    =0;        // Abweichung
66
 volatile  int8_t  e_k_1  =0;        // vorherige Abweichung
67
68
       uint8_t  T    =1;        // Abtastperiode = ca. 1sek
69
 double        Kpr    =-0.370370370;
70
 double        Kir    =0.14285714;
71
 double        b0    =-0.370370370+0.14285714*1;        //Kpr+Kir*T;
72
 double        b1    =0.370370370;  //-(Kpr);
73
 volatile  uint8_t  y_k    =0;
74
 volatile  uint8_t  y_k_1  =0;
75
76
void adc_ein(void)
77
{
78
  ADCSRA |= 0x80;              // ADC ein
79
}
80
81
void eine_messung(void)
82
{
83
  ADCSRA |= 0x40;              // ADC-Messung starten
84
}
85
86
87
88
ISR(TIMER0_COMPA_vect)
89
{
90
  PORTB ^= 0x0C;               // 4er blinken SIGNAL ISR EINGEGANEN
91
//  PORTB ^= 0x02;              // Schalte die grüne bei jedem Umlauf mal um
92
     eine_messung();    
93
    while ( (ADCSRA & (0x40) )==(0x40) )   // Warten, bis Ergebnis im Register steht
94
    {}
95
96
    x_k = ADCH;                // ADCH binär!!!
97
98
99
    if(x_k>0x40)
100
    {
101
     PORTB |= 0x02;                      // schalte grüne EIN, wenn Uref>1,25V
102
    }
103
104
   else
105
   {
106
    PORTB &= 0xFD;                      // schalte grüne AUS, wenn Uref<1,25V
107
   }
108
  PORTB ^= 0x0C;               // 4er blinken SIGNAL ISR VERLASSEN
109
}
110
111
int main(void)
112
{
113
 //uint16_t i=0;
114
 system_init();
115
 adc_ein();
116
 sei(); 
117
 while(1)
118
 {
119
   PORTB ^=0x11;               // LED EIN
120
  
121
  for(i=0;i<12000;i++){}
122
 }
123
  return 0;  
124
}

Ist unübersichtlich, hab es mit Internet gelernt.
 Hoffentlich hilft es, Danke Euch...

von Andrey (Gast)


Lesenswert?

Wie gesagt... ADC am F7 interessiert mich

von Hubert G. (hubertg)


Lesenswert?

JTAG ist abgeschaltet?

von Andrey (Gast)


Lesenswert?

Hubert G. schrieb:
> JTAG ist abgeschaltet?

Wie du siehst. Einstellungen vom Prof übernommen. Da ich nicht weiss, 
was JTAG ist, habe ich es so gelassen, denn ADC scheint ja zu funzen.

von Hubert G. (hubertg)


Lesenswert?

ICh weiss nicht womit du den Kontroller programmierst.
Wenn du es mit ISP machst, dann ist JTAG abzuschalten.
Wenn du es mit JTAG machst, dann kannst du die PinF 4 bis 7 nicht 
verwenden.
Fuseeinstellung siehe hier:
http://www.engbedded.com/fusecalc/

von Andrey (Gast)


Lesenswert?

Hubert G. schrieb:
> ICh weiss nicht womit du den Kontroller programmierst.
> Wenn du es mit ISP machst, dann ist JTAG abzuschalten.
> Wenn du es mit JTAG machst, dann kannst du die PinF 4 bis 7 nicht
> verwenden.
> Fuseeinstellung siehe hier:
> http://www.engbedded.com/fusecalc/

Ich programmiere es direkt im AVR mit einem Tool über USB. JTAG scheint 
es wohl nicht zu sein. Bin mir aber nicht sicher.

Aber ADC macht was er soll, auch im Beispielprogramm vom Prof.

Sorry, bin halt totaler Anfänger in der Sache....

von Hubert G. (hubertg)


Lesenswert?

In deinem Programmiertool wird es die Möglichkeit geben in den Fuses 
JTAG abzuschalten.

von Andrey (Gast)


Lesenswert?

Antwort vom Prof:

Sehr geehrter Herr ...,

wenn der Pin im offenen Zustand tatsächlich 4 MOhm Innenwiderstand hat, 
dann ist das Verhalten sehr seltsam.
Im Moment der Messung wird der Innenwiderstand kurzfristig kleiner 
(wegen des Sample&Hold-Kondensators im Chip), aber das messen Sie ja 
nicht, das würde man nur am Oszilloskop sehen.

Der Pin ADC7 hat ja noch die Zusatzfunktionen TDI (von JTAG) und PF7. 
Als erstes sollten Sie also sicherstellen, dass diese Funktionen keinen 
Einfluss haben.

a) JTAG komplett deaktivieren
    Wenn JTAG aktivierbar ist, dann sind die Pullups an PF4-PF7 immer 
an, egal, was Sie einstellen .
    Das sagt Tabelle Table 10-19. Overriding Signals for Alternate 
Functions in PF7..PF4.
    Im Register MCUCR kann man zwar mit Bit 7 (JTD) die JTAG-Logik 
abstellen, aber offenbar nicht die Pullup-Übersteuerung.
    Leider kann man JTAGEN nur mittels eines Programmiergeräts ändern, 
da sich das Bit in einem Fuse Byte befindet: Table 29-4. Fuse High Byte 
(AT90USB128 : 0x99 - AT90USB64 : 0x9B)

b) Digitalteil komplett abstellen, mittels Register DIDR0.
    DIDR0|=0x80;

Probieren Sie erst mal, ob an einem der Eingänge ADC3-ADC0 das Problem 
auch auftritt, also z.B. an ACD3:

DDRF &= ~(1<<3);     // PF3 Eingang
PORTF &= ~(1<<3);   // PF3 ohne Pullup
DIDR0 |= (1<<3);       // PF3 keine Erkennung eines Digitalpegels nötig


Wenn es dann mit PF3 funktioniert, dann liegt es bei PF7-PF4 am JTAG.
Geben Sie mir dann noch Bescheid, was rauskam - ich habe das Problem 
bisher nicht gehabt oder nicht bemerkt.

mfg,

Prof. Dr.-Ing. ...

von Michael H. (michael_h45)


Lesenswert?

also zusammengefasst: er sagt dir genau das gleiche wie der rest hier 
auch...
was machst du jetzt? liest du dich doch mal ein oder fragst du in einem 
anderen forum? ^^

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.