7.6  Programmbeispiele

7.6.1  Sinussignal mit einem D/A-Port

Das nachfolgende Beispiel baut auf das Programmierbeispiel 7.2 auf, das wir in Kapitel 7.2 schon kennengelernt haben. Jetzt wird allerdings anstatt eines Dreiecksignals ein Sinussignal am Ausgang erzeugt. Da der MSP430 keine negativen Spannungen erzeugen kann, wurde der Sinus um einen Offset von 2000 (entspricht etwa 1V) verschoben, um so auch die negative Halbwelle generieren zu können.

#include <msp430x16x.h> 
int i,c;   // counter 
int sina[32] = {0, 100, 200, 299, 397, 495, 591, 686, 779, 870, 
                 959, 1045, 1129, 1210, 1288, 1363, 1435, 1503, 
                1567, 1627, 1683, 1735, 1782, 1826, 1864, 1898, 
                1927, 1951, 1971, 1985, 1995, 2000}; 
                // Wertetabelle Sinus 1/4 Periode 
int main( void ) 
{ 
 WDTCTL  = WDTPW | WDTHOLD;       // Disable watchdog timer 
 ADC12CTL0 = REF2_5V + REFON;     // Internal 2.5V ref on 
 DAC12_0CTL = DAC12IR + DAC12AMP_5 + DAC12ENC; 
 
 while( 1 ) {                     // endless loop 
  for(c = 0; c < 255; c++) 
  { 
   switch( c/32 ) // Unterscheide welche 1/4 Periode 
   { 
    case 0: DAC12_0DAT = 2000 + sina[c%32];    break; 
    case 1: DAC12_0DAT = 2000 + sina[31-c%32]; break; 
    case 2: DAC12_0DAT = 2000 - sina[c%32];    break; 
    case 3: DAC12_0DAT = 2000 - sina[31-c%32]; break; 
   } 
   // Pause für Einstellung Frequenz 
   for(i = 0; i < 1000; i++){} 
  } 
 } 
}
Listing 7.5: Sinussignal mit einem D/A-Port

Das Programm führt nach der Initialisierung eine Endlosschleife aus, in der am Ausgang das Sinussignal aus einer Wertetabelle „sina“ erzeugt wird. Für die Interpolation vieler nichtlinearer Funktionen sind Wertetabellen, wie in diesem Beispiel, platzsparender und effektiver als andere Methoden. Man könnte den Sinus natürlich auch über eine Taylorreihenentwicklung oder durch Verwenden der math.h-Bibliothek berechnen. Das ist allerdings nur dann sinnvoll, wenn man eine besonders hohe numerische Genauigkeit auf Kosten von Rechen- und Speicherkapazität erreichen will.