MAX195

G

Gerhard Glatte

Guest
Hallo,

mein Name ist Gerhard und im Moment arbeite ich in einer Gruppe an unserer
Diplomarbeit (Abschlussphase meines Schultyps). In dieser Arbeit verwenden
wir den MAX195 16bit AnalogDigital Converter.

Wir haben aber nun folgendes Problem:
Wir haben eine Platine für den MAX195 hergestellt und steuern den Chip über
einen PIC Microcontroller (PIC16F877) an. Der MAX195 konvertiert das analoge
Signal zwar korrekt, aber fast alle 3 Sekunden (großer Verdacht auf einen
periodischen Prozess) "springt" das konvertierte Signal (z.B.: von 1,12568
auf 1,13568), aber das analoge Signal (welches zu konvertieren ist) springt
nicht.

Wir takten die daten seriell (nach der Wandlung) aus dem Chip indem wir den
SCLK pin "High" und "Low" setzten (gesteuert durch den Microcontroller).

Wenn jemand von euch mit diesem ADC gearbeitet hat, bitte helft uns!
Wir versuchen dem Prolem schon seit Wochen auf den Grund zu gehen - ohne
Erfolg,

Gerhard
 
Hallo,

Gerhard Glatte wrote:

Hallo,

mein Name ist Gerhard und im Moment arbeite ich in einer Gruppe an unserer
Diplomarbeit (Abschlussphase meines Schultyps). In dieser Arbeit verwenden
wir den MAX195 16bit AnalogDigital Converter.

Wir haben aber nun folgendes Problem:
Wir haben eine Platine für den MAX195 hergestellt und steuern den Chip
über einen PIC Microcontroller (PIC16F877) an. Der MAX195 konvertiert das
analoge Signal zwar korrekt, aber fast alle 3 Sekunden (großer Verdacht
auf einen periodischen Prozess) "springt" das konvertierte Signal (z.B.:
von 1,12568 auf 1,13568), aber das analoge Signal (welches zu konvertieren
ist) springt nicht.

Wir takten die daten seriell (nach der Wandlung) aus dem Chip indem wir
den SCLK pin "High" und "Low" setzten (gesteuert durch den
Microcontroller).

Wenn jemand von euch mit diesem ADC gearbeitet hat, bitte helft uns!
Wir versuchen dem Prolem schon seit Wochen auf den Grund zu gehen - ohne
Erfolg,
Ich hab zwar noch nicht mit dem Ding gearbeitet, aber meine Ideen wären
folgende: Was benutzt ihr für eine Referenz? Ändert sich die
Betriebsspannung oder ist sie konstant?. Was macht ihr mit dem PIC: Wird
der in den Standby-Modus gesetzt?, Wie sieht es mit dem Platinenlayout aus?
Habt ihr schon mal mit nem Oszi nachgemessen? Es könnte auch auf einen
Fehler in der Datenübertragung vom AD-Wandler zum PIC zurückzuführen sein.

mfg
Andreas
--
gnuPG keyid: 0xE94F63B7 fingerprint: D189 D5E3 FF4B 7E24 E49D 7638 07C5 924C
E94F 63B7
 
Andreas Messer wrote:
Hallo,

Gerhard Glatte wrote:

Hallo,

mein Name ist Gerhard und im Moment arbeite ich in einer Gruppe an unserer
Diplomarbeit (Abschlussphase meines Schultyps). In dieser Arbeit verwenden
wir den MAX195 16bit AnalogDigital Converter.

Wir haben aber nun folgendes Problem:
Wir haben eine Platine für den MAX195 hergestellt und steuern den Chip
über einen PIC Microcontroller (PIC16F877) an. Der MAX195 konvertiert das
analoge Signal zwar korrekt, aber fast alle 3 Sekunden (großer Verdacht
auf einen periodischen Prozess) "springt" das konvertierte Signal (z.B.:
von 1,12568 auf 1,13568), aber das analoge Signal (welches zu konvertieren
ist) springt nicht.

Wir takten die daten seriell (nach der Wandlung) aus dem Chip indem wir
den SCLK pin "High" und "Low" setzten (gesteuert durch den
Microcontroller).

Wenn jemand von euch mit diesem ADC gearbeitet hat, bitte helft uns!
Wir versuchen dem Prolem schon seit Wochen auf den Grund zu gehen - ohne
Erfolg,

Ich hab zwar noch nicht mit dem Ding gearbeitet, aber meine Ideen wären
folgende: Was benutzt ihr für eine Referenz? Ändert sich die
Betriebsspannung oder ist sie konstant?. Was macht ihr mit dem PIC: Wird
der in den Standby-Modus gesetzt?, Wie sieht es mit dem Platinenlayout aus?
Habt ihr schon mal mit nem Oszi nachgemessen? Es könnte auch auf einen
Fehler in der Datenübertragung vom AD-Wandler zum PIC zurückzuführen sein.


oder einen "zahlendreher" im Programm, dass den Chip ansteuert (da habe ich
mich auch schon mal "dumm" gesucht)...
Evtl. auch Probleme bei der Masseführung (getrennte/ungünstige
Analog/Digitalmasseführung...?)


S.
 
"Gerhard Glatte" <gerhard.glatte@world4you.com> :

"springt" das konvertierte Signal (z.B.: von 1,12568 auf 1,13568)
^ ^

ist das immer nur ein Digit? Dann muss es ein Software-Fehler sein?
Oder vielleicht vertauscht du irgendwo ein bit.
 
Hi!

Wir haben aber nun folgendes Problem:
Wir haben eine Platine für den MAX195 hergestellt und steuern den Chip
über
einen PIC Microcontroller (PIC16F877) an. Der MAX195 konvertiert das
analoge
Signal zwar korrekt, aber fast alle 3 Sekunden (großer Verdacht auf einen
periodischen Prozess) "springt" das konvertierte Signal (z.B.: von 1,12568
auf 1,13568), aber das analoge Signal (welches zu konvertieren ist)
springt
nicht.
guck dir doch erstmal direkt die gesampleten unverarbeiteten Werte an. Wenn
da der fehler auch auftritt, solltest du deine Datenübertragung (Einhaltung
der min/max-Zeiten) nochmal kontrollieren. Das könnte ein kippendes Bit
sein. Wenn du einen Logic-Analyser zur verfügung hast, könntest du dir auch
mit dem ľC nen Trigger generieren (wenn wertneu-wertalt>schwelle) und mit
ner großen preSample-Einstellung gucken was der a/d-Wandler liefert und was
der Pic auswertet. Wenn die unverabeiteten Werte richtig ankommen, liegts
wohl logischerweise an der Software.

mfg
Jan
 
Hallo,

Ich hab zwar noch nicht mit dem Ding gearbeitet, aber meine Ideen wären
folgende: Was benutzt ihr für eine Referenz?
Wir verwenden den LT1009, 2.5V Referenzspannungsquelle

Ändert sich die Betriebsspannung oder ist sie konstant?.
Betriebsspannung ist mit 7805 stabilisiert

Was macht ihr mit dem PIC: Wird der in den Standby-Modus gesetzt?,
Nichts dergleichen. PIC rennt ganz normal das ADC Programm ab.
Ich poste gleich das Programm...

Wie sieht es mit dem Platinenlayout aus?
Auf http://mitglied.lycos.de/summanus/adc befindet sich ein Screenshot vom
Platinenlayout bzw. Schaltplan.

Habt ihr schon mal mit nem Oszi nachgemessen? Es könnte auch auf einen
Fehler in der Datenübertragung vom AD-Wandler zum PIC zurückzuführen sein.
Haben wir nachgemessen. Stimmt alles.


Gerhard
 
Hallo,

ist das immer nur ein Digit? Dann muss es ein Software-Fehler sein?
Oder vielleicht vertauscht du irgendwo ein bit.
Manchmal ist es nur ein Digit, dann sind es wieder zwei. Und komischerweise
nicht das letzte bit (LSB). Das würde ich ja noch verstehen wenn das
springt, aber es springt eben das 7te bit (von vorne gezählt (an erster
Stelle steht das MSB)).

Programm poste ich gleich, bzw. befindet sich auf:
http://mitglied.lycos.de/summanus/adc


Gerhard
 
Hallo

guck dir doch erstmal direkt die gesampleten unverarbeiteten Werte an.
Wenn
da der fehler auch auftritt, solltest du deine Datenübertragung
(Einhaltung
der min/max-Zeiten) nochmal kontrollieren.
Auch der unverarbeitete Wert springt.
Die min/max Zeiten müssten stimmen, aber ich werde die nochmals
kontrollieren.


Das könnte ein kippendes Bit
sein. Wenn du einen Logic-Analyser zur verfügung hast, könntest du dir
auch
mit dem ľC nen Trigger generieren (wenn wertneu-wertalt>schwelle) und mit
ner großen preSample-Einstellung gucken was der a/d-Wandler liefert und
was
der Pic auswertet. Wenn die unverabeiteten Werte richtig ankommen, liegts
wohl logischerweise an der Software.
Steht leider nicht zur Verfügung.

Gerhard
 
Hallo,

Hier also das Programm:

// TIKUSI_03_01
// Datei: max195.c
// Beschreibung: Ansteuerung des ADCs MAX195
// Autor: Filzmaier/Glatte
// Datum: 20.11.2003
// Revised: 27.11.2003
// Revised: 05.02.2004 (Platine vorhanden)
// Revised: 06.02.2004


#include <16f877.h> // den 16F877-Prozessor verwenden
#device ICD=TRUE // den ICD (In Circuit Debugger) verwenden
#use delay(clock=20000000) // Zeitverzögerungen vom 20MHz-Quarz ableiten
#fuses HS,nowdt,noprotect
#include <lcd.c>

void cal_adc();
void convert();

// Pinbelegung:
// A0: SCLK: Conversion Clock Clock
// A1: DOUT: Serieller Daten Ausgang vom IC
// A2: CS: Aktiviert den seriellen Daten Ausgang
// A3: Start: Bei CLK 0 und CONV 0: Beginnt der Konvertierungsvorgang
// A5: Reset: von 0 auf 1: Initialisierung
// C1: EOC

void main() // Hauptprogramm
{
float const faktor=13107; // Faktor zum Umrechnen auf Volt Wert
int i,k; // Zähl- bzw. Umrechnungsvariable
int16 data=0; // Digitaler Wert vom ADC
int16 shift=0; // Hilfsvariable zum Berechnen von data

float value=0; // Digitaler Spannungs Wert
signed int16 zwischen=0; // Hilfsvariable zum Berechnen von value

setup_adc_ports(no_analogs); // keine analogen Ein/Aus Gänge

output_high(pin_a2); // CS auf High setzten
output_high(pin_a3); // Start auf high setzten
output_high(pin_a5); // Reset auf high setzten

lcd_init(); // Initialisierung des LC Displays
printf(lcd_putc,"ADC"); // ADC aufs Display schreiben
delay_ms(1000); // 1000ms warten
printf(lcd_putc,"\f"); // Display löschen

cal_adc(); // ADC kalibrieren

while(true)
{
data=0;
value=0;
zwischen=0;
k=14;

convert(); // analogen Wert konvertieren
lcd_gotoxy(1,1); // Cursor LCD auf Position 1,1 bringen

output_low(pin_a2); //CS auf low setzen
printf(lcd_putc,"%u",input(pin_a1)); // MSB auf Display schreiben
shift=input(pin_a1)<<15; // Dezimalen Wert berechnen
data=data|shift; // Dezimalen Wert berechnen
shift=0;

for(i=0;i<15;i++) // die restlichen 15 bit auslesen
{
output_low(pin_a0); // SCLK auf low
delay_ms(5);
output_high(pin_a0); // SCLK auf high
delay_ms(5);
printf(lcd_putc,"%u",input(pin_a1)); // binären Wert aufs LCD schreiben
shift=input(pin_a1)<<(14-i); // Dezimalen Wert berechnen
data=data|shift; // Dezimalen Wert berechnen
}

output_high(pin_a2); // CS wieder auf high setzten
zwischen=(data-32768); // Berechnung des Spannungs Wertes
value=(float)zwischen/faktor; // Berechnung des Spannungs Wertes

lcd_gotoxy(1,2); // am LCD in zweite Zeile springen
printf(lcd_putc,"U: %1.5f V ",value); // Spannungswert ausgeben
}
}

void cal_adc() // ADC kalibrieren
{
output_low(pin_a5); // Reset auf low pulsen
delay_ms(1);
output_high(pin_a5);
delay_ms(100); // Kalibrierungszeit abwarten
}

void convert() // analogen Wert konvertieren
{
output_low(pin_a3); // Start Impuls geben
delay_us(100);
output_high(pin_a3);
while(input(pin_c1)==0); // Warten bis EOC high gesetzt wird
}
 
Hi!

Auch der unverarbeitete Wert springt.
Die min/max Zeiten müssten stimmen, aber ich werde die nochmals
kontrollieren.
ja also, wenn die unverarbeiteten werte nicht stimmen, kanns ja entweder nur
an der Übertragung oder am A/D-Wandler selber liegen (eher
unwahrscheinlich). Also du solltest gucken, daß du irgenwo ein 2
Kanal-Speicheroszi oder nen Logicanylser herbekommst. Alternativ kanst du
versuchen den a/d-wandler mal auszutauschen. du könntest mit einem
Signalgenerator auch mal testsignale anlegen um das auftreten des Fehlers
einzugrenzen. Bei dem Aufbau über die Steckbretter solltest du auch
kontrollieren, ob da kein Wackler drinnen ist. Im Übrigen erscheinen mir die
5ms wartezeit zwischen dem Umschalten der Clk-Leitung im Quelltext sehr
lang. Soooo langsam ist der A/D-Wandler sicher nicht.

mfg
Jan
 
Gerhard Glatte wrote:

Wie sieht es mit dem Platinenlayout aus?
Auf http://mitglied.lycos.de/summanus/adc befindet sich ein Screenshot vom
Platinenlayout bzw. Schaltplan.
Ich finde im Schaltplan schonmal C4 und C5 (0,1u und 10u) auf der falschen
Seite der Spule L1. Ich denke die sollten direkt von VSSA/VSSD nach GND
gelegt werden. Als Anregung mal Figure 22 "Supply Bypassing and Grounding"
auf Seite 22 des Datenblattes vom MAX195 ansehen...

Und wo ist die Referenz? wird die mit 10m Kabel an die zwei Pins
angeschlossen, die da mitten im Bild keine Bezeichnung haben? Der wäre ja
erstmal 'ne Packung Kondensatoren (100nF parallel 10uF) direkt von REF Pin
zum AGND angesagt, evt. noch den 10 Ohm Vorwiderstand nach Maxim-Vorgabe am
Ref-Pin.

Ich habe mir das Datenblatt vom MAX195 nicht so genau angesehen, aber welche
Betriebsart verwendest Du denn, asynchroner oder synchroner Clock zum
Datentransfer, ist das Abholen der Daten eindeutig nach einer
abgeschlossenen Wandlung und vor dem Start einer neuen? Nicht dass da Daten
asynchron zur Wandlung aus dem Teil geholt werden und deshalb alle paar
Messungen gerade so unglücklich ein halb und halb neuer/alter Datensatz aus
dem MAX195 geholt wird...

Layout mag ich gar nicht ansehen ;-)

Ingolf
 

Welcome to EDABoard.com

Sponsor

Back
Top