Zum Inhalt springen

GPIO Pins: Projekt-2

Aus Wikibooks
WTFPL-2
Hinweis: Wenn du diese Seite bearbeitest, stimmst du zu, dass deine Bearbeitungen zusätzlich unter den Bedingungen der WTF Public License veröffentlicht werden.
WTFPL-2


Microcontroller der AVR Familie verfügen zwar über eine eigene Funktionseinheit, mit der analoge Eingabepegel in digitale Eingabewerte umgewandelt werden können. Über eine eigene Funktionseinheit, mit der digitale Ausgabewerte in analoge Ausgabepegel umgewandelt werden können, verfügen sie allerdings nicht.

Ein Gerät, mit dessen Hilfe ein digitaler Eingabewert in ein analoges Signal umgewandelt werden kann, wird auch als DA-Wandler bezeichnet.

TODO: Im Handel erhältlich: parallele und serielle DA Wandler, wie: TLC 7524 CN von Texas Instruments, etc.

Im Kapitel Timer und Counter findet sich ein Projekt, mit dem ein "quasi" analoges Ausgabesignal erzeugt werden kann.

In diesem Kapitel soll ein echtes analoges Ausgabesignal erzeugt werden.

Für die Realisierung dieses Projekts wird neben dem Microcontroller selbst auch eine handvoll Widerstände benötigt.

R/2R DA-Wandler

[Bearbeiten]
3 Bit R/2R Netzwerk
Ersatzschaltbild

Eine Möglichkeit einen DA-Wandler mit einfachen Mittlen zu realisieren besteht in einem speziell für diesen Zweck konstruierten Netzwerk aus Widerständen. Ein solches Netzwerk aus Widerständen wird auch als R/2R Netzwerk oder R/2R DA-Wandler bezeichnet.

In der Theorie kann ein R/2R DA-Wandler für eine beliebige Anzahl Bits realisiert werden. In der Praxis ist die Anzahl Bits, die sich mit diskreten Bauteilen vernünftig realisieren lässt jedoch durch die Genauigkeit der Widerstände begrenzt.

Ein R/2R DA-Wandler mit n Bits verfügt über n Eingänge B0...Bn-1 und einen Ausgang.

Über die Eingänge können die Bits des digitalen Eingangswerts, der in einen analogen Ausgabepegel umgewandelt werden soll, wie folgt festgelegt werden:

  • Für ein Bit mit dem Wert 0 muss der zugehörige Eingang auf 0V stehen.
  • Für ein Bit mit dem Wert 1 muss der Eingang auf einer festen Referenzspannung liegen.

Am Ausgang liefert der R/2R DA eine Spannung, die zwischen 0V und der Referenzspannung liegt. Der maximale Ausgabepegel hängt sowohl von der Referenzspannung als auch vom Lastwiderstand des angeschlossenen Verbrauchers ab.

Die Leerlaufspannung am Ausgang eines R/2R Da-Wandlers beträgt

Der Innenwiderstand eines R/2R Da-Wandlers beträgt R.

Aufbau

[Bearbeiten]
R/2R Netzwerk Komponenten

Für den Aufbau eines R/2R DA-Wandlers werden zwei Sätze von Widerständen benötigt, die im Zahlenverhältnis 1:2 zueinander stehen.

Der Aufbau eines R/2R DA-Wandlers folgt einem einfachen Schema. Im allgemeinen Fall setzt er sich aus zwei Komponenten zusammen.

  • Die erste Komponente wird nur für das erste Bit B0 verwendet. Sie besteht aus einem Spannungsteiler mit zwei Widerständen der Größe 2R.
  • Für jedes weitere Bit wird eine andere Komponente verwendet. Der Ausgang dieser Komponente ist mit einem Widerstand R mit dem Ausgang vorangegangenen Stufe verbunden. Der Eingang für das Bit Bi ist mit einem Widerstand 2R mit dem Ausgang verbunden.

Funktionsweise

[Bearbeiten]
Stufe 0
Stufe 1

Um nachzuvollziehen, dass das R/2R-Netzwerk die gewünschten Eigenschaften erfüllt, ist es nützlich das Netzwerk schrittweise zu betrachten.

Ein R/2R Netzwerk mit einem Bit besteht lediglich aus einem Spannungsteiler. Die Leerlaufspannung beträgt also wie gefordert ½ B0. Der Innenwiderstand ist durch Parallelschaltung der beiden Widerstände 2R und 2R vorgegeben und beträgt somit wie gefordert R.

Bei der Betrachtung eines R/2R Netwerks mit zwei Bit kann die erste Komponente durch das Ersatzschaltbild ersetzt werden.

Um die Leerlaufspannung der Schaltung zu bestimmten ist es günstig die Beiträge der beiden Spannungsquellen ½ B0 und B1 getrennt zu betrachten. In beiden Fällen liegt erneut ein Spannungsteiler mit zwei Widerständen der Größe 2R vor.

  • Die Spannungsquelle ½ B0 liefert somit einen Beitrag von ¼ B0.
  • Die Spannungsquelle B1 liefert einen Beitrag von ½ B1.

In Summe ergibt sich somit eine Leerlaufspannung von ¼ B0 + ½ B1 wie gefordert.

Die Reihenschaltung von R und R liefert einen Ersatzwiderstand der Größe 2R. Die Parallelschaltung dieses Widerstands mit dem Widerstand 2R liefert einen Wert von R. Der Innenwiderstand beträgt somit R wie gefordert.

Umsetzung

[Bearbeiten]
Schaltung

Nachdem die theoretischen Grundlagen geklärt sind, sollen sie in diesem Abschnitt nun in die Praxis umgesetzt werden. Zusätzlich zu den Punkten, die wir uns bei der Beschreibung eines idealen R/2R Netzwerks bereits angesehen haben, sind bei einer Umsetzung in die Praxis einige Besonderheiten zu beachten.

Hardware

[Bearbeiten]

Wie eingangs erwähnt, stellt bereits die Genauigkeit der verwendeten Widerstände eine erste Hürde bei der Realisierung eines DA-Wandlers dar. Für den in diesem Projekt umgesetzten DA-Wandlers wurde eine Länge von 6 Bit gewählt. Die verwendeten Widerstände wurden einzeln nachgemessen und nur solche mit einer maximalen Abweichung von 0.5% vom Nennwert für den Aufbau der Schaltung verwendet.

Für die 2R Widerstände des R/2R Netzwerks wurden die ausgesuchten Widerstände direkt verbaut. Die R Widerstände des R/2R Netzwerks wurden durch Parallelschaltung von jeweils zwei der ausgewählten Widerstände umgesetzt.

Ein weiterer Störfaktor bei einer praktischen Umsetzung stellt die Ausgangscharakteristik der Pins des Microcontrollers dar. Im Idealfall müssten diese in den Schaltzuständen low und high stets eine Spannung von exakt 0V bzw. 5V liefern.

Für einen AtMega328p gibt das Datenblatt für die Ausgabepins einen maximalen Innenwiderstand von 45 Ω an. [1] In der Regel liegt die Abweichungen der Innenwiderstände der Pins ein und desselben Microcontroller Chips untereinander sehr viel geringer. Selbst im schlimmsten Fall ist mit einem Wert von 4.5 kΩ für 2R eine maximale Abweichung von unter 1% sichergestellt.

Für das Projekt wurde für 2R ein Wert von 22 kΩ gewählt.

Software

[Bearbeiten]

Der DA-Wander soll am Port C betrieben werden.

Damit der digitale Wert über die zugehörigen Pins ausgegeben werden kann, muss die Datenrichtung der Pins auf Ausgabe geschaltet werden. Das kann mit folgendem Code Schnipsel realisiert werden.

DDRC = 0b00111111;

Die gesamte Logik ist bereits in der Schaltung enthalten. Der Ausgabewert kann im Programm durch das PORTC Register vorgegeben werden.

Quellcode

[Bearbeiten]

Um den R2R Da-Wandler zu testen, können wir ein kleines Programm schreiben, das in einer Schleife die möglichen Ausgabewerte durchläuft. Wenn alles funktioniert sollte ein Sägezahn erzeugt werden.

#include <avr/io.h>
#include <util/delay.h>

// Forward Declarations
void setup(void);
void loop(void);

void setup() {
  DDRC = 0b00111111;  
}

void loop() {
  uint8_t i;

  for (i=0; i<64; ++i) {
    PORTC = i;
    _delay_ms(1);
  }
}

#ifndef ARDUINO
int main(void) {
  setup();
  while(1)
    loop();
}
#endif



WTFPL-2
Du hast das Recht unter den Bedingungen der WTF Public License mit diesem Dokument anzustellen was zum Teufel auch immer Du willst.


  1. (siehe [M328p]: 32.2. Common DC Characteristics, S.365)