INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
ADC über SPI auslesen
18.06.2015, 16:35
Beitrag #1
ADC über SPI auslesen
Servus,

ich möchte mit einem Arduino (Mega2560) mehrere ADCs über SPI auslesen, primär geht es jetzt erstmal darum einen zum laufen zu bekommen. Mit SPI habe ich bisher noch nichts gemacht und hoffe hier ein paar Tipps zu bekommen, falls ich etwas falsch mache.

Es handelt sich dabei um folgenden Chip: LTC 1867
hier gibts das Datenblatt dazu: http://cds.linear.com/docs/en/datasheet/18637fc.pdf

Von Linear Technology gibt es auch noch eine Library, die ich aber leider nicht ganz verstehe. Ich wollte die einfache Kommunikation auch erstmal so herstellen.

Ich verwende hier 8 einzelne Eingänge - 8 single ended unipolar.

hier mal mein bisheriger Code:

Code:
#include <SPI.h>

// Variablen für CS# Pins
const int cs1=5;                               // Adresspin fuer IC33 / Wandler #1



// Variablennamen für ADC-Werte IC33
byte adcIC330U = 0;                            // Variable für IC33 CH0 uppervalue
byte adcIC330L = 0;                            // Variable für IC33 CH0 lowervalue

void setup(){                                  
  pinMode(cs1, OUTPUT);                        // Adresspin als OUTPUT setzen
  digitalWrite(cs1, HIGH);                     // Adresspin auf HIGH setzen, keine Kommunikation

  
  SPI.begin();                                 // Starten der SPI Kommunikation
  SPI.setDataMode(SPI_MODE0);                  // SPI Uebertragungsmodus
  SPI.setClockDivider(SPI_CLOCK_DIV16);        // SPI clockdivider16 -> 1MHz
  SPI.setBitOrder(MSBFIRST);                   // SPI MSB oder LSB festlegen
  Serial.begin(9600);                          // Serielle Schnittstelle starten
}
  
void loop()
{

// Abfragen des ersten ADCs - IC33 - CH0
// abspeichern der beiden Antwortbytes
// und serielle Ausgabe

      digitalWrite(cs1,LOW);                    // cs1 auf LOW um die Kommunikation mit IC33 zu starten
      delayMicroseconds(10);                  
      SPI.transfer(0x80);                       // Adresse von CH0 und GND - Kanal 0 ADC HEX: 0x80 BIN: 1000 0000 DEZ: 128
      delayMicroseconds(10);
      adcIC330U = SPI.transfer(0);              // Empfangen des ersten Antwortbytes vom ADC, abspeichern in Variable1
      adcIC330L = SPI.transfer(0);              // Empfangen des zweiten Antwortbytes vom ADC, abspeichern in Variable2
      digitalWrite(cs1,HIGH);                   // CS1 auf HIGH setzen, um die Kommunikation mit ADC zu beenden
      
      
// Serielle Ausgabe der Messwerte CH0
      Serial.print("adcIC330U=");
      Serial.println(adcIC330U,BIN);
      Serial.print('\n');
      Serial.print("adcIC330L=");
      Serial.println(adcIC330L,BIN);
      Serial.print('\n');
      
      delay(100);

Jetzt zu meinem Problem, der ADC ist ja ein 16Bit Wandler, also sollte mein Ergebnis auch 16Bits lang sein.
Ich bekomme jedoch nur beim ersten Anwortbyte ein 8Bit Ergebnis ausgegeben.Das zweite Antwortbyte bleibt immer 0, egal, wie groß der Eingang am ADC ist.
Daher habe ich die Kanäle mal mit einem Datenlogger - Salea Logic angeschaut. Dabei ist mir aufgefallen, dass auch nur 1 Byte gesendet wird und nicht 2, MISO bleibt low.

Jetzt stellt sich mir die Frage, wo ich einen Fehler mache? Ich hoffe es ist ein einfacher Anfängerfehler in der Programmierung. Wink Ich würde mich freuen, wenn mir hier jemand helfen kann. Ich hoffe ich habe alle nötigen Infos angegeben.

Grüße
whoopi
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.06.2015, 21:35
Beitrag #2
RE: ADC über SPI auslesen
Hi Woopi - Goldberg ?...Smile
also ich habe mal das Datenblatt und deinen Sketch quergelesen....
folgendes ist mir aufgefallen:

Zwischen dem ausgeben des Configuration Bytes und dem abholen der Daten nimmst du den CS nicht weg....den braucht der ADC aber um ein Start Conversion zu starten.

Code:
digitalWrite(cs1,LOW);                    // cs1 auf LOW um die Kommunikation mit IC33 zu starten
      delayMicroseconds(10);                  
//  SPI.transfer(0x80);       // ggf. hier noch ein Fuellbyte senden...auch mal den Platz tauschen
     SPI.transfer(0x80);                       // Adresse von CH0 und GND - Kanal 0 ADC HEX: 0x80 BIN: 1000 0000 DEZ: 128
     digitalWrite(cs1,HIGH);                   //  Start Conversion

      delayMicroseconds(10); // Zeit fuer Conversion nehme ich mal an..

      digitalWrite(cs1,LOW);                    // cs1 auf LOW um die Kommunikation mit IC33 zu starten

      adcIC330U = SPI.transfer(0);              // Empfangen des ersten Antwortbytes vom ADC, abspeichern in Variable1
      adcIC330L = SPI.transfer(0);              // Empfangen des zweiten Antwortbytes vom ADC, abspeichern in Variable2
      digitalWrite(cs1,HIGH);                   // CS1 auf HIGH setzen, um die Kommunikation mit ADC zu beenden

Damit könnte nun auch das Zweite Byte rauskommen, aber dein Configuration Byte müßtest noch genauers ansehen... ob du Bipolar oder Unipolare Eingangsspannungen hast. Was das OS Bit macht weis ich gerade auch nicht...ob das ein Vorzeichenbit ist...kenne ich so nicht. Auch das mit dem CH7 solltest mal im Datenblatt nachlesen.
Was mich auch noch nicht wirklich befriedigt ist das ich kein EOC = End of Conversion Bit/Signal wo sehen kann. Wahrscheinlich macht der ADC das nur über die Zeit....da mußte mal drauf achten.
lg
bk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.06.2015, 08:27
Beitrag #3
RE: ADC über SPI auslesen
Hey Bitklopfer,

vielen Dank für deine schnelle Antwort, hatte bisher noch keine Zeit darauf zu schauen. Aber das mit dem Start Conversion werde ich mal ausprobieren.

Die anderen Bits (OS, Configuration, COM usw.) sind für den "8 single ended" Modus im Datenblatt eigentlich so vorgegeben.

siehe Bild:
   

oder nicht?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.06.2015, 08:28
Beitrag #4
Smile RE: ADC über SPI auslesen
Also ich habs ausprobiert und es funktioniert wunderbar!!! Vielen Dank BitklopferBlush
Das Bit für Unipolar/bipolar hab ich auch angepasst.Idea
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  RGB Animation über Serial Steuern Medolino 5 293 20.02.2017 16:14
Letzter Beitrag: Medolino
  Arduino-UNO LED über Taster digital zum leuchten zu bringen IvKriz 9 483 18.02.2017 08:33
Letzter Beitrag: renid55
  Servo-Ansteuerung über einen Push-Button Aubergine83 1 263 16.02.2017 19:49
Letzter Beitrag: georg01
  LED langsam über 15 Minuten dimmen Kriskind 14 697 09.02.2017 13:26
Letzter Beitrag: Kriskind
  Arduino Serielle Schnittstelle auslesen mit Visual Basic Obermuda 1 396 29.01.2017 17:02
Letzter Beitrag: hotsystems
  Display über I2-Bus betreiben mfri 22 1.024 23.01.2017 11:06
Letzter Beitrag: renid55
  Messdatenausgabe auf Webserver über NanoESP RivaDynamite 10 810 10.01.2017 15:49
Letzter Beitrag: renid55
  Über drei Taster zwei externe Timer steuern Sidamo 23 839 09.01.2017 20:12
Letzter Beitrag: Tommy56
  LED Dimmen über Bewegungsmelder Jens040774 8 426 05.01.2017 19:07
Letzter Beitrag: renid55
  Variable über EEPROM in ein Script einbinden... Badger1875 5 701 01.01.2017 15:08
Letzter Beitrag: Tommy56

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste