Forum: Mikrocontroller und Digitale Elektronik interner ADC des ATmega32


von Salamander (Gast)


Lesenswert?

Hallo,

ich möchte mittels Drehschalter 7 verschiedene Spannungen auf den 
Eingang des internen ADC im µC (ATmega32) legen, um die Umdrehungszahl 
eines Motors zu steuern.
Als Referenzspannung verwende ich die interenen 2,56V des Cotrollers.
Da der ADC eine Auflösung von 10-Bit hat, beträgt die Abstufung:
2,56 V / 1024 = 2,5 mV.

Umdrehungen  Referenzspannung  Analogwert  Digitalwert
 0          2,56 V                  0,02 V             8
 5          2,56 V                  0,04 V            16
10          2,56 V                  0,08 V            32
15          2,56 V                  0,16 V            64
20          2,56 V                  0,32 V           128
25          2,56 V                  0,64 V           256
30          2,56 V                  1,28 V           512

Die Digitalwerte lasse ich softwaremäßig auslesen & je nach Digitalwert 
lege ich eine Integer-Variable für die Umdrehungszahl fest. Von der 
Umdrehungszahl ziehe ich die gezählten Impulse (1 Impuls je Umdrehung) 
ab, sobald diese abgelaufen ist, wechselt die Drehrichtung des Motors.
Ich habe noch nie mit einem ADC gearbeitet und würde gerne wissen, was 
von der Idee an sich zu halten ist.

Danke.

Gruß
Salamander

von Poeler (Gast)


Lesenswert?

Tag,

ja kann man machen.

Warum machst Du die Abstufung der werte so ungleichmäßig? Der Abstand 
von 0,02V zu 0,04V ist sehr klein wogegen der Abstand von 0,64V zu 1,28V 
sehr groß ist. Mach es doch gleichmäßig, z.B. 2,56 / 7. Sind dann ca. 
0,36V per 5 Umdrehungen. Dann ließe sich die Umdrehungszahl auch einfach 
berechnen...

Bendenke auch, dass die interne Referenz nicht hoch genau ist und durch 
Tolleranzen anderer Bauteile werden sich abweichungen der Messwerte 
ergeben. Will sagen, was machst Du wenn Du 0,32V anlegst und Dein ADC 
statt 128, 129 ausspuckt?

Am Rande sei gesagt, so ein ADC versteht sich auch gut mit einem Poti... 
man könnte dann die Anzahl der Umdrehungen Stufenlos einstellen.

Gruß Poeler

von Dietrich L. (dietrichl)


Lesenswert?

Salamander schrieb:
> Ich habe noch nie mit einem ADC gearbeitet und würde gerne wissen, was
> von der Idee an sich zu halten ist.

Zusätzlich zu dem, was Poeler (Gast) schon gesagt hat:
Ich würde AVCC als Referenz nehmen und den Spannungsteiler oder das 
Poti, dass die Analogwerte erzeugt, auch damit versorgen. Dann heben 
sich die Fehler, die durch Spannungstoleranzen entstehen, auf.

Gruß Dietrich

von David (Gast)


Lesenswert?

Du machst die Unterteilung des ADC-Bereichs Logaritmisch? Ist das durch 
die Widerstände am Drehschalter gegeben? Wie sieht die Schaltung aus?

Ich würde den Bereich linear Aufteilen. Entweder mit einem Poti, oder 
mit dem Drehschalter, der zwischen identischen Seriewiderständen (Asl 
Spannungsteiler )abgreift.

Einen einfachen ADC Code, der auf dem ATmega32 läuft findest du übrigens 
unter:
http://www.electronicsplanet.ch/mikrocontroller/avrcodesammlung/ATmega16ADCSingleConversion.htm

Gruss
David

von Fred (Gast)


Lesenswert?

@ Salamander

Möchte dir deinen Entwurf nicht ausreden, da er eine gewisse 
Originalität besitzt, aber ein Drehencoder wäre einfacher.

von Poeler (Gast)


Lesenswert?

@ Fred

Wie wäre ein Drehencoder einfacher? Man kan aus den Daten die der 
Encoder liefert ja nur Richtung und Takt bestimmen, wie soll man da ohne 
zusätzliche Anzeige wissen was gerade eingestellt ist.

@ All

Eine ALternative wäre natürlich ein Drehcodierschalter, der z.B. über 4 
Pins seine Stellung verrät. Hier wären dann 16 Stellungen möglich, man 
müsste allerdings auch 4 IO Pins opfern.

Ach Mensch, wenn man doch nur wüsste was es werden soll...  ;-)

Gruß Poeler

von Salamander (Gast)


Angehängte Dateien:

Lesenswert?

Morgen zusammen,

vielen Dank erstmal für die hilfreichen Antworten.
Anbei habe ich einen Schaltplan angehängt, der allerdings nicht die 
Ausgangsseite des µC betrachtet. An den Achsen zweier Motoren am Ausgang 
sind Drehgeber (Typ AEDB-9140-A13) befestigt, dieser gibt pro Umdrehung 
ein Impuls aus, diesen Impuls subtrahiere ich von der eingestellten 
Umdrehungszahl pro Richtungswechsel, wobei ich nur einen der beiden 
Drehgeber auswerte. Der Anschluss der Drehgeber ist im Schaltplan 
ebenfalls nicht eingezeichnet.

Poeler schrieb:
> Mach es doch gleichmäßig, z.B. 2,56 / 7. Sind dann ca.
> 0,36V per 5 Umdrehungen. Dann ließe sich die Umdrehungszahl auch einfach
> berechnen...

Also ich habe jetzt wie vorgeschlagen eine lineare Abstufung der 
Spannungswerte vorgenommen (Auflösung von 0,365V).

AVCC ist meine Referenzspannung. Ich habe in meinem Beitrag zuvor 
geschrieben, dass ich die interne Refernzspannung des µC nutze. Damit 
meinte ich den Pin AVCC.

Poeler schrieb:
> Am Rande sei gesagt, so ein ADC versteht sich auch gut mit einem Poti...
> man könnte dann die Anzahl der Umdrehungen Stufenlos einstellen.

Eine stufenlose Einstellung der Umdrehungszahl ist nicht notwendig.
Die Drehzahl soll stufenlos über ein Poti einstellbar sein (im 
angehängten Schaltplan R10), aber soweit bin ich noch nicht.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Mach aus den 10nF mal 22pF

von Dietrich L. (dietrichl)


Lesenswert?

Salamander schrieb:
> AVCC ist meine Referenzspannung. Ich habe in meinem Beitrag zuvor
> geschrieben, dass ich die interne Refernzspannung des µC nutze. Damit
> meinte ich den Pin AVCC.

Dann solltest Du die Widerstandskette R1...R7 auch an AVCC hängen. An 
AREF gehört nur der Kondensator C3, die Widerstände kannst Du damit 
nicht treiben.

Gruß Dietrich

von Salamander (Gast)


Lesenswert?

Martin Wende schrieb:
> Mach aus den 10nF mal 22pF

Danke für den Hinweis.
Die Werte der Kondensatoren habe ich geändert.

Dietrich L. schrieb:
> Dann solltest Du die Widerstandskette R1...R7 auch an AVCC hängen. An
> AREF gehört nur der Kondensator C3, die Widerstände kannst Du damit
> nicht treiben.

Ich benötige doch einen Spannungspegel von 2,56V, um meine 
Widerstandkette zu treiben. Dies erreiche ich doch dadurch, dass ich im 
ADMUX Register die Bits REFS0 & REFS1 auf '1' setze. Würden somit an Pin 
AVCC also die 2,56V anliegen?

Gruß
Salamander

von spess53 (Gast)


Lesenswert?

Hi

>Ich benötige doch einen Spannungspegel von 2,56V, um meine
>Widerstandkette zu treiben. Dies erreiche ich doch dadurch, dass ich im
>ADMUX Register die Bits REFS0 & REFS1 auf '1' setze. Würden somit an Pin
>AVCC also die 2,56V anliegen?

Nein. Mach es so wie Dietrich L. (dietrichl) vorgeschlagen hat 
(Widerstände an AVCC) und stelle mit REFS0/1 VCC als Refernzspannung 
ein.

MfG Spess

von Dietrich L. (dietrichl)


Lesenswert?

spess53 hat meinen Vorschlag schon bestätigt, aber folgendes noch zu 
Erklärung:

Salamander schrieb:
> Ich benötige doch einen Spannungspegel von 2,56V

Warum? Du kannst genauso AVCC nehmen und setzt die Referenz auf "AVCC" 
(REFS0 = 1 & REFS1 = 0).
Spannungsschwankungen von AVCC gehen in dem Fall nicht in die Messung 
ein, da ja ratiometrisch gemessen wird 
(http://de.wikipedia.org/wiki/Ratiometrisch).

Im Prinzip ging das auch mit der internen Referenz von 2,56V und die 
"sieht" man bei Deiner Einstellung auch am Pin AREF. Aber das Signal 
darf nicht belastet werden, sonst bricht die Spannung an AREF zusammen 
und die das Ergebnis der A/D-Wandlung wird falsch. An AREF darf und soll 
nur der Kondensator.

Gruß Dietrich

von amateur (Gast)


Lesenswert?

@Salamander

Beachte doch bitte, dass, egal ob Du nun geschaltete Widerstände, oder 
ein Potentiometer abfragst, Du nie auf Gleichheit abfragst.
Also <= 64         // ?? bis incl. 64
oder <= 128        // 65 bis incl. 128

aber nie == 64
bzw. == 128

Für den Test: Schließe doch einfach mal ein Poti an ein DVM und versuche 
einen vorher festgelegten Wert, so auf die Schnelle, einzustellen und 
zwar genau.

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.