Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi PicoScope 2000 Signalgenerator [gelöst] (https://www.delphipraxis.net/158790-picoscope-2000-signalgenerator-%5Bgeloest%5D.html)

nuclearping 3. Mär 2011 06:51


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 (http://www.picotech.com) und haben es bisher nur genutzt, um Messungen durchzuführen.

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:
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
Meine Deklaration
Delphi-Quellcode:
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;
Aufruf
Delphi-Quellcode:
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});
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.

Jemand eine Idee?

WoGe 3. Mär 2011 07:56

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

jfheins 3. Mär 2011 09:13

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.

nuclearping 3. Mär 2011 09:55

AW: PicoScope 2000 Signalgenerator
 
Vielen dank für die Rückmeldungen.

Zitat:

Zitat von WoGe (Beitrag 1085510)
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

Das Handle passt. Wie schon gesagt liefert die Funktion 1 zurück und ich das Signal wird - überprüfbar - erzeugt. Das Handle stimmt also und die Hardware klickert auch beim Initialisieren.

Zitat:

Zitat von WoGe (Beitrag 1085510)
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.

Danke. Hab ich versucht, keine Besserung.

Zitat:

Zitat von jfheins (Beitrag 1085518)
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.

Nein, leider nicht. Ich hab double jetzt mal durch real ersetzt und auch andere Typen nochmal angepasst.

Die Deklaration schaut nun so aus:
Delphi-Quellcode:
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';
Resultat bleibt aber auch hier das gleiche ... :|

ABER ich hab grad mal ein kleines Testprojekt in Dev-C++ erstellt:
Code:
#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;
}
... und siehe da: Es kommt genau das raus, was soll, so wie in der PicoScope Software selbst. Schonmal ein riesen Fortschritt. :thumb:

Das heisst, es muss irgendwie an der Deklaration liegen. Aber nur wo, wir haben doch schon alles Mögliche durchprobiert ... :coder2:

nuclearping 3. Mär 2011 10:01

AW: PicoScope 2000 Signalgenerator
 
WOOHOO! single statt double/real ist die Lösung. :hello:

Delphi-Quellcode:
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';
Nun passt es 1:1 mit der PicoScope Software und der Tag ist gerettet. Vielen Dank euch! :thumb:

:coder:


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:24 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz