WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Pulse mit Matlab erzeugen

 

Baltam
Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 15.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.04.2010, 22:58     Titel: Pulse mit Matlab erzeugen
  Antworten mit Zitat      
Hallo Leute,

ich muss Ein Steuersignal (also Puls 13µs High und 13µs low) zu einem Sensor,der mit einer DAQ-Karte am PC verbunden ist. Dafür muss ich ein Digital Output an der DAQ-Karte bennutzen, sagen wir Port A bzw. 0 in Line 5.

Kennt sich jemand aus ?
Kann mir jemand bitte helfen ?

die eingehende analog Signale kann ich schon darstellen, aber wenn der Sensor nicht mit dem obigen Signal gesteuert ist, bringt mir dieses analoge Signal nichts.
Private Nachricht senden Benutzer-Profile anzeigen


divB
Forum-Anfänger

Forum-Anfänger


Beiträge: 38
Anmeldedatum: 23.10.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.06.2010, 10:19     Titel:
  Antworten mit Zitat      
Was ist die Abtastrate? Und die Länge des Signals?

Code:

% 1 second
T_s = 1e-6;
t=0:T_s:1;

steuersignal = [ones(13, 1) (zeros(length(t) - 13)];
 


... oder so ähnlich...

lg
divB
Private Nachricht senden Benutzer-Profile anzeigen
 
Baltam
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 15.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.06.2010, 13:12     Titel:
  Antworten mit Zitat      
Danke für die Antwort.
ist leider nicht was ich brauche. es geht um ein reales Signal, nicht um einer Darstellung.

Ich habe mich informiert und ich muss ausgerechnet dieses Signal mit Generic DLL oder C++ programmieren und in matlab einbinden. weil Matlab die Karte mit dem Signal nicht steuern kann.

Danke trotzdem
Private Nachricht senden Benutzer-Profile anzeigen
 
divB
Forum-Anfänger

Forum-Anfänger


Beiträge: 38
Anmeldedatum: 23.10.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.06.2010, 13:34     Titel:
  Antworten mit Zitat      
Und was bitte ist ein "echtes" Signal?

Ein Signal Dirac(t) kannst du im Computer ebensowenig darstellen und verarbeiten wie einen Puls (rect )

Ein Signal muss immer in Form von Abtastwerten vorliegen (Samples) und hier musst du wissen was die Abtastrate für die Kommunikation zu deinen analogen Endgeräten ist. Diese bestimmt dann in deinem Fall wie deine diskrete Darstellung deines Steuersignals vom DAC interpoliert wird.

Einen Puls kannst du in deinem Fall über die Fourerreihe erzeugen wobei du die Reihe bei fs/2 abbrichst und dann deinem DAC schickst.

Aber ganz grundsätzlich gibst du reichtlich wenig Informationen zu deinem Problem ab, um genau zu sein viel zu wenig dass man dir weiterhelfen könnte.

Wenn es z.B. darum geht einen von dir gewünschten Puls an einem parallelen Port implizit zu erzeugen dann ginge das (mit einigen Randbedingungen) z.B. so:

Code:

#define PORT 0x3bc // Parallel port 1
#define PIN 0x4 // Pin
#define DATA 0 // Data port

outp(1, (PORT + DATA) | PIN);
Wait13Us(); // dürfte am PC im Userspace wohl am schwierigsten sein
outp(0, (PORT + DATA) | PIN);
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Baltam
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 15.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.06.2010, 16:53     Titel:
  Antworten mit Zitat      
nochmal vielen Dank,

du hast ja recht was meine wenige Informatiionen betrifft.
Also ich muss mit meinen DAQ PCI Karte (Datenerfassungskarte) die mit einem Sensorplatine (Ultraschallsensor) verbunden ist.
Es geht haupsätzlich um Objektdiferrenzierung durch Ultraschall.
Ich muss mit der DAQ PCI Karte den Sensor mit digitale Signale steuern, somit ich den Sensor kontrollieren kann (wann er Schall senden muss und wann er Echo empfangen muss) . Die empfangenen analogen Signale werden in einem Display dargestellt.

Alles muss mit MATLAB laufen. Alle andere digitale Output Signale habe ich schon hin bekommen, dafür sollte ich nur die Ports auf der Karte ansprechen und auf High und Low setzen, nur ein Signal (40 kHz Takt) bzw. Clock Signal was der Sensor braucht geht nicht mit Matlab.

Von MATLAB support habe ich gesagt bekommen dass diese Frequenz bzw. Clocked Digital Output unmöglich ist. Dafür gäbe es aber ein paar Workarouds.
Entweder DLL vom DAQ hersteller in MATLAB laden, oder ein MEX Datei erstellen, die dieses Signal generiert.

Mit der PCI-Karte Installation-CD wurden schon viele Beispiele bzw. APIs installiert, und ich bin noch am forschen wie ich C++ od. VB APIs in MATLAB zu implementieren.


ich hoffe mein Problem ist ein bischen klar geworden.
Ich hab noch ein paar bilder , wie die Output Signale aussehen und wie das eingehende Signal im Display gezeigt wird. Da dieses Projekt wurde schon mal mit LabVIEW gemacht nur halt mit anderer Hardware.
Private Nachricht senden Benutzer-Profile anzeigen
 
Martin
Admin

Admin



Beiträge: 652
Anmeldedatum: 16.06.07
Wohnort: Bietigheim-Bissingen
Version: ---
     Beitrag Verfasst am: 10.06.2010, 18:00     Titel:
  Antworten mit Zitat      
Bevor hier etwas mit dem Umgang entgleist, habe ich kurz eingegriffen und ein paar Beiträge bereinigt.

Und jetzt bitte normal weiter schreiben Wink Danke!
_________________

Der kleine goMatlab.de-Knigge - Eine kleine Liste von wichtigen Regeln, die jeder beachten sollte
Private Nachricht senden Benutzer-Profile anzeigen
 
divB
Forum-Anfänger

Forum-Anfänger


Beiträge: 38
Anmeldedatum: 23.10.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.06.2010, 18:14     Titel:
  Antworten mit Zitat      
Ok, dass der MATLAB support gesagt hat dass das so direkt nicht geht hat wahrscheinlich den Grund dass du den Ausgang schalten musst, mehr oder weniger genau 13us warten und wieder schalten. Das geht mit dem ganzen MATLAB Framework, das eigentlich für Simulationen gedacht ist nicht so gut.

Generell hat man bei einem non-realtime OS das Problem dass dir niemand sehr kurze Zeitschritte garantieren kann. Mikrosekunden sollten glaub ich gerade noch an der Kippe liegen, zumindest gibt es usleep() unter UNIX.

Also mit mex & Co hab ich keine Erfahrung, ich würde aber einfach (das OS ist Windows nimm ich an) die DLL mit LoadLibrary in einem mini-C Programm laden und die passende Funktion aus der DLL des Herstellers aufrufen.

Welche DLL das ist und wie die Funktion heisst steht garantiert im Handbuch des Herstellers!

Danach das Programm compilieren und in MATLAB einfach mittels system oder ! ausführen.

Da du ja nur kurz was schalten musst und keine Daten etc. übergeben musst umgehst du das aufwendige MEX Interface und brauchst dich nicht mit DLL-Bau & Co rumschlagen.

Als Pseudocode würde das so aussehen (ungetestet!):

Code:

#include <windows.h>

typedef FUNCPTR int (TogglePort*)(int portNr, DWORD value);

int WinMain(...)
{

HANDLE dll = LoadLibrary("DAQ.dll");
if(!dll) {...}

FUNCPTR TogglePort = GetProcAddress(dll, "TogglePort");
if(!TogglePort) { ... }

TogglePort(portNummer, 1);
nanosleep(13000);
TogglePort(portNummer, 0);

CloseHandle(dll);

return 0;
}
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Baltam
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 15.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.06.2010, 19:53     Titel:
  Antworten mit Zitat      
Danke vielmals für deine Hilfbereitschaft.



Zitat:
Da du ja nur kurz was schalten musst und keine Daten etc. übergeben musst umgehst du das aufwendige MEX Interface und brauchst dich nicht mit DLL-Bau & Co rumschlagen.


Ich fürchte ja, da ich die Ports von der Karte ansprechen muss.
Die Karte ist mit Analog Input , Digital Output, Digital Input und Counter/Timer Subsystems gerüstet ist und hat dafür eine SCSI 68 Pin Buchse, wo die Sensorplatine verbunden ist.
Wie schon erwähnt ich kann mit MATLAB auf die Analog Input und die digitale Outputs an der DAQ-Karte zugreifen.
Mit Counter/Timer Subsystem habe ich mich noch nicht beschäftigt, ich denke um eine Frequenz oder Pulse zu generieren muss ich das Counter/Timer Subsystem benutzen, aber da MATLAB dieses Subsystem nicht unterstützt muss ich das mit DLLs oder MEX-File umgehen.

Ich hab wie gesagt ein mitinstallierten Beispiel Program gefunden womit man eine Frequenz generieren kann. Ist leider mit VB 6.0 geschrieben und dabei ist auch kein header File.
der DLL wo alle Functions stehen habe ich auch bereits wenn ich LOADLIBRARY benutze muss ich unbedigt denke ich ein Header-File mit binden, ich weiss aber nicht welche.

Das Beispiel Program sieht so aus, zumindest was in .frm code steht
Code:
Option Explicit
' DriverLINX CTM Frequency Generator Example
Const LogicalDevice = 0     ' Assume Device 0
Const LogicalChannel = 0    ' Use CTM Chn 1 for measurements

Private Sub cmdStartStop_Click()
  ' Start pulse
  If cmdStartStop.Caption = "&Start" Then
    If StartMeasurement = DL_NoErr Then
      cmdStartStop.Caption = "&Stop"
    Else
      MsgBox DriverLINXSR1.Message, vbOKOnly, "CTM Error"
    End If
    Exit Sub
  End If
 
  ' Stop pulse
  DriverLINXSR1.Req_op = DL_STOP
  DriverLINXSR1.Refresh
  cmdStartStop.Caption = "&Start"
End Sub

Private Function StartMeasurement() As Integer
  Dim freq As Single
  Dim result As Integer
  Dim period As Long
  Dim dutyCycle As Single
  Dim onCount As Long
  Dim source As Integer
  Dim mode As Integer

  ' Read and calculate parameters from user interface
  freq = Val(txtFrequency)
  If freq > 0 Then
    period = DriverLINXSR1.DLSecs2Tics(LogicalChannel, 1 / freq)
  Else
    period = 4
  End If
  source = DL_INTERNAL1
  mode = ComboMode.ItemData(ComboMode.ListIndex)
  If mode <> DL_VDCGEN Then
    onCount = 0
  Else
    dutyCycle = Val(txtDutyCycle)
    If dutyCycle > 0 And dutyCycle < 100 Then
      onCount = dutyCycle / 100 * period
    Else
      onCount = 10
    End If
  End If
 
  ' Start measuring
  result = StartFrequency(DriverLINXSR1, LogicalDevice, LogicalChannel, mode, period, onCount, source, DL_DISABLED, CT_Output_Default)
 
  StartMeasurement = result
End Function

'****************************************
' Use this procedure frequency generation
'****************************************
Function StartFrequency(dl As DriverLINXSR, ByVal LogicalDevice As Integer, ByVal LogicalChannel As Integer, ByVal mode As Integer, ByVal period As Long, ByVal onCount As Long, ByVal source As Integer, ByVal gate As Integer, ByVal clkOut As Integer) As Integer
  ' Setup Service Request to perform task
  With dl
    .Req_device = LogicalDevice
    .Req_subsystem = DL_CT
    .Req_mode = DL_POLLED
    .Req_op = DL_START
    .Evt_Tim_type = DL_RATEEVENT
    .Evt_Tim_rateChannel = LogicalChannel
    .Evt_Tim_rateMode = mode
    .Evt_Tim_rateClock = source
    .Evt_Tim_rateGate = gate
    .Evt_Tim_ratePeriod = period

    .Evt_Tim_rateOnCount = onCount
    .Evt_Tim_ratePulses = 0
    .Evt_Tim_rateOutput = clkOut
    ' Other events, buffers, channels unneeded
    .Evt_Str_type = DL_NULLEVENT
    .Evt_Stp_type = DL_NULLEVENT
    .Sel_buf_N = 0
    .Sel_chan_N = 0
    .Refresh
    StartFrequency = .Res_result
  End With
End Function

Private Sub Form_Load()
  ' Center form
  Me.Move (Screen.Width - Me.Width) / 2, (Screen.Height - Me.Height) / 2
 
  ' Open DriverLINX CTM driver
  DriverLINXSR1.Req_DLL_name = "K"
 
  ' Initialize CTM device
  DriverLINXSR1.Req_device = LogicalDevice
  DriverLINXSR1.Req_mode = DL_OTHER
  DriverLINXSR1.Req_op = DL_INITIALIZE
  DriverLINXSR1.Refresh
  If DriverLINXSR1.Res_result <> DL_NoErr Then
    MsgBox ("Unable to initialize CTM. Quitting.")
    End
  End If
  If DriverLINXSR1.Req_DLL_name <> "KMBCTM" Then
    Label2.Caption = "Measure output at user clock output 0."
  End If
  ComboMode.ListIndex = 1 ' Square wave
End Sub

Private Sub Form_Unload(Cancel As Integer)
  ' Close DriverLINX driver
  DriverLINXSR1.Req_DLL_name = ""
End Sub

Private Sub txtDutyCycle_GotFocus()
  ' Automatically select all text in control
  txtDutyCycle.SelStart = 0
  txtDutyCycle.SelLength = Len(txtDutyCycle)
End Sub

Private Sub txtFrequency_GotFocus()
  ' Automatically select all text in control
  txtFrequency.SelStart = 0
  txtFrequency.SelLength = Len(txtFrequency)
End Sub
 



wie kann ich das in MATLAB integrieren ?
was ich im Moment versuche, ist die vorhandene ActiveX Controls (.ocx) von der DAQ-Karte in MATLAB aufzurufen was schon klappt, und ich kann schon die Befehle sehen. aber ich weiss noch nicht wie es weiter geht.
Ich habe vergessen zu erwähnen dass die ein- und ausgänge mit einen MATLAB GUI laufen sollen, weil ich muss die andere ausgang Signale mit Buttons kontrollieren können und das Signal im Display sehen können.
Private Nachricht senden Benutzer-Profile anzeigen
 
divB
Forum-Anfänger

Forum-Anfänger


Beiträge: 38
Anmeldedatum: 23.10.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.06.2010, 10:54     Titel:
  Antworten mit Zitat      
Hi,

Sorry, aber das ganze ist mir einfach viel zu unspezifisch und breit. Du musst dich erstmal im Klaren werden WAS du genau machen willst und wenn du dann Probleme hast kann man spezifisch weiterhelfen.

Ich habe leider überhaupt keine Ahnung wie deine DAQ angesprochen wird, welche Möglichkeiten es gibt etc. etc.

Generell habe ich meine Idee eh schon präsentiert: Da es dir offenbar nur drum geht diesen kurzen Puls an deine Karte zu übermitteln, schreib dir ein 10-zeiliges C-Programm dass das macht und führe es in MATLAB mit ! aus. Das ist am unkompliziertesten.

Die API scheint lt. VB Code ein ActiveX Control o.ä. zu sein. Ich bin mir sicher es gibt auch eine simple C/C++ API dafür.

Wenn du nicht C/C++ kannst, kannst du ja einfach das VB Programm hernehmen und modifizieren. Einfach den GUI Part weg.

Eine Möglichkeit wäre noch in google nach +MATLAB +DeineDAQ zu suchen, die Wahrscheinlichkeit ist hoch dass es da eh schon was gibt.
Private Nachricht senden Benutzer-Profile anzeigen
 
divB
Forum-Anfänger

Forum-Anfänger


Beiträge: 38
Anmeldedatum: 23.10.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.06.2010, 10:56     Titel:
  Antworten mit Zitat      
... und ich hab gerade noch was anderes gefunden. Auf den ersten Blick kann man damit ein VB Programm in MATLAB einbinden: http://www.codeproject.com/KB/COM/COMBuilder_2.aspx
Private Nachricht senden Benutzer-Profile anzeigen
 
Baltam
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 15.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.07.2010, 23:06     Titel:
  Antworten mit Zitat      
Hallo.

sorry dass ich mich erst jetzt melde. hab leider keine benachrichtigung bekommen.

so ich habe mich entschieden das ganze mit Visual Basic zum laufen zu bringen, aber falls es auch mit MATLAB gehen sollte wäre ich sehr zufrieden.
Mit MATLAB GUI konnte ich schon mein DAQ ActiveX controls laden.
Ich hab schon ein paar VB program beispiele mit der DAQ-Hardware gefunden, die sich auf die ActiveX controls beziehen.

Die frange ist nun ob ich viel umschreiben bzw modifizieren muss, damit diese VB programme auch in MATLAB GUI laufen können ? (VB text in m-file umwandeln)

Du hast es schon richtig vermutet, es handet sich um VB activeX.
Sicher habe ich auch Beispiele in C++ aber leider nicht was genau ich brauche, und mit C++ kenne ich mich nicht gut aus.

codeproject.com ist eine sehr gute seite. besonders der typ Razi. ich hab schon viele artikeln von ihm gelesen. aber leider nicht genau was ich brauche

und vielen dank für deine Hilfe
Private Nachricht senden Benutzer-Profile anzeigen
 
divB
Forum-Anfänger

Forum-Anfänger


Beiträge: 38
Anmeldedatum: 23.10.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.07.2010, 12:02     Titel:
  Antworten mit Zitat      
Hi,

Ich kann dir hier leider nicht wirklich weiterhelfen. Ich hab zwar Erfahrung mit MATLAB, ActiveX, VB und C++, allerdings nicht in Kombination. Ich habe noch nie VB in MATLAB eingebunden und wenn ich es müsste, müsste ich mich hier sicher auch gut einlesen. Zusätzlich handelt es sich bei dir um ein proprietäres Modul.

Also wenn du irgendwelche konkreten Fragen hast wo ich weiterhelfen kann gerne, ansonsten: sorry. Das ist so zu allgemein und zu komplex.

lg
divB
Private Nachricht senden Benutzer-Profile anzeigen
 
Baltam
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 37
Anmeldedatum: 15.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.07.2010, 12:35     Titel:
  Antworten mit Zitat      
Alles klar. ich wird mich am besten mit VB beschäftigen, da ich schon beispiel programme von der DAQ Karte mit installiert hab.
Mit matlab wäre das sehr komplex und sehr aufwändig.

Vielen dank DivB
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.