mikrocontroller.net

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


Autor: H3ll Ghost (h3llghost)
Datum:

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

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

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

Autor: H3ll Ghost (h3llghost)
Datum:

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

Autor: Matthias Lipinsky (lippy)
Datum:

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

Autor: yalu (Gast)
Datum:

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

Autor: H3ll Ghost (h3llghost)
Datum:

Bewertung
0 lesenswert
nicht 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.
00078 {
00079   unsigned int i;
00080   int ec_bak = autoencode;              // Sichert aktuellen Zustand
00081 
00082   /*
00083      Autoencode-Betrieb vom ADC-Wandler unterbinden.
00084   */
00085   autoencode = FALSE;
00086 
00087   DDRD |= SWITCHES;                     // Port-Bit SWITCHES als Output
00088   SWITCH_ON;                            // Port-Bit auf HIGH zur Messung
00089   ADMUX = (1 << REFS0) | SWITCH;        // AVCC reference with external capacitor
00090   Sleep (10);
00091 
00092   ADCSRA |= (1 << ADSC);                // Starte AD-Wandlung
00093   while (!(ADCSRA & (1 << ADIF)))       // Ende der AD-Wandlung abwarten
00094     ;
00095   ADCSRA |= (1 << ADIF);                // AD-Interupt-Flag zuruecksetzen
00096 
00097   i = ADCL + (ADCH << 8);               // Ergebnis als 16-Bit-Wert
00098 
00099   SWITCH_OFF;                           // Port-Bit auf LOW
00100   Sleep (5);
00101 
00102   /*
00103      Autoencode-Betrieb vom ADC-Wandler wiederherstellen.
00104   */
00105   autoencode = ec_bak;
00106 
00107   /*
00108     Die Original Umrechenfunktion von Jan Grewe - DLR wurder ersetzt durch
00109     eine Rechnung ohne FLOAT-Berechnungen.
00110   return  ((unsigned char) ((( 1024.0/(float)i - 1.0)) * 61.0 + 0.5));
00111 
00112     Wert 61L evtl. anpasssen, falls fuer K1 falsche Werte zurueckgegebn werden.
00113   */
00114   return ((10240000L / (long)i - 10000L) * 61L + 5000L) / 10000;
00115 }

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

Autor: yalu (Gast)
Datum:

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

Autor: H3ll Ghost (h3llghost)
Datum:

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

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.