Previous Page Table Of Contents Next Page


Bitte beachte die Copyrighthinweise.

La12-ww2

AD-Kartenprojekt PG812 (2)

1 Aufgabenstellung

· Mit der AD-Wandlerkarte PG812 soll eine Spannungs-/Strommessung (±10V/±1A) an einem Widerstand durchgeführt werden.

· Es sind 2000 Messwerte so schnell als möglich zu protokollieren und in einer Datei zu speichern. Die Abtastung muss synchron erfolgen (Sample-Hold).

2 Schaltung

Es wurde folgende Schaltung aufgebaut:

Die Betriebsspannung betrug 15V (±15V für den LF398N Sample/Hold IC).

Da die Digitalausgänge der Karte nur 5V liefern können, war eine Pegelanpassung mittels des Transistors V1 nötig.

Die Eingangsspannung U0 wurde mittels des Spannungsteilers R1/R2 von 10V auf die zulässigen 5V heruntergeteilt.

Dass ein Sample/Hold Baustein nötig ist, wurde bereits in der Übung Nr. 09 festgestellt.

3 Messungen

3.1 A/D Wandler Test

Zum Testen der Schaltung wurde an die Eingänge beider S/H Bausteine eine Spannung U0 = U1 » 2,5V angelegt. Die S/H Bausteine selbst wurden über den Pin 8 auf Dauersample geschaltet.

Danach wurde das (bereits funktionierende) Messprogramm der vorigen Laborübung (#09) (PG812_3.c) gestartet. Wie erwartet zeigte der zweite Kanal eine Spannung von etwa 2,5V, der erste Kanal aufgrund des Spannungsteilers etwa die Hälfte.

Bei einer Erhöhung/Verringerung der Eingangsspannung veränderten sich die Werte entsprechend.

3.2 S/H Ansteuerung Test

Hierzu wurden aus dem bereits vorbereiteten Programm mit der Werteausgabe in eine Datei dieser Teil auskommentiert, sodass nur die A/D-Ansteuerung und die Ausgabe der S/H Flanken überblieb.

SampHold.c:

/***************************************************************************/

/* Erzeugung Sample - Hold Flanken Schnabel Thomas VEA 9.1.1998 */

/***************************************************************************/

#include<stdio.h>

#include<conio.h>

#include<dos.h>

#include<stdlib.h>

const BASE=0x220;

unsigned char AD0l,AD0h,AD1l,AD1h;

int i,j,AD0,AD1;

float u,is,r,rm;

char ch;

char ustring[7];

istring[7];

rstring[7];

AD0string[7],

AD1string[7];

char name[10];

FILE *datei;

void main ()

{ /* Initialisieren der Karte */

outportb(BASE+9,0x00); /* Verstärkung auf 1 */

outportb(BASE+11,0x01); /* Mode Control Register */

outportb(BASE+13,1); /* Sample */

clrscr();

/*on Strom und Spannung durch zwei Kanälen mit je 2000 Meßwerten\n");

printf("und schreiben in eine Datei\n\n");

printf("Dateiname: ");

scanf("%s",&name);

printf("Messwiderstand: ");

scanf("%f",&rm);*/

printf("\n\nStart mit beliebiger Taste");

ch=getch();

outportb(BASE+13,1); /* Sample */

/* datei=fopen(name,"w");*/

/* for (i=0;i<20000;i++)*/

for (;;)

{

printf(". ");

outportb(BASE+13,0); /* HOLD */

outportb(BASE+10,0); /* Multiplexer Kanal 0 */

outportb(BASE+12,0); /* startet Wandler */

while (inportb(BASE+5) > 15); /* warte bis Wandler fertig DRDY=0 */

AD0h=inportb(BASE+5) & 0x0f;

AD0l=inportb(BASE+4);

outportb(BASE+10,1); /* Multiplexer Kanal 1 */

outportb(BASE+12,0); /* startet Wandler */

while (inportb(BASE+5) > 15); /* warte bis Wandler fertig DRDY=0 */

AD1h=inportb(BASE+5) & 0x0f;

AD1l=inportb(BASE+4);

outportb(BASE+13,1); /* SAMPLE /*

/* Werte in Datei schreiben */

/* AD0=(AD0h*256) + AD0l;

*/ AD1=(AD1h*256) + AD1l;

/*is =AD1/rm;

u=AD0;

r=(u-AD1)/is;

itoa(r,rstring,10);

fprintf(datei,"%s\n",rstring);*/

/*u=AD0-AD1;

is=1000*AD1/rm;

itoa(u,ustring,10);

itoa(is,istring,10);

fprintf(datei,"%s,%s\n",ustring,istring);*/

/* itoa(AD0,AD0string,10);

itoa(AD1,AD1string,10);

fprintf(datei,"%s,%s\n",AD0string,AD1string);

if (i==1) gotoxy(1,1);

textcolor(i);

cprintf("+");

if(i==1999) cprintf(" F E R T I G- F E R T I G - F E R T I G - F E R T I G - F E R T I G -F E R T I G\n");

*/

}

/* fclose(datei);*/

getche();

}

Mit dem Oszilloskop P2 wurden die Flanken am Ausgang der A/D Wandlerkarte und am Emitter des Transistors V1 geprüft  das Programm funktionierte.

Der S/H Baustein folgte einer Änderung der Eingangsspannung.

3.3 Aufnahme der 2000 Messwerte

Danach wurde das eigentliche Programm gestartet. Nach der Korrektur einiger Fehler sah es folgendermaßen aus:

Statt dieser Seite EasyCase SP Struktogramm einfügenU_I_MEA2.c:

/*************************************************************************/

/* Strom und Spannungsmessung 2.Version Schnabel Thomas VEA 9.1.1998 */

/* Problem behoben : Zähler & Stromvariable : beide i -> Stromvar. is */

/*************************************************************************/

#include<stdio.h>

#include<conio.h>

#include<dos.h>

#include<stdlib.h>

const BASE=0x220;

unsigned char AD0l,AD0h,AD1l,AD1h;

int i,j,AD0,AD1;

float u,is,r,rm,s,t;

char ch;

char ustring[7];

char istring[7];

char rstring[7];

char AD0string[7];

char AD1string[7];

char name[10];

FILE *datei;

void main ()

{ /* Initialisieren der Karte */

outportb(BASE+9,0x00); /* Verstärkung auf 1 */

outportb(BASE+11,0x01); /* Mode Control Register */

outportb(BASE+13,1); /* Sample */

clrscr();

printf("Messung von Strom und Spannung durch zwei Kanälen mit je 2000 Meßwerten\n");

printf("und schreiben in eine Datei\n\n");

printf("Dateiname: ");

scanf("%s",&name);

printf("Messwiderstand: ");

scanf("%f",&rm);

printf("\n\nStart mit beliebiger Taste");

ch=getch();

outportb(BASE+13,1); /* Sample */

datei=fopen(name,"w");

for (i=0;i<2000;i++)

{ outportb(BASE+13,0); /* HOLD */

outportb(BASE+10,0); /* Multiplexer Kanal 0 */

outportb(BASE+12,0); /* startet Wandler */

while (inportb(BASE+5) > 15); /* warte bis Wandler fertig DRDY=0 */

AD0h=inportb(BASE+5) & 0x0f;

AD0l=inportb(BASE+4);

outportb(BASE+10,1); /* Multiplexer Kanal 1 */

outportb(BASE+12,0); /* startet Wandler */

while (inportb(BASE+5) > 15); /* warte bis Wandler fertig DRDY=0 */

AD1h=inportb(BASE+5) & 0x0f;

AD1l=inportb(BASE+4);

outportb(BASE+13,1); /* SAMPLE /*

/* Werte in Datei schreiben */

AD0=(AD0h*256) + AD0l;

AD1=(AD1h*256) + AD1l;

i=AD0;

j=AD1;

s=i;

s=((s/4096)*10-5);

t=j;

t=((t/4096)*10-5);

/* is =AD1/rm;

u=AD0;

r=(u-AD1)/is;

itoa(r,rstring,10);

fprintf(datei,"%s\n",rstring);*/

/* u=AD0-AD1;

is=1000*AD1/rm;

itoa(u,ustring,10);

itoa(is,istring,10);

fprintf(datei,"%s,%s\n",ustring,istring);*/

itoa(s,AD0string,10);

itoa(t,AD1string,10);

fprintf(datei,"%s,%s\n",AD0string,AD1string);

if (i==1) gotoxy(1,1);

textcolor(i);

cprintf("+");

if(i==1999) cprintf(" F E R T I G- F E R T I G - F E R T I G - F E R T I G - F E R T I G -F E R T I G\n");

}

fclose(datei);

getche();

}

Das Programm lieferte jedoch folgende Wertepaare:

Beispieldatei 1 (TEST)

Beispieldatei 2 (T)

3074,3916

3076,3916

3076,3915

3075,3915

3077,3915

3076,3915

etc.

2691,3254

2692,3254

2688,3253

2691,3254

2694,3254

2691,3254

etc.

Es ist erkennbar, dass der erste Wert nicht der Hälfte des zweiten entspricht (angelegt: DC-Spannung U0 = U1).

Die Fehlerquelle konnte nicht eruiert werden. Der kurz vor Schluss eingebaute Teil mit den Variablen i, j, s und t führte zu keiner Lösung. Eine Messung mit RL und RM wurde nicht mehr durchgeführt.

4 Interpretation der Messergebnisse

Die ersten beiden Tests (Punkte 3.1, 3.2) zeigen, dass die Einleseroutine und die Karte selbst sowie die S/H-Schaltung funktionierten.

Es muss deshalb entweder beim weiteren Editieren oder bei der Umwandlung der Daten nach dem Einlesen ein Fehler aufgetreten sein. Dieser konnte auch bei nachträglicher Analyse des Programms nicht gefunden werden.

Möglicherweise ist auch nur durch eine Verstellung der Karte (Trimmpotentiometer, Jumper, falsche Registerwerte) ein Offset vorhanden. Dies hätte eventuell durch das Anlegen eines zeitlich veränderlichen Signals eingegrenzt werden können.

Das Programm selbst könnte noch verbessert werden, indem die Daten nicht direkt in die Datei, sondern zuerst in ein Array geschrieben würden.


Creative Commons Lizenzvertrag
Dieses Werk ist lizenziert unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Österreich Lizenz.
[http://www.FLR.at/]
Letztes Update vom 25. Jul. 1999 von Florian Rosenauer

Previous PageTop Of Page Next Page

Powered by Transit