Ein Rechteck Signal ausgeben mit dem R-2R DA-Wandler

Mit dem DA Wandler soll ein Rechtecksignal auf den Pins 10-13 ausgegeben werden.

Die schnelle und direkte Ausgabe erfolgt indem die Bits des PORT B direkt geschrieben werden. Hier werden die Bits 2 (MSB) bis 5 (LSB) verwendet.

Diese Bits ergeben die entsprechende Ausgangsspannung
15: B00111100
14: B00011100
13: B00101100
….
2:  B00010000
1:  B00100000
0:  B00000000

Als erstes wird die maximal erreichbare Frequenz getestet.

while(1) {
  PORTB=B00111100; // 15
  asm("nop\n nop\n");
  PORTB=B00000000; // 0
}

Zwei Assembler Takte (nop Befehle) werden hinzugefügt, da die while(1) Schleife auch zwei Takte benötigt. Das ist aus dem Oszilloskop Bild ersichtlich.

1. Das Oszilloskop Bild ohne nop ist unsymmetrisch.

dao-1-500

1V / div. und 0,2 uS / div.

2. Das Oszilloskop Bild mit 2x nop Anweisungen ist symmetrisch.

dao-2-500

1V / div. und 0,2 uS / div.

Damit ergeben sich die Prozessor Takte zu
2 Takte für while
2 Takte für 2 x PORTB
2 Takte für 2 x nop

Es sind zusammen 6 Takte. 16MHz / 6 Takte = 2,667 MHz.

Mit dem Frequenzzähler aus dem vorherigen Beitrag werden 2,653 MHz gemessen.
Das ist eine Abweichung von 0,5%

Wenn wir noch ein Abbruchkriterium einführen wollen um später eine einstellbare Frequenz zu bekommen, können wir in der while Schleife eine Variable k abfragen. Diese Variable kann später zum Beispiel durch einen Interrupt geändert werden.

while(k==10) {
  PORTB=B00111100; // 15
  asm("nop\n nop\n");
  PORTB=B00000000; // 0
}

An der Anzahl der Prozessor Takte ändert sich dadurch nichts.

Wenn zusätzlich 2 nop Anweisungen eingefügt werden ergeben sich 8 Prozessor Takte oder eine Frequenz von 16 MHz / 8 = 2 MHz.

while(k==10) {
  PORTB=B00111100; // 15
  asm("nop\n nop\n nop\n");
  PORTB=B00000000; // 0
  asm("nop\n");
}

Der Ausgangspegel kann verändert werden indem hierfür zwei neue Variablen eingeführt werden, hivo (obere Spannung) und lovo (unter Spannung). Nun lassen sich 16 Spannungswerte einstellen. Das ergibt eine Abstufung von 0,3125V für die Spannungen von 0V bis 4,68V.

Hier das Programm für 2 MHz mit einer unteren Spannung von 0,94 V (3 : B00110000) und einer oberen Spannung von 1,88 V (6 : B00011000).

byte hivo = B00011000; // 6
byte lovo = B00110000; // 3

while(k==10) {
  PORTB=hivo;
  asm("nop\n nop\n nop\n");
  PORTB=lovo;
  asm("nop\n");
}

Bei meinem 20MHz Oszilloskop bin ich bereits bei 1/10 der maximalen Bandbreite. Deshalb sieht man oben kein sauberes Rechtecksignal, sondern ansteigende und abfallende Flanken. Hinzu kommt die Kapazität des Tastkopfs. Bei der Tastkopf Einstellung 1/10 sind die Flanken deutlich steiler. Der DA Wandler liefert also ein steiles Rechtecksignal.

Hier das Oszillosop Bild mit dem 1:10 Tastkopf bei 2 MHz.

2 MHZ und 1:10 Tastkopf

1V / div. und 0,2 uS / div. Der Tastkopf mit 1:10 ist berücksichtigt.

Teil 1 < Ein R-2R 4-Bit Digital-Analog Ausgang wird aufgebaut

von Matthias Busse

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.