Bitfehler bei AD-Wandlung Kategorie: Programmierung (von m8_nix - 28.04.2007 19:11) | ||
| ||
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) |