Der Funktionsgenerator HP 33120A von Hewlett Packard bietet eine Vielzahl von Einstellmöglichkeiten für Signalform, Frequenz, Amplitude und Spannungsoffset. Neben einfachen Signalformen mit fester Frequenz bietet der Generator auch die Möglichkeit, verschiedene Modulationsarten, Wobbelbetrieb, Einzelsignale (Bursts) sowie numerisch definierte Signalformen einzustellen. Dem vielfältigen Funktionsumfang entprechen die vielfältigen Programmierungsmöglichkeiten. Das Bedienerhandbuch (>300 Seiten) beschreibt die Bedienung und alle zur Programmierung benötigten Kommandos einigermaßen erschöpfend. Zum Einstieg werden wir uns zunächst allerdings auf ein einfaches Beispiel (Sinus mit einstellbarer Frequenz und Amplitude) beschränken.
Die Programmierkommandos halten sich sehr eng an SCPI (Standard Commands for
Programmable Instruments), eine ASCII-basierte Befehlssprache zur Programmierung
intelligenter Messgeräte. Neben umfassenden Befehlen, die in einer Befehlszeile die
Betriebsart komplett einstellen, gibt es einfache Befehle für Einzeleigenschaften. So
lässt sich mit der Anweisung
"APPL:SIN 2.0E+3, 0.2, 0.0"
ein Sinussignal mit 2 kHz, 0.2 V Peak-Peak-Amplitude und 0.0 V Offset
einstellen, mit
"FREQ 3.0E+3"
die Frequenz alleine auf 3 kHz umschalten.
Eine Klasse funcgen mit relativ beschränkten Möglichkeiten könnte so aussehen:
class funcgen : protected fserialbase { public: funcgen(); virtual ~funcgen(); void sinus(double freq, double vpp, double off = 0); void frequency(double freq); }; |
Die Definition der benötigten Kommandos; mit namespace bietet C++ eine Kapselungsmöglichkeit gegenüber anderen ähnlichen Definitionen:
namespace FUNC { const char REMOTE[] = "SYST:REM\n"; const char LOCAL[] = "SYST:LOC\n"; const char SINUS[] = "APPL:SIN %G, %f, %f\n"; const char FREQUENCY[] = "FREQ %G\n"; } |
Die Implementierung der einzelnen Funktionen; statt der Qualifizierung mit FUNC:: könnte man die Funktionen auch in den entsprechenden namespace packen:
funcgen::funcgen() : fserialbase(DEV1) { fprintf(FilePtr(), FUNC::REMOTE); } funcgen::~funcgen() { fprintf(FilePtr(), FUNC::LOCAL); } void funcgen::sinus(double freq, double vpp, double off) { fprintf(FilePtr(), FUNC::SINUS, freq, vpp, off); } void funcgen::frequency(double freq) { fprintf(FilePtr(), FUNC::FREQUENCY, freq); } |