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 ... :)
> ...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.
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?
>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.
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.
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.