Forum: Mikrocontroller und Digitale Elektronik Probleme mit TM7705 an Arduino nano3


von Matthias W. (matt007)


Lesenswert?

TM7705 soll kompatibel sein zu AD7705. Nur werden trotz Code nah am 
Datenblatt-Beispielcode nur ffff als Daten ausgelesen. Der DOUT-Ausgang 
erscheint wie high Z. Clk-Pulse mit 250kHz liegen am chip an. Auf DRDY 
sah ich auch Pulse. Reset sollte hi sein weil lt. Schaltplan ein 
Widerstand auf hi zieht. Referenz=2.5V da. Die Register werden wie 
vorgesehen programmiert, darunter das Clockregister für den Teiler/2 wg. 
4.9MHz Quarz.

Der Arduino nano3 wird über USB vom Laptop versorgt. Statt 5V sind etwas 
mehr als 4V Vcc zu messen. Das sollte für den Betrieb wohl reichen.

CS kommt an. Das hatte ich mit einer Code-Schleife CS hi/CS lo je 125ns 
getestet. Wo klemmt es? Wer hat dazu eine Idee?

Hier der Code:
1
#define AD7705_CS_OUT()   sbi(DDRD,5)  // CS an PD5 auf Ausgabe setzen
2
#define AD7705_CS_LOW()   cbi(PORTD,5) // CS an PD5 low setzen
3
#define AD7705_CS_HIGH()  sbi(PORTD,5) // CS an PD5 high setzen
4
#define AD7705_DRDY       (PIND & 0x40)// 0100 0000 PD6: test for DRDY
5
6
BYTE data_h, data_l; // 2 bytes = zusammen 16bit
7
BYTE dummy;
8
unsigned int data;
9
10
delay_ms(1000); // warte bis AD7705 sicher eingeschwungen
11
12
AD7705_CS_HIGH(); // 125ns HI
13
14
// SPI: Takt etc.
15
SPCR = (0<<SPIE)|(0<<SPE)|(0<<DORD)|(1<<MSTR)|(1<<CPOL)|(1<<CPHA)|(1<<SPR1)|(1<<SPR0);
16
sbi(SPSR,SPI2X);  // 250kHz: 4MHz muesste auch gehen lt. Datenblatt S.8
17
                  // 4us-Takt zu sehen. 250kHz ok.
18
19
USART_Tx_msg(PSTR("\nSPI programmiert\n")); // Meldung ausgeben
20
21
// 0x20 schreiben in command register
22
// active channel Ain1(+)/Ain1(−), next operation write to clock register
23
AD7705_CS_LOW();  // CS low vor Schreiben SPI
24
sbi(SPCR,SPE);    // SPI aktiv schalten
25
SPDR = 0x20;      // put byte 'out' in SPI data register for output
26
                  // 0010 0000 write clock register, normal, CH0
27
while(!(SPSR & (1<<SPIF))); // wait for transfer complete, poll SPIF-flag
28
dummy = SPDR;    // read value in SPI data reg.
29
                  // Byte nicht weiter genutzt
30
cbi(SPCR,SPE); // SPI deaktiv schalten
31
AD7705_CS_HIGH(); // CS hi nach Schreiben SPI
32
33
USART_Tx_msg(PSTR("0x20 ausgegeben\n")); // Meldung ausgeben
34
35
// 0x0C schreiben in clock register
36
// master clock enabled, 4.9512MHz clock, set output rate to 50Hz
37
AD7705_CS_LOW();  // CS low vor Schreiben SPI
38
sbi(SPCR,SPE); // SPI aktiv schalten
39
SPDR = 0x0C;      // put byte 'out' in SPI data register for output
40
                  // 0000 1100 teilt 4.9MHz durch 2, 50Hz
41
while(!(SPSR & (1<<SPIF))); // wait for transfer complete, poll SPIF-flag
42
dummy = SPDR;    // read value in SPI data reg.
43
                  // Byte nicht weiter genutzt
44
cbi(SPCR,SPE); // SPI deaktiv schalten
45
AD7705_CS_HIGH(); // CS hi nach Schreiben SPI
46
47
USART_Tx_msg(PSTR("0x0C ausgegeben\n")); // Meldung ausgeben
48
49
// 0x10 schreiben in command register
50
// active channel Ain1(+)/Ain1(−), next operation write to setup register
51
AD7705_CS_LOW();  // CS low vor Schreiben SPI
52
sbi(SPCR,SPE); // SPI aktiv schalten
53
SPDR = 0x10;      // put byte 'out' in SPI data register for output
54
                  // 0001 0000 Wahl setup register
55
while(!(SPSR & (1<<SPIF))); // wait for transfer complete, poll SPIF-flag
56
dummy = SPDR;    // read value in SPI data reg.
57
                  // Byte nicht weiter genutzt
58
cbi(SPCR,SPE); // SPI deaktiv schalten
59
AD7705_CS_HIGH(); // CS hi nach Schreiben SPI
60
61
USART_Tx_msg(PSTR("0x10 ausgegeben\n")); // Meldung ausgeben
62
63
// 0x40 schreiben ins setup register
64
// gain=1, bipolar, buffer off, clear FSYNC, self calibration
65
AD7705_CS_LOW();  // CS low vor Schreiben SPI
66
sbi(SPCR,SPE); // SPI aktiv schalten
67
SPDR = 0x44;      // put byte 'out' in SPI data register for output
68
                  // 0100 0100 self calib CH0, no buff, unipol, FSYNC start
69
while(!(SPSR & (1<<SPIF))); // wait for transfer complete, poll SPIF-flag
70
dummy = SPDR;    // read value in SPI data reg.
71
                  // Byte nicht weiter genutzt
72
cbi(SPCR,SPE); // SPI deaktiv schalten
73
AD7705_CS_HIGH(); // CS hi nach Schreiben SPI
74
                  // CS wegnehmen bevor DRDY ausgewertet: vgl. S.32
75
76
USART_Tx_msg(PSTR("0x44 ausgegeben\n")); // Meldung ausgeben
77
78
while (AD7705_DRDY);  // warten bis fertig
79
80
USART_Tx_msg(PSTR("data ready \n")); // Meldung ausgeben
81
82
// Datenwerte einlesen
83
while (1){
84
  // 0x38 schreiben ins command register -> Daten auslesen
85
  // set next operation for 16 bit read from data register
86
  AD7705_CS_LOW();  // CS low vor Schreiben SPI
87
  sbi(SPCR,SPE); // SPI aktiv schalten
88
  SPDR = 0x38;      // put byte 'out' in SPI data register for output
89
                    // 0011 1000 spreche Datenregister an, lesend
90
  while(!(SPSR & (1<<SPIF))); // wait for transfer complete, poll SPIF-flag
91
  dummy = SPDR;   // read value in SPI data reg.
92
                 // Byte nicht weiter genutzt
93
  cbi(SPCR,SPE); // SPI deaktiv schalten
94
  AD7705_CS_HIGH(); // CS hi nach Schreiben SPI
95
96
  USART_Tx_msg(PSTR("0x38 ausgegeben -> data anfordern\n")); // Meldung
97
  // warte auf Daten
98
  while (AD7705_DRDY);  // warten bis fertig
99
  
100
  USART_Tx_msg(PSTR("data ready \n")); // Meldung ausgeben
101
102
  AD7705_CS_LOW();  // CS low vor Schreiben SPI
103
  sbi(SPCR,SPE); // SPI aktiv schalten
104
  SPDR = 0x00;      // put byte 'out' in SPI data register for output
105
  while(!(SPSR & (1<<SPIF))); // wait for transfer complete, poll SPIF-flag
106
  data_h = SPDR;    // read value in SPI data reg.
107
  SPDR = 0x00;      // put byte 'out' in SPI data register for output
108
  while(!(SPSR & (1<<SPIF))); // wait for transfer complete, poll SPIF-flag
109
  data_l = SPDR;    // read value in SPI data reg.
110
  cbi(SPCR,SPE); // SPI deaktiv schalten
111
  AD7705_CS_HIGH(); // CS hi nach Schreiben SPI
112
113
  USART_Tx_msg(PSTR("data_h:")); // Meldung ausgeben
114
  USART_Tx_int(data_h);
115
  USART_Tx_msg(PSTR("\n")); // Meldung ausgeben
116
  USART_Tx_msg(PSTR("data_l:")); // Meldung ausgeben
117
  USART_Tx_int(data_l);
118
  USART_Tx_msg(PSTR("\n")); // Meldung ausgeben
119
120
  data= ((((unsigned int)data_h) << 8) | (unsigned int)data_l);
121
  USART_Tx_msg(PSTR("\nADC-Wert: ")); // Meldung ausgeben
122
  USART_Tx_int(data);
123
  USART_Tx_msg(PSTR("\n")); // Meldung ausgeben
124
}

von Matthias W. (matt007)


Lesenswert?

http://forum.arduino.cc/index.php?topic=391050.0
"have two tm7705 boards from ebay, im trying to read adc chanel 1 with a 
library made by  Kerry D.Wong but its not working.."
"The library is broken for tm7705, I can't remember exactly, but I 
needed to correct some things in there. I ended up writing my own code 
for accessing the module. But I never got proper results out of them."

da haben offenbar noch andere Probleme mit diesen Teilen.

"I moved on to ADS1115 / ADS1118 which are very easy to access and very 
precise. They're even cheaper as well."

sogar ein Umstieg auf die billigeren ADS1115 / ADS1118 wird empfohlen. 
Sind die TM7705 denn wirklich so eine Katastrophe?

von Matthias W. (matt007)


Lesenswert?

mein obiger Code orientiert sich am Original-Datenblatt AD7705/AD7706. 
Flowchart S.33 linker Teil und "C Code for Interfacing AD7705 to 68HC11" 
S.36f. Eben das versuchte ich sinngemäß umzusetzen.

Sicher hat es einen Grund warum dies so nicht geklappt hat.

: Bearbeitet durch User
von Matthias W. (matt007)


Lesenswert?

keine Ideen woran das liegen kann?

von Frank K. (fchk)


Lesenswert?

Matthias W. schrieb:

> Der Arduino nano3 wird über USB vom Laptop versorgt. Statt 5V sind etwas
> mehr als 4V Vcc zu messen. Das sollte für den Betrieb wohl reichen.

Hast DU das Datenblatt gelesen? Ja? Da steht gleich auf der ersten Seite
"2.7 V to 3.3 V or 4.75 V to 5.25 V operation".

> CS kommt an. Das hatte ich mit einer Code-Schleife CS hi/CS lo je 125ns
> getestet. Wo klemmt es? Wer hat dazu eine Idee?

Nimm einen Logicanalyzer und schau, was raus kommt. Wenn Du keinen hast, 
kauf Dir einen.

fchk

von Matthias W. (matt007)


Lesenswert?

Frank K. schrieb:
> Hast DU das Datenblatt gelesen? Ja?

ja ! mehrfach. Daran angelehnt stammt ja auch der obere Code.

von Matthias W. (matt007)


Lesenswert?

Frank K. schrieb:
> Da steht gleich auf der ersten Seite
> "2.7 V to 3.3 V or 4.75 V to 5.25 V operation".

Ja. Das steht da. Und was heißt das nun genau?

Soll das heißen daß das chip innen einen Schalter hat und unterscheidet 
ob die Spannung im Bereich 2.7-3.3V liegt oder im Fenster von 
4.75-5.25V?

Das erscheint mir doch ein wenig unwahrscheinlich?

Eher würde ich vermuten daß damit gemeint ist daß die Schaltung im 
Bereich 2.7-5.25V arbeitet. Eben in diesem Bereich liegt die Spannung ja 
an.

Natürlich kann ich auch mal fest 5V anlegen und schauen was passiert. 
Laut Datenblatt sah ich das bisher nicht als kritisch an. Es sind doch 
keine 2 chips verbaut - das eine mit 3V und das andere mit 5V Betrieb.

Also muss das eine chip doch den ganzen Bereich abkönnen? Sehe ich das 
so falsch?

von Matthias W. (matt007)


Lesenswert?

Frank K. schrieb:
> Nimm einen Logicanalyzer und schau, was raus kommt. Wenn Du keinen hast,
> kauf Dir einen.

Danke Frank für den Hinweis.

Natürlich wäre ein Logikanalysator eine Bereicherung um den Ablauf auf 
Logikebene besser zu erfassen.

Nur sieht ein Logikanalysator die analogen Pegel und deren Anstiege 
schlechter als ein Oszilloskop.

Mit dem Oszilloskop sehe ich daß die SPI-Schnittstelle mit 250kHz sauber 
16 bits liest. Das kommt sauber an der Platine an. Auch der CS liegt 
sauber an. Die Anstiegsflanken sind ok und das Rechteck sauber.

Auch das Busy-Signal sah ich.

Einzig die Datenleitung DOUT tut nichts. Der Pegel dazu liegt nicht 
sauber auf VCC. Er hängt irgendwo bei 3V herum. Der Chip gibt also nicht 
sauber auf diesem Pin aus !

Da der dazugehörige Eingangspin des uC den Pullup aktiv hat wird der 
Ausgang wohl auf diese ~3V gezogen. So scheint es.

Um das zu sehen brauche ich keinen Logikanalysator.

Der obige Beispielcode hält sich wie zu sehen an die Vorgabe im 
Datenblatt. Oder ist da ein Fehler den ich bisher übersehen habe?

An und für sich ist das Teil ja interessant. Denn es ist sehr 
preisgünstig und das chinesische Datenblatt scheint inhaltsgleich mit 
dem Datenblatt von Analog Devices. Daher sollte es doch funktionieren?

von Frank K. (fchk)


Lesenswert?

Matthias W. schrieb:
> Frank K. schrieb:
>> Da steht gleich auf der ersten Seite
>> "2.7 V to 3.3 V or 4.75 V to 5.25 V operation".
>
> Ja. Das steht da. Und was heißt das nun genau?
>
> Soll das heißen daß das chip innen einen Schalter hat und unterscheidet
> ob die Spannung im Bereich 2.7-3.3V liegt oder im Fenster von
> 4.75-5.25V?

Das weiß ich nicht, aber völlig unmöglich ist es nicht.

Da steht jedenfalls, dass der Chip im Bereich von 3.3…4.75V nicht 
unbedingt wie beschrieben funktionieren muss. Vielleicht ist die 
Kalibrierung in diesem Bereich nur daneben.

Es steht jedenfalls da, und der Hersteller wird sich was dabei gedacht 
haben, und Du solltest es nicht ignorieren, wenn Du es nicht besser 
weißt. Vor allem, wenn es wie bei Dir überhaupt nicht funktioniert.

> Natürlich kann ich auch mal fest 5V anlegen und schauen was passiert.

Klar, wo ist das Problem? Du hast doch ein vernünftiges Labornetzteil, 
oder etwa nicht.

> Also muss das eine chip doch den ganzen Bereich abkönnen? Sehe ich das
> so falsch?

Bis zum endgültigen Beweis den Gegenteils ist das Dein Wunschdenken. 
Stehen tut es da nämlich nicht.

Und wenn es mit richtigen, sauberen 5V aus einem linearen Netzteil nicht 
funktioniert, dann besorgst Du Dir eben einen originalen Chip. Arm wirst 
Du dabei auch nicht. Bei chinesischen Bauteilen habe ich schon alles 
mögliche gesehen - mein Vertrauen ist begrenzt. Und Datenblätter sind in 
China Marketingmaterial und eher weniger die Zusicherung technischer 
Eigenschaften.

Alles schon erlebt, selbst mit so primitiven Sachen wie einem TL431. 
TI-Chip funktioniert, China-Chip funktioniert nicht.

fchk

von Matthias W. (matt007)


Lesenswert?

Frank K. schrieb:
> dann besorgst Du Dir eben einen originalen Chip. Arm wirst
> Du dabei auch nicht.

darum geht es erst mal weniger.
https://www.elpro.org/de/a-d-wandler/21460-ad-7705-br-smd.html
AD 7705 BR SMD 4,39 € - dazu wohl Versand.

> Bei chinesischen Bauteilen habe ich schon alles
> mögliche gesehen - mein Vertrauen ist begrenzt.

mag ja alles sein. Nur wäre es dann Betrug solche chips über ebay zu 
verkaufen. Wenn es wirklich Betrug ist - das möchte ich dann jedoch 
etwas sicherer wissen - habe ich kein Problem damit dem Händler über 
meine Wertung und ggf. auch über ebay und Paypal Druck zu machen.

> Und Datenblätter sind in
> China Marketingmaterial und eher weniger die Zusicherung technischer
> Eigenschaften.

alles frei erfunden sollte es ja wohl nicht sein.

Diese Platinen mit den TM7705 werden nicht gerade selten angeboten. Die 
Preise variieren dabei stark. 3.6€, 6.24€, 4.38€. Auch 5-Stückweise kann 
man bestellen um die 20€. Manche der Händler haben 99.9% positive 
Wertung. Da kann ich mir kaum vorstellen daß diese chips alle nur 
einfach Schrott sind.

> Alles schon erlebt, selbst mit so primitiven Sachen wie einem TL431.
> TI-Chip funktioniert, China-Chip funktioniert nicht.

das mag in Einzelfällen so sein. Bin ich denn hier der Einzige der eine 
solche Platine erworben hat? Gibts denn sonst keinerlei Erfahrung damit?

von Frank K. (fchk)


Lesenswert?

Matthias W. schrieb:

> Diese Platinen mit den TM7705 werden nicht gerade selten angeboten. Die
> Preise variieren dabei stark. 3.6€, 6.24€, 4.38€. Auch 5-Stückweise kann
> man bestellen um die 20€. Manche der Händler haben 99.9% positive
> Wertung. Da kann ich mir kaum vorstellen daß diese chips alle nur
> einfach Schrott sind.

Es reicht ja, wenn Dein Exemplar Schrott ist. Endkontrollen machen die 
Chinesen nicht, wenn man sie nicht extra dafür bezahlt. Ich arbeite für 
Chinesen, ich weiß das.

Du denkst zu viel. Sieh lieber zu, alle möglichen Fehlerursachen 
systematisch auszuschließen. Dazu gehört die strikte Befolgung der 
relevanten Datenblätter und das Infragestellen der Hardware. Wenn Du Dir 
absolut sicher bist, dass Du den Chip gemäß Datenblatt ansteuerst und 
das auch durch eigene Messungen nachgewiesen hast - dazu gehören auch 
alle(!) Versorgungs- und Hilfsspannungen und der Quarz (das ist immerhin 
ein mechanisches Bauteil, das kaputt gehen kann, wenn es runterfällt), 
dann bleibt eben nur noch der Chip selber über.

Ich hatte auch schon defekte Kondensatoren, die beim Pick&Place 
Mikrorisse bekommen haben. Sowas findest Du nur durch systematisches 
Durchmessen mit geeigneten Messmitteln.

fchk

von Matthias W. (matt007)


Lesenswert?

Frank K. schrieb:
>> Natürlich kann ich auch mal fest 5V anlegen und schauen was passiert.
> Klar, wo ist das Problem?

das hat leider nichts gebracht. Die Platine spinnt weiter.

von Matthias W. (matt007)


Lesenswert?

Frank K. schrieb:
> wenn Dein Exemplar Schrott ist.

ich habe ja 2 Exemplare - von 2 unterschiedlichen Händlern. Beide 
Schrott?

Das klingt eher unwahrscheinlich.

von Matthias W. (matt007)


Lesenswert?

Frank K. schrieb:
> alle möglichen Fehlerursachen systematisch auszuschließen.

Daran arbeite ich ja.

Fakt ist:
+ 2 Platinen gehen nicht brauchbar.
+ der 4.9MHz Quarz arbeitet bei beiden korrekt. Die Frequenz ist da.
+ die Referenzspannung von 2.5V ist auch da.
+ das CS-Signal kommt korrekt an.
+ das CLK-Signal kommt mit 250kHz an.

> Dazu gehört die strikte Befolgung der relevanten Datenblätter

mein obiges Beispiel orientiert sich streng am Beispiel im Datenblatt. 
Im China-Datenblatt ist das Beispiel genauso - sogar mit derselben 
Seitennummer.

> und das Infragestellen der Hardware.

ich habe 2x dieselbe Hardware. Geht beide Male so nicht. Beide Male ist 
der Quarz ok und die Referenz auch. Beide Platinen lieferten mal den 
Wert 26 bei kurzgeschlossenem Eingang.

> Wenn Du Dir
> absolut sicher bist, dass Du den Chip gemäß Datenblatt ansteuerst und
> das auch durch eigene Messungen nachgewiesen hast - dazu gehören auch
> alle(!) Versorgungs- und Hilfsspannungen und der Quarz (das ist immerhin
> ein mechanisches Bauteil, das kaputt gehen kann, wenn es runterfällt),
> dann bleibt eben nur noch der Chip selber über.

oder ein Problem in der Ansteuerung.

Ich habe noch eine weitere Implementierung eines Treibers gefunden und 
angepasst. Auch dieser schlug anfangs fehl. Beide Treiber arbeiten mit 
SPI. Die SPI wird unmittelbar vor dem Senden aktiv geschaltet und dann 
wieder deaktiv.

Da Mode 3 verwendet wird polt sich der Clock um. Bei der Einchaltung von 
SPI und beim Abschalten springt daher der Pegel um.

Um dies zu vermeiden habe ich in der Init nun den CLK-Ausgang high 
gesetzt. Und siehe da - so gelang die Initialisierung und das Auslesen 
von Daten. Bei der einen Platine kamen viele Datenworte, bei der anderen 
Platine nur ein paar wenige bevor es hängte. Stabil ist das also nicht.

Gelesen wurde 26 und selten 27. Dies bei beiden Platinen. So als ob da 
ein gleicher Offset wäre.

Wenn ich den Finger an den Eingang halte der über 10kOhm nach Masse 
abgeleitet wird steigen die Werte und das Teil stürzt nach ein paar 
Messwerten einfach ab. Keine Ahnung woran das liegt.

Das Teil macht bisher wenig Freude. Hat denn keiner so ein Teil und will 
seine Erfahrungen damit teilen?

von fchk (Gast)


Lesenswert?

ok, dann tausche halt mal den Chip gegen ein Original.

fchk

von Matthias W. (matt007)


Lesenswert?

fchk schrieb:
> ok, dann tausche halt mal den Chip gegen ein Original.

scheint nicht so einfach. Auf der Platine ist ein SO-16 footprint. Die 
chips von AD sind SO-16 wide.
http://www.analog.com/en/products/analog-to-digital-converters/ad-converters/ad7705.html

Zudem kostet das Teil bei Elpro um die 17.-.

: Bearbeitet durch User
von Matthias W. (matt007)


Lesenswert?

von den Massen her ist das SO-16 wide nicht einbaubar. Es wäre denkbar 
eine Seite unten anzulöten und das Bauteil dabei hochzustellen. Die 
anderen Pins könnte man dann manuell verbinden. Das klingt nach ziemlich 
Aufwand, selbst wenn man das chip von Analog Devices hat.

von Matthias W. (matt007)


Lesenswert?

es gibt von Maxim einen Max1415/1416. Nur ist der leider auch nur im 16 
Wide SO und nicht im normalen SO-16 verfügbar.

Der Max1415 ist dabei für 3V und der Max1416 für 5V vorgesehen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.