Forum: Mikrocontroller und Digitale Elektronik Grundschaltung für eine Analog-Digital-Wandlung


von H3ll G. (h3llghost)


Lesenswert?

Hallo Leute,

ich habe eine Spannung von 5 V und diese soll mir als Ausgangsspannung 
für die Schaltung dienen.
Ich möchte gerne damit eine Grundschaltung für eine 
Analog-Digital-Wandlung eines ATmega168 bauen.
Diese soll die Möglichkeit bieten zwischen 7 Schaltern zu unterscheiden.
Ich wollte erst die Unterscheidung der Taster vom ASURO nehmen, aber 
dazu fehlt mir ein bisschen das Verständnis der Schaltung.

Dazu hier ein Bild:
http://asuro.pytalhost.de/pmwiki/uploads/Main/switches.jpg

Hat es eine Bedeutung, dass ein 1M Ohm-Widerstand als R23 genohmen 
worden ist?
Wofür wird C7 benötigt?
Warum gibt es noch R24 mit 1k Ohm, wenn wir schon R23 haben?

Und kann ich dann bei 5 V Ausgangsspannung dieselben Widerstände nehmen?

Wäre euch sehr dankbar, wenn ihr mir diese Fragen beantworten könntet 
... :)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> ...dass ein 1M Ohm-Widerstand als R23 genohmen worden ist?
> Wofür wird C7 benötigt?
> Warum gibt es noch R24 mit 1k Ohm, wenn wir schon R23 haben?

Das sind ganz schön viele Fragen, für so wenige Bauteile.

Ich würde vermuten, bei der Auswertung dieser Tasten ist gar kein 
AD-Wandler beteiligt. Sondern folgender Ablauf:
1) PC4 gibt '1' aus, C4 wird geladen
2) PC4 wird als Eingang geschaltet (hochohmig)   und
   ein Zähler wird gestartet.
3) C7 wird über einen Taster+Widerstand entladen
   oder falls kein Taster gedrückt ist, über R 23 vollends aufggeladen.
4) Jetzt wird gewartet, bis an PD3 '0' eingelesen wird   oder
   ein Timeout auftritt
5) Der Zähler wird gestoppt  und
   aus dem Zählerstand die Taste ermittelt.

Das ist viel billiger, als AD-Wandler zu verwenden.

von H3ll G. (h3llghost)


Lesenswert?

Danke danke ... ;)

Aber warum werden diese Ergebnisse dann als 1, 2, 4, 8, 16, 32 
ausgegeben, wenn man die Funktion PollSwitch aus der ASURO-Library 
benutzt?
Und wie kann ich erkennen welche Schalter benutzt werden, wenn mehrere 
Schalter gedrückt worden sind?

von Matthias L. (Gast)


Lesenswert?

>Ergebnisse dann als 1, 2, 4, 8, 16, 32

Ohne mir das Programm anzusehen:

Aber solche Ausgaben nennt man Bitset.
Da ist jedem Bit eine Bedeutung zugewiesen.
SOmit können die Ereignisse unabhängig von den anderen in demselben Bit 
dargestellt werden.

von yalu (Gast)


Lesenswert?

Lothars Erklärung klingt plausibel. Ich hätte aber noch eine andere
Deutung anzubieten (interessant, wie man die gleiche Schaltung auf so
unterschiedliche Weisen interpretieren kann :)):

Ich schätze, dass die Idee hinter der Schaltung die folgende ist:

Wenn PD3 als Ausgang mit High-Pegel (VCC) konfiguriert ist liegt am
ADC-Eingang PC4 je nach Kombination der gedrückten Tasten eine Spannung
zwischen VCC/2 und VCC an. Aus dem ADC-Wert kann die Tastenkombination
berechnet werden. R23 hat in diesem Fall keine Funktion, da er in diesem
Fall praktisch parallel zu dem wesentlich kleineren R24 liegt. R24
sollte etwa R25/2 sein, um maximale Spannungsdifferenzen zwischen den
einzelnen Tastenkombinationen zu erhalten.

Wird hingegen PD3 als Eingang konfiguriert, liegt dort bei nicht
gedrückter Taste wegen R23 VCC, also ein High-Pegel an. Wird irgendeine
der Tasten gedrückt fällt die Spannung auf 0,3V oder weniger ab, was low
entspricht. Man kann also über die Abfrage einer einzigen Portleitung
feststellen, ob eine Taste gedrückt worden ist und muss dazu keine
zeitaufwendige A/D-Umsetzung starten. Diese wird erst benötigt, um
festzustellen, welche Taste(n) gedrückt worden sind. Damit der
Eingangspegel an PD3 wirklich sauber low wird, muss R23 groß im
Vergleich zu R25 bis R30 gewählt werden, deswegen hat er 1M.

Noch besser: PD3 ist ein Interrupteinang. Ein typischer Anwendungsfall
sieht also so aus, dass sich das Programm per Interrupt benachrichtigen
lässt, wenn eine Taste gedrückt worden ist. Anschließend wird PD3 auf
high geschaltet und über den ADC die gedrückte(n) Taste(n) bestimmt.

> Wofür wird C7 benötigt?

C7 dient zur Entprellung der Taster.

> Und kann ich dann bei 5 V Ausgangsspannung dieselben Widerstände
> nehmen?

Die Schaltung funktioniert bei jeder Versorgungsspannung, die für den
Controller zulässig ist. Wird VCC als Referenzspannung für den ADC
benutzt, was wahrscheinlich ist, muss man nicht einmal die Schwellwerte
in der Software anpassen, da die Schaltung ratiometrisch arbeitet.

von H3ll G. (h3llghost)


Lesenswert?

Das mit der Differenz, was du am Anfang erwähnst kommt mir sehr bekannt 
vor.
Wenn man sich dazu noch den Code aus der Library anschaut, sieht man, 
dass eine AD-Wandlung benutzt wird.
1
00078 {
2
00079   unsigned int i;
3
00080   int ec_bak = autoencode;              // Sichert aktuellen Zustand
4
00081 
5
00082   /*
6
00083      Autoencode-Betrieb vom ADC-Wandler unterbinden.
7
00084   */
8
00085   autoencode = FALSE;
9
00086 
10
00087   DDRD |= SWITCHES;                     // Port-Bit SWITCHES als Output
11
00088   SWITCH_ON;                            // Port-Bit auf HIGH zur Messung
12
00089   ADMUX = (1 << REFS0) | SWITCH;        // AVCC reference with external capacitor
13
00090   Sleep (10);
14
00091 
15
00092   ADCSRA |= (1 << ADSC);                // Starte AD-Wandlung
16
00093   while (!(ADCSRA & (1 << ADIF)))       // Ende der AD-Wandlung abwarten
17
00094     ;
18
00095   ADCSRA |= (1 << ADIF);                // AD-Interupt-Flag zuruecksetzen
19
00096 
20
00097   i = ADCL + (ADCH << 8);               // Ergebnis als 16-Bit-Wert
21
00098 
22
00099   SWITCH_OFF;                           // Port-Bit auf LOW
23
00100   Sleep (5);
24
00101 
25
00102   /*
26
00103      Autoencode-Betrieb vom ADC-Wandler wiederherstellen.
27
00104   */
28
00105   autoencode = ec_bak;
29
00106 
30
00107   /*
31
00108     Die Original Umrechenfunktion von Jan Grewe - DLR wurder ersetzt durch
32
00109     eine Rechnung ohne FLOAT-Berechnungen.
33
00110   return  ((unsigned char) ((( 1024.0/(float)i - 1.0)) * 61.0 + 0.5));
34
00111 
35
00112     Wert 61L evtl. anpasssen, falls fuer K1 falsche Werte zurueckgegebn werden.
36
00113   */
37
00114   return ((10240000L / (long)i - 10000L) * 61L + 5000L) / 10000;
38
00115 }

Was mich natürlich nochmal interessieren würde ist, kann man die 
Widerstände R25 bis R30 auch durch andere ersetzen?

von yalu (Gast)


Lesenswert?

Prinzipiell ja, wenn folgendes beachtet wird:

- Die Vorwiderstände vor den Tastern sollten so gewählt werden, dass
  jeder möglichst genau den doppelten Wert seines linken Nachbarn und
  der Vorwiderstand des linksten Tasters, R25, den Wert 2*(R24||R23)
  hat. Abweichungen von den idealen Verhältnissen können bis zu einem
  gewissen Grad durch Anpassen der Formel in Zeile 114 kompensiert
  werden.

- Die Vorwiderstand dürfen nicht wesentlich kleiner als im Schaltplan
  sein, da sie sonst den Ausgang PD3 bei der Messung zu stark belasten,
  so dass die Ausgangsspannung an PD3 nicht merh konstant VCC ist,
  sondern von den gedrückten Tastern abhängt.

- R30 sollte nicht größer als R23/4 sein, damit im Interruptmodus, wo
  das Drücken irgendeiner Taste an dem als Eingang geschalteten PD3
  erkannt werden soll, der Pegel bei gedrückter Taste auf mindestens auf
  1V bei VCC=5V heruntergezogen und damit sicher als low gelesen wird.

von H3ll G. (h3llghost)


Lesenswert?

Hallo,

wenn ich jetzt mal den Interrupt vernachlässige, wie sieht es mit dem 
Kondensator aus.
Was würde eine Veränderung der Kapazität auf 10 nF bewirken?

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.