![]() |
PicoScope 2000 Signalgenerator [gelöst]
Hallo!
Ich hoffe, mir kann hier jemand bei diesem speziellen Problem helfen. Wir arbeiten schon seit einer Weile mit dem PicoScope 2000 ( ![]() Nun ist der Bedarf entstanden, auch den eingebauten Signalgenerator anzusprechen. Leider ist die Dokumentation im Programmer's Guide dazu sehr spärlich und Beispiele nicht vorhanden. Auch fehlt die Deklaration für den API Aufruf dieser Funktion in der Headerdatei. Ich habe die Deklaration laut Programmer's Guide hinzugefügt und die Funktion in einem Testprogramm aufgerufen. Das funktioniert im Prinzip auch, aber leider nicht so, wie gedacht. Wer das Gerät kennt und die mitgelieferte PicoScope6 Software, weiß, dass sie ebenfalls diesen Signalgenerator ansprechen kann. Die Resultate, die ich in der PicoScope Software erhalten, sind so wie erwartet. In meiner Testsoftware weichen sie komplett ab. Wenn ich in der PicoScope Software ein 200Hz Sinus Signal mit 1V erzeuge, kommt auch ein 1V 200Hz Sinus Signal raus. In meiner Testsoftware sind die Parameter gleich gesetzt und es kommt zwar auch ein Signal, allerdings mit einem starken Rauschen, nur ca. 300-500mV (statt 1V) und mit aktivem "Sweeping", also das Signal schwingt, statt konstant zu sein, obwohl es so eingestellt ist (Startfrequenz = Endfrequenz). Wir hocken hier schon seit mehreren Tagen einige Stunden, kommen aber auf keinen grünen Zweig. Google liefert auch nur Einträge aus dem Picotech Forum, wo Leute ähnliche Probleme haben, aber ohne konkrete Lösung. Bzw. waren die meisten Lösungen nur falsche Umrechnungen oder eine falsche Deklaration für die API. Hier mein Code: Deklaration laut Programmer's Guide
Code:
Meine Deklaration
short ps2000_set_sig_gen_built_in (
short handle, long offsetVoltage, unsigned long pkToPk, PS2000_WAVE_TYPE waveType, float startFrequency, float stopFrequency, float increment, float dwellTime, PS2000_SWEEP_TYPE sweepType, unsigned long sweeps ) waveType values: PS2000_SINE sine wave PS2000_SQUARE square wave PS2000_TRIANGLE triangle wave PS2000_RAMP_UP rising sawtooth PS2000_RAMP_DOWN falling sawtooth PS2000_DC_VOLTAGE DC voltage enPS2000SweepType: PS2000_UP PS2000_DOWN PS2000_UPDOWN PS2000_DOWNUP
Delphi-Quellcode:
Aufruf
function ps2000_set_sig_gen_built_in
(handle : smallint; offsetVoltage : integer; pkToPk : cardinal; waveType : smallint; startFrequency : double; stopFrequency : double; increment : double; dwellTime : double; sweepType : smallint; sweeps : cardinal) : smallint; stdcall; external 'ps2000.dll'; // Wave forms PS2000_SINE = 0; PS2000_SQUARE = 1; PS2000_TRIANGLE = 2; PS2000_RAMP_UP = 3; PS2000_RAMP_DOWN = 4; PS2000_DC_VOLTAGE = 5; // Sweep types PS2000_UP = 0; PS2000_DOWN = 1; PS2000_UPDOWN = 2; PS2000_DOWNUP = 3;
Delphi-Quellcode:
Die Funktion liefert 1 zurück (OK) und gibt das Signal aus. Wie schon beschrieben aber nicht das, was es soll. Im Fehlerfall (falsche Parameter oder ähnlich) liefert die Funktion 0 zurück.
ps2000handle := ps2000_open_unit();
r := ps2000_set_sig_gen_built_in( ps2000_handle, 0 {Kein Offset}, 1000000 {1V}, PS2000_SINE, 200 {StartFreq}, 200 {EndFreq; StartFreq = EndFreq = Kein Sweeping}, 0, 0, PS2000_UP, 0 {Wir wollen kein Sweeping}); Jemand eine Idee? |
AW: PicoScope 2000 Signalgenerator
In den Beispielen aus dem SDK wird immer das Handle überprüft.
Dann würde ich Testhalber den Erwerb des Handles und den Aufruf der Funktion entzerren und z.B. hinter 2 Knöpfe legen Ich habe kein solches Teil. Meine Erfahrungen mit ähnlichen Teilen ist aber das man Anfangs erst mal einen definierten Zustand herstellen muss, z.B. über das initiieren einer Messung. Grüsse wo |
AW: PicoScope 2000 Signalgenerator
Du hast den c Typen float mit double übersetzt. Bist du dir sicher dass das stimmt? float hat normalerweise nur 4 Bytes, double jedoch 8.
|
AW: PicoScope 2000 Signalgenerator
Vielen dank für die Rückmeldungen.
Zitat:
Zitat:
Zitat:
Die Deklaration schaut nun so aus:
Delphi-Quellcode:
Resultat bleibt aber auch hier das gleiche ... :|
function ps2000_set_sig_gen_built_in
(handle : smallint; offsetVoltage : longint; pkToPk : longword; waveType : integer; startFrequency : real; stopFrequency : real; increment : real; dwellTime : real; sweepType : integer; sweeps : longword) : smallint; stdcall; external 'ps2000.dll'; ABER ich hab grad mal ein kleines Testprojekt in Dev-C++ erstellt:
Code:
... und siehe da: Es kommt genau das raus, was soll, so wie in der PicoScope Software selbst. Schonmal ein riesen Fortschritt. :thumb:
#include <stdio.h>
#include <stdlib.h> #include "ps2000.h" int main(int argc, char *argv[]) { short ps2000_hnd = 0; long ofsV = 0; unsigned long pkToPk = 1000000; PS2000_WAVE_TYPE wt = PS2000_SINE; float startF = 200, endF = 400, inc = 0, dT = 0; PS2000_SWEEP_TYPE st = PS2000_UP; unsigned long sweeps = 0; int r = 0; printf("Opening Pico device ...\n"); ps2000_hnd = ps2000_open_unit(); if (!ps2000_hnd) { printf("Error opening Pico device.\n"); return -1; } printf("Device initialized: %d\n", ps2000_hnd); r = ps2000_set_sig_gen_built_in( ps2000_hnd, ofsV, pkToPk, wt, startF, endF, inc, dT, st, sweeps ); printf("Result: %d\n", r); system("PAUSE"); return 0; } Das heisst, es muss irgendwie an der Deklaration liegen. Aber nur wo, wir haben doch schon alles Mögliche durchprobiert ... :coder2: |
AW: PicoScope 2000 Signalgenerator
WOOHOO! single statt double/real ist die Lösung. :hello:
Delphi-Quellcode:
Nun passt es 1:1 mit der PicoScope Software und der Tag ist gerettet. Vielen Dank euch! :thumb:
function ps2000_set_sig_gen_built_in
(handle : smallint; offsetVoltage : longint; pkToPk : longword; waveType : integer; startFrequency : single; stopFrequency : single; increment : single; dwellTime : single; sweepType : integer; sweeps : longword) : smallint; stdcall; external 'ps2000.dll'; :coder: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz