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
2 Pt1000 über externen AD wandler auslesen
10.11.2018, 11:43
Beitrag #1
2 Pt1000 über externen AD wandler auslesen
Ich möchte zwei Pt 1000 über einen MCP3302 (Datendblatt) messen und über den Arduino Uno ausgeben. Wie mein Benutzername vermuten lässt bin ich ein totaler Noob. Ich habe bereits ein Programm ergoogelt das für einen MCP3304 geschrieben wurde und gehofft ich könnte es adaptieren. Ich verstehe nun leider den Code nicht und habe gehofft mir könnte jmd helfen.

Erstmal die Schaltung: von GND gehts über einen 1,5kOhm Widerstand, als Spannungsteiler, zum Pt1000 und davon zu 5 Volt(korrigiert mich pls falls da was falsch ist). Zwischen Widertstand und Sensor geht noch eine Leitung auf Channel 0 des MCP3302( parallel vom zweiten Sensor auf Ch1).

Den AD Wandler hab ich wie folgt angeschlossen(einer Schaltung vom Rasberrypi aus google nachgemacht): DGND und AGND auf GND vom Uno, Vdd und Vref auf 5V vom Uno, und wenn ich das folgende Programm richtig verstanden habe CLK auf 13 vom Uno, Dout auf12, Din auf 11, und CS auf 10.

Nun zum Programm, gefunden auf der Arduino Playground Seite. In dem Artikel sind 2 Programme das untere ist für den MCP3304 geschrieben.
Code:
// read the MCP3304 in quad differential mode, non-bit-banging version
//#include <Serial.h>
#include <SPI.h>

#include <HardwareSerial.h>

long ticks = 0;

// for Uno
#define SELPIN 10 // chip-select
#define DATAOUT 11 // MOSI
#define DATAIN 12 // MISO
#define SPICLOCK 13 // Clock



int readvalue;


void setup(){
//set pin modes
pinMode(SELPIN, OUTPUT);

// disable device to start with
digitalWrite(SELPIN, HIGH);

SPI.setClockDivider( SPI_CLOCK_DIV8 ); // slow the SPI bus down
SPI.setBitOrder(MSBFIRST);
SPI.setDataMode(SPI_MODE0); // SPI 0,0 as per MCP330x data sheet
SPI.begin();

Serial.begin(115200);
}


void loop() { // Wozu dient das?
long ticks = millis();
int A = 0, B = 0;

A = read_adc(1);
B = read_adc(2);

// do whatever you want with these readings // sind das meine Werte, warum 2?

long tcnv = millis() - ticks;

delay(100 - tcnv);
}

// non-bit-banging version
// channel ranges from 1.. 3 (not zero!)
// maximum clock frequency is 2.1 MHz @ 5V
//
// this is SPI_CLOCK_DIV8 //wozu dient dieser Absatz und warum als kommentar?
// at DIV64, 512 in 60ms (8.5 ksps)
// at DIV32, 512 in 35ms (14.6 ksps)
// at DIV16, 512 in 22ms (23.3 ksps)
// at DIV8, 512 in 16ms (32 ksps)

int read_adc(int channel){
int adcvalue = 0; // mein Verständnis_adc wert auf null setzen(ok), wozu dienen aber b1, b2 und sign
int b1 = 0, b2 = 0;
int sign = 0;

// command bits for MCP3304 //was sind command bits, warum hier als Kommentar?
// 0000 = diff, ch0 = in+, ch1 = in-
// 0010 = diff, ch2 = in+, ch3 = in-
// 0100 = diff, ch4 = in+, ch5 = in-

digitalWrite (SELPIN, LOW); // Select adc

// first byte
// first byte will always be B000010xx where xx are the D2 and D1 channel bits // verstehe ich nicht
byte commandbits = B00001000;
commandbits |= (channel >> 1); // high bit of channel

SPI.transfer(commandbits); // send out first byte of command bits

// second byte; Bx0000000; leftmost bit is D0 channel bit
commandbits = B00000000;
commandbits |= (channel << 7); // if D0 is set it will be the leftmost bit now //muss ich diesen Wert anpassen, da mein MCP 2 channels weniger hat?
b1 = SPI.transfer(commandbits); // send out second byte of command bits

// hi byte will have XX0SBBBB
// set the top 3 don't care bits so it will format nicely
b1 |= B11100000;
//Serial.print(b1, BIN); Serial.print(" ");
sign = b1 & B00010000;
int hi = b1 & B00001111;

// read low byte
b2 = SPI.transfer(b2); // don't care what we send
//Serial.print(b2, BIN); Serial.print("\r\n");
int lo = b2;
digitalWrite(SELPIN, HIGH); // turn off device

int reading = hi * 256 + lo; // wozu diese Rechnung

if (sign) {
reading = (4096 - reading) * -1;
}


return (reading);
}

Ich habe alles mal rot markiert, was ich nicht Verstehe bzw Kommentare in rot geschrieben. Ich verstehe auch nicht wirklich welchen Unterschied es macht, dass der AD Wandler differentiell ist.

Jedenfalls wenn ich dieses Programm laufen lasse und über den IDE Monitor ausgeben lasse, bekomme ich komische werte. Mir ist klar das ich dieses Programm noch abändern/anpassen muss aber es übersteigt meine Fähigkeiten. Help pls sitze schon seit 2 Tagen dran.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.11.2018, 13:24 (Dieser Beitrag wurde zuletzt bearbeitet: 10.11.2018 13:25 von hotsystems.)
Beitrag #2
RE: 2 Pt1000 über externen AD wandler auslesen
Leider ist dein kopierter Sketch schwer zu lesen.
Poste den bitte in Code-Tags, damit wird dieser für alle besser lesbar, auch für die mobilisten unter uns. Zuvor die unnötigen Zeilen entfernen und per Strg+T in der IDE formatieren. Das macht den Sketch deutlicher lesbar.

Als nächstes bitte eine Schaltung posten, die ist besser verständlich als deine Beschreibung.

Und warum willst du es mit dem PT1000 machen ?

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.11.2018, 14:41 (Dieser Beitrag wurde zuletzt bearbeitet: 10.11.2018 15:28 von Noob63.)
Beitrag #3
RE: 2 Pt1000 über externen AD wandler auslesen
Super Danke, der Schaltplan im Anhang    
und der Sketch, allerdings passierte nichts wenn ich Strg+T drückte (außer das mein Browser einen neuen Tab öffnet) gibts keine zusätzlichen Tags dafür?

Code:
#include <SPI.h>
#include <HardwareSerial.h>

long ticks = 0;

// for Uno
#define SELPIN 10 // chip-select
#define DATAOUT 11 // MOSI
#define DATAIN 12 // MISO
#define SPICLOCK 13 // Clock

int readvalue;

void setup() {
  //set pin modes
  pinMode(SELPIN, OUTPUT);

  // disable device to start with
  digitalWrite(SELPIN, HIGH);

  SPI.setClockDivider( SPI_CLOCK_DIV8 ); // slow the SPI bus down
  SPI.setBitOrder(MSBFIRST);
  SPI.setDataMode(SPI_MODE0); // SPI 0,0 as per MCP330x data sheet
  SPI.begin();

  Serial.begin(115200);
}
void loop() { // Wozu dient diese schleife?
  long ticks = millis();
  int A = 0, B = 0;

  A = read_adc(1);
  B = read_adc(2); // do whatever you want with these readings
  // sind das meine Werte, warum 2 verschiedene?
  long tcnv = millis() - ticks;

  delay(100 - tcnv);
}
// non-bit-banging version
// channel ranges from 1.. 3 (not zero!)
// maximum clock frequency is 2.1 MHz @ 5V
//
// this is SPI_CLOCK_DIV8   //wozu dient dieser Absatz und warum als Kommentar?
// at DIV64, 512 in 60ms (8.5 ksps)
// at DIV32, 512 in 35ms (14.6 ksps)
// at DIV16, 512 in 22ms (23.3 ksps)
// at DIV8, 512 in 16ms (32 ksps)

int read_adc(int channel) {
  int adcvalue = 0; // mein Verständnis_adc wert auf null setzen(ok), wozu dienen aber b1, b2 und sign
  int b1 = 0, b2 = 0;
  int sign = 0;

  // command bits for MCP3304 //was sind command bits, warum hier als Kommentar?
  // 0000 = diff, ch0 = in+, ch1 = in-
  // 0010 = diff, ch2 = in+, ch3 = in-
  // 0100 = diff, ch4 = in+, ch5 = in-

  digitalWrite (SELPIN, LOW); // Select adc

  // first byte
  // first byte will always be B000010xx where xx are the D2 and D1 channel bits // verstehe ich nicht
  byte commandbits = B00001000;
  commandbits |= (channel >> 1); // high bit of channel

  SPI.transfer(commandbits); // send out first byte of command bits

  // second byte; Bx0000000; leftmost bit is D0 channel bit
  commandbits = B00000000;
  commandbits |= (channel << 7);      // if D0 is set it will be the leftmost bit now //muss ich "channel<<7" anpassen, da mein MCP 2 channels weniger hat?
  b1 = SPI.transfer(commandbits);    // send out second byte of command bits

  // hi byte will have XX0SBBBB
  // set the top 3 don't care bits so it will format nicely
  b1 |= B11100000;
  //Serial.print(b1, BIN); Serial.print(" ");
  sign = b1 & B00010000;
  int hi = b1 & B00001111;

  // read low byte
  b2 = SPI.transfer(b2); // don't care what we send
  //Serial.print(b2, BIN); Serial.print("\r\n");
  int lo = b2;
  digitalWrite(SELPIN, HIGH); // turn off device

  int reading = hi * 256 + lo; // wozu diese Rechnung

  if (sign) {
    reading = (4096 - reading) * -1;
  }

  return (reading);
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.11.2018, 14:49
Beitrag #4
RE: 2 Pt1000 über externen AD wandler auslesen
(10.11.2018 13:24)hotsystems schrieb:  per Strg+T in der IDE formatieren

per Strg+T in der Arduino IDE formatieren

Gruß Fips

Meine Esp8266 & ESP32 Projekte
Webseite des Benutzers besuchen Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.11.2018, 15:00
Beitrag #5
RE: 2 Pt1000 über externen AD wandler auslesen
Zitat: allerdings passierte nichts wenn ich Strg+T drückte (außer, dass mein Browser einen neuen Tab öffnet) gibts keine zusätzlichen Tags dafür?

ging nicht Sad gibts dazu tags? oder reichts wenn ich [php] benutze?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.11.2018, 15:04
Beitrag #6
RE: 2 Pt1000 über externen AD wandler auslesen
(10.11.2018 14:49)Fips schrieb:  
(10.11.2018 13:24)hotsystems schrieb:  per Strg+T in der IDE formatieren

per Strg+T in der Arduino IDE formatieren

Gruß Fips
Ok, das ist deutlicher.
Ich bin einfach davon ausgegangen, wird den Arduino programmiert, weiß was IDE heißt.

Frage an NOB63
Wozu hast du die Library "HardwareSerial.h" eingebunden ?

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
10.11.2018, 15:14 (Dieser Beitrag wurde zuletzt bearbeitet: 10.11.2018 15:32 von Noob63.)
Beitrag #7
RE: 2 Pt1000 über externen AD wandler auslesen
(10.11.2018 15:04)hotsystems schrieb:  
(10.11.2018 14:49)Fips schrieb:  
(10.11.2018 13:24)hotsystems schrieb:  per Strg+T in der IDE formatieren

per Strg+T in der Arduino IDE formatieren

Gruß Fips
Ok, das ist deutlicher.
Ich bin einfach davon ausgegangen, wird den Arduino programmiert, weiß was IDE heißt.

Frage an NOB63
Wozu hast du die Library "HardwareSerial.h" eingebunden ?
Ich habe diesen Code so übernommen wie ich ihn gefunden habe. Deshalb dachte ich auch das man den braucht Confused

ohman stand ich grade aufm schlauch. also ich hab es oben nochmal editiert und vorher in der IDE formatiert Big Grin sry dafür, die Schaltung soweit verständlich?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.11.2018, 02:18
Beitrag #8
RE: 2 Pt1000 über externen AD wandler auslesen
(10.11.2018 15:14)Noob63 schrieb:  .....
die Schaltung soweit verständlich?

Die Schaltung verstehe ich wohl, aber wenn du die PT1000 mit den 1,5K Widerständen vertauschst hast auch einen ansteigenden ADC Wert wenn sich die Temperatur erhöht. So wie du es gezeichnet hast sind die Werte gegenläufig.

Auch könnte man sich überlegen Vref mit den 3,3V vom Arduino zu verbinden anstatt den 5V weil wenn der Ardi über USB Versorgt wird dann schwankt die Spannung ein bischen was auch die ADC Werte beeinflusst sofern du außer den 2 PT1000 auch noch andere Spannungen messen willst.
Also in dem Fall mit den 3,3V muß dann auch die Speisung der PTC's auch an die 3,3V gelegt werden.
lgbk

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
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Steuerung über Infrarot und Bluetooth SimonTau 4 316 20.05.2020 07:37
Letzter Beitrag: Corvus
  Lauftext mit WS2812, der über Seriellen Monitor eingegeben wird Bastian 3 250 12.05.2020 16:47
Letzter Beitrag: Tommy56
  Fehler bei delay über 32767 Kleingärtner 5 291 07.05.2020 18:51
Letzter Beitrag: Kleingärtner
  Aktion bei Wert über- oder unterschreiten Kleingärtner 18 677 05.05.2020 20:19
Letzter Beitrag: hotsystems
  Betätigung d. Sensors soll Steuerung abschalten und nur über Taster einschalten Floydi 12 598 26.04.2020 07:47
Letzter Beitrag: MicroBahner
  Motordaten von Zusatzsensoren per Arduino auslesen PingPong92 14 2.769 19.04.2020 09:28
Letzter Beitrag: Tommy56
  Waage über RS 232 / Serial auswerten 425t 9 609 31.03.2020 06:44
Letzter Beitrag: 425t
  Probleme mit externen Librarys in Klasse reichs 3 336 30.03.2020 22:12
Letzter Beitrag: Tommy56
  Temperatursensor DS18B20 direkt auslesen Igom 9 584 26.03.2020 19:21
Letzter Beitrag: hotsystems
  Vorlage für Char Array über Serielle Schnittstelle Luis90 2 385 08.03.2020 18:05
Letzter Beitrag: hotsystems

Gehe zu:


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