ADC Beispiel - ?

Dies ist das deutsche Forum für alle Themen um den IO-Warrior. Beiträge bitte nur in Deutsch.

Moderator: Guido Körber

Post Reply
Franz Peter Zantis
Posts: 97
Joined: Wed Aug 03, 2011 3:46 pm
Contact:

ADC Beispiel - ?

Post by Franz Peter Zantis »

Gerne würde ich den 14-Bit-ADU im neuen IO-Warrior56 in unserem Design verwenden. Allerdings fehlt in der IowKit_V15_API.pdf leider die Verwendung des ADU. Erst ein einfaches Beispiel (am liebsten in Visual Basic), aus dem die Funktionalität ersichtlich ist, wird uns den Einstieg zeitlich ermöglichen.
Auch die Datei "Analog_ViewerDlg.cpp" aus dem sample-Ordner ist eher etwas für Rate-Fans. Es fehlt jede Kommentierung.

MFG
Franz Peter Zantis
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: ADC Beispiel - ?

Post by Christoph Jung »

Warum sollte eine neue Special-Mode Funktion in der IowKit_V15_API.pdf enthalten sein?
Das iowkit hat sich nicht geändert, nur der IO-Warrior56 hat zwei neue Special-Modes bekommen, die im Datenblatt beschrieben sind. Ansprechen lassen die sich wie alle anderen Special-Modes.
Wichtig: Die neuen Funktion sind erst ab der Firmwareversion 2.0.0.0 verfügbar.

Zum Einstellen des Modus muss wie im Datenblatt angegeben die Einstellungen gesetzt und dann an den IOW56 gesendet werden.


IOWKIT_HANDLE handle;
handle = IowKitOpenDevice();
IOWKIT56_SPECIAL_REPORT report;
memset(&report, 0, IOWKIT56_SPECIAL_REPORT_SIZE);

report.ReportID = 0x1C; //Special mode ADC
report.Bytes[0] = 0x01; //Enable ADC Mode
report.Bytes[1] = 0x04; //Channel = 1...8
report.Bytes[2] = 0x07; //Reference 0...7
report.Bytes[3] = 0x00; //Bypass 0 or 1

IowKitWrite(handle , IOW_PIPE_SPECIAL_MODE, (char*)&report, IOWKIT56_SPECIAL_REPORT_SIZE);


Und dann einfach die Daten auslesen. Der IOW56 sendet automatisch und permanent die Daten.


IOWKIT56_SPECIAL_REPORT report;
memset(&report, 0, IOWKIT56_SPECIAL_REPORT_SIZE);
int value = 0;

report.ReportID = 0x1D;

//Read data from IO-Warrior56
if (IowKitRead(handle, IOW_PIPE_SPECIAL_MODE, (char*)&report, IOWKIT56_SPECIAL_REPORT_SIZE) == IOWKIT56_SPECIAL_REPORT_SIZE)
{
value = (report.Bytes[1] << 8) | report.Bytes[0]); //14Bit value Channel 1
value = (report.Bytes[3] << 8) | report.Bytes[2]); //14Bit value Channel 2
....
}
else
{
//error during read
}


Das wars auch schon um die Daten vom IOW56 zu bekommen.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
Franz Peter Zantis
Posts: 97
Joined: Wed Aug 03, 2011 3:46 pm
Contact:

Re: ADC Beispiel - VisualBasic

Post by Franz Peter Zantis »

Vielen Dank!
Hier (weiter unten) ein Beispiel in Visual Basic:
Bei jedem Klicken auf den Button "Start" erhält man eine neuen Wert vom ADU.
Es wird nur ein Read ausgeführt. Muss noch ein Write ergänzt werden?
Es funktioniert, aber die Werte müssen korrigiert werden. Das ist im unteren Code nicht gemacht.
Für die Korrektur ist eine Fallunterscheidung notwendig. Man benötigt eine Korrekturformel für den Bereich unter 2,2V und eine zweite für den Bereich oberhalb 2,23V.

Viele Grüße
Franz Peter Zantis


Option Explicit On
Option Strict On

Public Class Form1
Dim iohandle As Integer
Dim ioadusettings(63) As Byte
Dim ioadudata(63) As Byte
Dim retint As Integer
Dim value As UInt16
Dim spginvolt As Double


Private Sub BtnStart_Click(sender As System.Object, e As System.EventArgs) Handles BtnStart.Click
ioadudata(0) = &H1D
retint = IowKitRead(iohandle, 1, ioadudata(0), 64) 'reicht ein Read? Oder muss noch ein Write erfolgen?
value = CUShort(ioadudata(2) * 256 + ioadudata(1))

spginvolt = (4.16 / 2 ^ 14) * value 'Umrechnung in Volt

Me.TxBxADUWert.Text = CStr(spginvolt) 'Ausgabe in einem Textfeld
End Sub


Private Sub Form1_FormClosed(sender As Object, e As System.Windows.Forms.FormClosedEventArgs) Handles Me.FormClosed
IowKitCloseDevice(iohandle)
End Sub


Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
iohandle = IowKitOpenDevice()
If iohandle = 0 Then
MessageBox.Show("Hardware nicht angeschlossen!", "ERROR")
End
End If

ioadusettings(0) = &H1C 'Kennung für ADU-Betrieb
ioadusettings(1) = 1 'ADU-Aktivieren
ioadusettings(2) = 1 'Kanal
ioadusettings(3) = 7 'Referenz (Gnd.. 4,16)
ioadusettings(4) = 0 'Bypass
retint = IowKitWrite(iohandle, 1, ioadusettings(0), 64)
End Sub
End Class
User avatar
Christoph Jung
Posts: 670
Joined: Sun Oct 08, 2006 3:43 pm
Location: Germany / Berlin
Contact:

Re: ADC Beispiel - ?

Post by Christoph Jung »

Nein, bei dieser Funktion liefert der IO-Warrior56 von selber Werte, also reichte ein einfaches IowKitRead() aus. Bei bedarf natürlich auch in einer Schleife. Aber immer an das IowKitSetTimeout() denken, falls mal
das Auslesen ein Problem haben sollte.
Abteilung: Softwareentwicklung
Folge uns auf Twitter
Follow us on twitter
Post Reply