Unterschiedliche Signalformen mit dem R2R DA-Wandler ausgeben. Dreieck, Impuls, Sägezahn direkt mit dem Arduino Uno.

Hier werden Sägezahn Kurven mit steigender und mit fallender Flanke erzeugt, eine Dreieckskurve und eine Impulsausgabe mit ggf. einer langen Auszeit. Es werden der Arduino Uno und der 4-bit DA-Wandler verwendet.

Wie im vorherigen Artikel beschrieben wird das byte Feld mit Werten beschrieben.

Wenn nun eine Sägezahnspannung mit kontinuierlich steigender Flanke ausgegeben werden soll, kann folgendes Feld mit 16 Stützwerten verwendet werden.

void calcSaegTab() {
// Sägezahn Tabelle berechnen
// Sinvollerweise werden 16 Stützpunkte gewählt
// 
// Matthias Busse 01.06.2014 Version 1.0
int i=0, iwert, awert;

  stuetzwerte=16;
  for(iwert=0; iwert< 16; iwert++) {
    awert=0;
    if(iwert&B00000001) awert |= B00100000;
    if(iwert&B00000010) awert |= B00010000;
    if(iwert&B00000100) awert |= B00001000;
    if(iwert&B00001000) awert |= B00000100;
    sin28[i]=awert; // DA Wertetabelle füllen   
    i++;
  }
}

Der Sägezahn mit fallender Flanke und 16 Stützwerten ergibt sich mit folgender kleinen Änderung.

void calcSaegFallendTab() {
// Sägezahn mit fallender Flanke, Tabelle berechnen
// Sinvollerweise werden 16 Stützpunkte gewählt
// 
// Matthias Busse 01.06.2014 Version 1.0
int i=0, iwert, awert;

  stuetzwerte=16;
  for(iwert=15; iwert>=0; iwert--) {
    awert=0;
    if(iwert&B00000001) awert |= B00100000;
    if(iwert&B00000010) awert |= B00010000;
    if(iwert&B00000100) awert |= B00001000;
    if(iwert&B00001000) awert |= B00000100;
    sin28[i]=awert; // DA Wertetabelle füllen   
    i++;
  }
}

Der Impuls wird mit einer „ON“ und einer „OFF“ Zeit folgendermassen berechnet.

void calcImpuls(int on, int off) {
// Ein Impuls mit "on" Takten voller Amplitude und "off" Takten 0V
// 
// Matthias Busse 01.06.2014 Version 1.0

int i, k=0;

  for(i=0; i< on; i++) {
    sin28[k]= B00111100;
    k++;
  }
  for(i=0; i< off; i++) {
    sin28[k]= B00000000;
    k++;
  }
  stuetzwerte=k;
}

Dazu muss ggf. das Feld mit den Byte Werten angepasst werden. Auch hier wird die Frequenz eingehalten. Es werden z.B. 1 Impulstakt und 99 0V-Takte ausgegeben mit der gewünschten Frequenz von z.B. 1 kHz. Dann ist der Impuls 10 Mikrosekunden lang und die Auszeit beträgt 990 Mikrosekunden.

Eine Dreieckform mit gleichmässig steigender und auch fallender Flanke kann so berechnet werden. Hier werden sinnvollerweise 30 Stützwerte gewählt.

void calcDreickTab() {
// Dreieck Tabelle berechnen
// Sinvollerweise werden 30 Stützpunkte gewählt
// 
// Matthias Busse 01.06.2014 Version 1.0

int i=0, iwert, awert;

  stuetzwerte=30;
  for(iwert=0; iwert< 16; iwert++) {
    awert=0;
    if(iwert&B00000001) awert |= B00100000;
    if(iwert&B00000010) awert |= B00010000;
    if(iwert&B00000100) awert |= B00001000;
    if(iwert&B00001000) awert |= B00000100;
    sin28[i]=awert; // DA Wertetabelle füllen   
    i++;
  }
  for(iwert=14; iwert>0; iwert--) {
    awert=0;
    if(iwert&B00000001) awert |= B00100000;
    if(iwert&B00000010) awert |= B00010000;
    if(iwert&B00000100) awert |= B00001000;
    if(iwert&B00001000) awert |= B00000100;
    sin28[i]=awert; // DA Wertetabelle füllen   
    i++;
  }
}

Es lassen sich beliebige Kurvenformen mit verschiedenen Amplituden gestalten. Sie müssen immer an das DA-Wandler Netzwerk angepasst werden, wie in den Beispielen zu sehen über den awert.

Die höchste erreichbare Frequenz ist: 150 kHz / stützwerte.
Bei der Dreieckkurve sind das 150 kHz / 30 stützwerte = 5 kHz.

Für höherer Frequenzen kann wieder die bereits gezeigt „asm-nop“ Technik verwendet werden, an Stelle der Timer gesteuerten Ausgabe.

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.