Verfasst am: 01.04.2010, 22:58
Titel: Pulse mit Matlab erzeugen
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.
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.
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);
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.
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);
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 1for 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"
EndIf Exit Sub
EndIf
' 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 EndIf
source = DL_INTERNAL1
mode = ComboMode.ItemData(ComboMode.ListIndex) Ifmode <> DL_VDCGEN Then
onCount = 0 Else
dutyCycle = Val(txtDutyCycle) If dutyCycle > 0 And dutyCycle < 100 Then
onCount = dutyCycle / 100 * period
Else
onCount = 10 EndIf EndIf
'****************************************
' 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
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 EndIf If DriverLINXSR1.Req_DLL_name <> "KMBCTM" Then
Label2.Caption = "Measure output at user clock output 0."
EndIf
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 alltext in control
txtDutyCycle.SelStart = 0
txtDutyCycle.SelLength = Len(txtDutyCycle) End Sub
Private Sub txtFrequency_GotFocus()
' Automatically select alltext 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.
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.
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
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.
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
Einstellungen und Berechtigungen
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
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.