www.mikrocontroller.net

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


Autor: Joachim B. (jojo84)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: nicht Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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".

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Joachim B. (jojo84)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: Joachim B. (jojo84)
Datum:

Bewertung
0 lesenswert
nicht 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ß

Autor: nicht Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: nicht Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Joachim B. (jojo84)
Datum:

Bewertung
0 lesenswert
nicht 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 :) .

Autor: Thomas Eckmann (Firma: Thomas Eckmann Informationst.) (thomase)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: nicht Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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()

Autor: Joachim B. (jojo84)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Joachim B. (jojo84)
Datum:

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

Danke euch und gute N8!

Autor: nicht Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

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.