Forum: Mikrocontroller und Digitale Elektronik Kein Rauschen am ADC-Pin?!


von Joachim B. (jojo84)


Lesenswert?

Guten Abend!

Ich hab auch mal wieder eine Frage. Und zwar...
Ich versuche gerade eine ordentliche Zufallszahl zu erstellen. 
Verwendeter Controller ist ein Atmega48, AVR Studio, GCC, Pollin-Board.
Ich wollte eigentlich einen offenen Pin des ADC einlesen, und das 
unterste Bit benutzen, um die Zufallszahl zu erstellen. Als 
Referenzspannung hatte ich die internen 1,1V gewählt, um auch "leiseres" 
Rauschen mitzukriegen.
Jetzt kommt aber das, was ich nicht verstehe: in dem Register des ADC 
steht immer 0x3FF (1023)! Ich schnappte mir also mein Scope und messte 
(?) die Spannung am ADC-Pin nach. Beim Berühren des Tastkopfes ging der 
Wert des ADC dann auf 0x00 runter, beim Lösen des Tastkopfes ging der 
Wert dann wieder auf 1023 hoch. Ich versteh aber nicht warum! Das find 
ih wirklich seltsam...
Würde mich darum freuen, wenn mich jemand da aufklären könnte. Ich 
dachte immer, daß das so eine gängige Methode wäre, um an Zufallszahlen 
zu kommen...

Danke schonmal,

Gruß

von nicht Gast (Gast)


Lesenswert?

Hallo, hänge mal den Pin an 2 hochohmige Widerstände (250k) dann 
bekommst du bestimmt auch ein rauschen.
Das immer ein Wert anliegt, liegt an den Leckströmen der Transistoren. 
die P-Kanal teile sind meistens "undichter".

von holger (Gast)


Lesenswert?

>Ich dachte immer, daß das so eine gängige Methode wäre, um an Zufallszahlen
>zu kommen...

Das ist eine Schwachsinnsmethode um an Zufallszahlen zu kommen.
Bei hochohmigen Eingängen fängt man sich meistens zuerst einmal
50Hz oder 100Hz periodische Signale vom Netz ein. Damit
lässt sich kaum ein Zufallsgenerator bauen. Bau dir einen
Rauschgenerator mit Transistor oder Z-Diode und OP dahinter.
Das dürfte wesentlich bessere Ergebnisse bringen.

von Joachim B. (jojo84)


Lesenswert?

Hi und danke erstmal für die Antwort.

@kein Gast
Mit "2 Widerständen" meinst du dann wahrscheinlich einen 
Spannungsteiler, nech? Die Idee hatte ich auch schon, aber noch keine 
passenden Widerstände gefunden (meine Ordnung...).

Kannst du mir das mit den Transistoren mal näher erklären oder die 
Stelle nennen, wo ich das nachlesen kann? Ich Datenblatt hatte ich die 
Seite mit dem "Analog Input Circuitry" schon vor mir. Schon die Dinger, 
wo IiH und IiL dran steht diese Transistoren?

Und warum ging die Spannung dann runter, als mein Scope dadran war? Ich 
hatte gedacht, daß die Eingänge da mit 1MOhm hochohmig genug wären...

Gruß

von Joachim B. (jojo84)


Lesenswert?

holger schrieb:
> Das ist eine Schwachsinnsmethode um an Zufallszahlen zu kommen.

jaja, locker bleiben. Wenn du mir mit nicht-zyklischer Abfrage des 
untersten Bits 50 Hz rekonstruieren kannst verneig ich mich. Ich werde 
mal ein paar tausend Werte aufnehmen und mir die Verteilung anzeigen 
lassen. Wenn sich da wirklich ein erkennbares Muster ergibt, was die 
Anwendung in der Lampe eines Kinderzimmers ausschließt, frag ich nochmal 
nach ;)

Dennoch danke für die Idee mit der Z-Diode!

Gruß

von nicht Gast (Gast)


Lesenswert?

holger schrieb:
> Bei hochohmigen Eingängen fängt man sich meistens zuerst einmal
> 50Hz oder 100Hz periodische Signale vom Netz ein.

Ist doch super, da kann ich den Phasen jitter von Clock und Netzspannung 
nutzen ;)

von holger (Gast)


Lesenswert?

>jaja, locker bleiben.

Ich hab immer ne Schraube locker;)

>Wenn du mir mit nicht-zyklischer Abfrage des
>untersten Bits 50 Hz rekonstruieren kannst verneig ich mich. Ich werde
>mal ein paar tausend Werte aufnehmen und mir die Verteilung anzeigen
>lassen.

Jo, mach mal.

GCC kennt übrigends auch eine rand() Funktion.
Für einfache Sachen reicht die auch.

von nicht Gast (Gast)


Lesenswert?

holger schrieb:
> GCC kennt übrigends auch eine rand() Funktion.

Das nutzt ich übrigens auch meistens (oderTT800). Bei Start nutzt ich 
einen Wert vom EEPROM der dann mit der neu generierten zahl 
überschrieben wird. So ist auch nach einem Spannungsausfall die Folge 
zufällig (zumindest für einen Menschen).

von Thomas E. (thomase)


Lesenswert?

holger schrieb:
> GCC kennt übrigends auch eine rand() Funktion.
>
> Für einfache Sachen reicht die auch.

Genau.

Die bringt nur nach dem Reset zufällig immer dieselbe Zahl.
Wenn man diese Funktion aber unbestimmt häufig aufruft, erhält man eine 
richtige Zufallszahl.

So z.B.:

while (!Usart0Connect())
{
   rand();
}

Die Schaltung hängt per USB am PC und wartet darauf, daß ein Programm 
gestartet wird und einen Connect zum AVR macht. Und solange wird rand() 
ausgeführt.
Das ergibt immer eine andere Zufallszahl.

Sinngemäß kann man das auch mit einer Taste machen.

Oder einem Kondensator am Komparator.


mfg.

von Joachim B. (jojo84)


Lesenswert?

Jo, die rand()-Funktion kenn ich auch. Ich wollt aber gern einfach mal 
etwas anderes probieren. Und sei es nur des Lerneffektes wegen :) .

@kein Gast
jetzt hast du mir die Sache aus deinem obigen Post aber immer noch nicht 
näher erklärt :) .
Ich habe jetzt mal einen Spannungsteiler aus 2x470k gebaut. Jetzt messe 
ich sehr zuverlässig Vref/2. Wenn das so deine Idee war, dann bin ich 
glaub ich glaub ich zu doof :) .

von Thomas E. (thomase)


Lesenswert?

Joachim B. schrieb:
> Jetzt messe
>
> ich sehr zuverlässig Vref/2.

Das war auch nicht anders zu erwarten.
Wenn ich einen offenen Eingang messe, der wirklich in der Luft hängt, 
dödelt der ADC-Wert auch immer nur um +- 5 hin und her.

mfg.

von nicht Gast (Gast)


Lesenswert?

Joachim B. schrieb:
> Jetzt messe
> ich sehr zuverlässig Vref/2. Wenn das so deine Idee war, dann bin ich
> glaub ich glaub ich zu doof :) .

Das war nur so eine Schätzung, nimm doch mal 2MOhm. Aber bitte nicht 
hauen wenn es nicht geht. Ist nur eine Idee...
wie gesagt nutzte ich auch meist rand()

von Joachim B. (jojo84)


Lesenswert?

Thomas Eckmann schrieb:
> Das war auch nicht anders zu erwarten.

Nee, stimmt. Ich bin ja auch nur einem Vorschlag gefolgt, der 
grundsätzlich ja gar nicht so unplausibel war. Ein sehr hochohmiger 
Spannungsteiler ist ja ähnlich wie ein offener Pin...

> enn ich einen offenen Eingang messe, der wirklich in der Luft hängt,
> dödelt der ADC-Wert auch immer nur um +- 5 hin und her.

Hast du's gut :) . Eben das war/ist ja mein Problem. Wenn ich den Pin 
wirklich komplett offen lasse zieht er sich immer auf Vref hoch grübel

von holger (Gast)


Lesenswert?

>Eben das war/ist ja mein Problem. Wenn ich den Pin
>wirklich komplett offen lasse zieht er sich immer auf Vref hoch grübel

Vieleicht hast du ja Dreck auf der Platine.
Reste vom Flussmittel z.B.
Der ADC beim AVR hat meine ich so 100M Ohm Eingangswiderstand.
Wenn du dir Störungen auf dem ADC einfangen möchtest
häng doch einfach mal ein 2m Kabel an den Eingang.

von Joachim B. (jojo84)


Lesenswert?

Ach das ist doch alles Mist :) . Ich ess mein Penne Gorgonzola und dann 
überleg ich mir was neues...

Danke euch und gute N8!

von nicht Gast (Gast)


Lesenswert?

Was noch helfen kann ist den ADC clk hoch drehen.

Aber ob man mit diesen dreckigen Tipps auch ein wirklich dreckiges 
Rauschen zu bekommt wage ich zu bezweifeln.

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.