Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Bitfehler bei AD-Wandlung Kategorie: Programmierung (von m8_nix - 28.04.2007 19:11)
Ich nutze:
C164CI-ControllerBoard
Hallo,

Ich bin am verzweifeln. Ich habe vor mir einen kleinen 0/4...20mA Kalibrator zu bauen.
Das Ausgeben eines 0...20mA Signals funktioniert schon mal recht gut ĂĽber einen AD420.
Zum einlesen eines Signals habe ich mich fĂĽr einen Max1270 AD-Wandler entschieden.
Dieser 12-Bit Wandler besitzt 8 (+-0-5V, +-0-10V) Eingänge, wovon ich aber nur 3 nutze.
Der Max1270 bisitzt ein serielles Interface welches laut Datenblatt (eigentlich) recht einfach
zu programieren sein sollte. Einem Control-Byte was zum Wandler gschickt werden muss, folgt
eine Acquisitationsphase, nach der die Daten Bitweise ausgegeben werden (MBS zuerst).

Doch wie ich es auch anstelle, der Wandler liefert mir immer wieder falsche Ergebnisse.
Es sind aber auch werterichtige Wandlungen darunter. Tendenziell geht das Wandlungsergebnis
in die richtige Richtung (soll heissen die Bitfehler wandern mit). Wenn ich mir das Wandlunsergebnis
als Dualzahl ausgeben lasse, fällt auf, das wenn eine falsche Wandlung vorliegt, gleich immer mehrere Bits
unstimmig sind. Es betrifft aber nicht nur die "unteren" Bits, was noch als Wandlerrauschen abgetan
werden könnte.

Hier eine Beispiel einer Wandlungsreihe (1 Sekunden Pause).
Wandlung an Channel 0,  Wandlerrange =0-10V, Einganssignal gemessen 5,00V (2048):
INT= 2073 - 1537 - 1335 - 2809 - 2101 - 2476 - 1790 - 2044 - 2052 - 2156 - 2758 - 2190 usw.

Bei 10 V sieht die Sache etwas besser aus -  10,0V (4095):
INT= 3999 - 4095 - 4024 - 4095 - 4043 - 4072 - 4095 - 4094 - 4095 - 3960 - 4095

Hier der Programmauszug der Messroutine

const Clock_Max1270 = 6;  //Clock Eingang Max1270     P1L6
const CS_Max1270 = 7;     //Chip Select (Low Aktiv)   P1L7
const DIN_Max1270 = 13;   //Data In Max1270           P1H5
const SSTRB_Max1270 = 14; // Strobe Ausgang Max1270   P1H6
const DOUT_Max1270 = 15;  // Data Out Max1270         P1H7

function readAD(byte ch,byte mod)returns int  //ch = channel 0...7
{                                             //mod 0 = 0-5V,  1 = 0-10V
 byte b;                                      //2 = +-5V   3 = +-10V
 int i, v;
 b=(ch shl 4) or 0b10000000;                  //Auswahl channel und Startbit
 if mod == 1 b=b or 0b00001000;               //0..10V
 if mod == 2 b=b or 0b00000100;               //0..+-5V
 if mod == 3 b=b or 0b00001100;               //0..+-10V
 ports.set(CS_Max1270,0);                     //Chip Select Max1270 (LowAktiv)
 for i =0...7                                 //Controlbyte senden
 {
  ports.set(DIN_Max1270,(b and 0b10000000) shr 7); //DIN Max1270
  ports.set(Clock_Max1270,1);                      //Clock Max1270 = high;
  b=b shl 1;                                       //nächstes Controlbit vorber.
  ports.set(Clock_Max1270,0);                      //Clock Max1270 = low;
 }
 ports.set(CS_Max1270,1);                          //Chip Select Max1270 high;
 sleep 1;
 v=0;
 wait(ports.get(SSTRB_Max1270));                  //warten bis Acquisitation
                                                   //beendet (SSTRB=high);
 ports.set(CS_Max1270,0);                          //Chip Select Max1270 low;
 for i=0...11                                      //12 Bit ergebnis einlesen.
 {
  v=v shl 1;                                       //fĂĽr nächstes Bit shiften
  if ports.get(DOUT_Max1270)!=0 v=v or 1;          //Bit einlesen
  ports.set(Clock_Max1270,1);                      //Clock = high;
  ports.set(Clock_Max1270,0);                      //Clock = low (neues Bit)
 }
 ports.set(CS_Max1270,0);                          //CS high fĂĽr Ende
 return v;                                         //Wandlungsergebnis ĂĽbergeben
}


Wer kann mir helfen? Den Schaltplan und Datenblätter schicke ich gerne zu.
Datenblatt Max1270



    Antwort schreiben


Antworten:

Bitfehler MAX1270 (von m8_nix - 30.04.2007 21:39)
    Fehler gefunden (von m8_nix - 3.05.2007 22:40)