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
  Float array über NRF24L01 senden und empfangen Flo3107 6 478 04.09.2019 21:55
Letzter Beitrag: Tommy56
  Fern-Programmierung über Ethernet passra 14 1.218 09.04.2019 20:01
Letzter Beitrag: amithlon
  Blynk app über eduroam laufen lassen? WLAN Hanno 6 602 06.04.2019 22:03
Letzter Beitrag: Hilgi
  Steuerung Lüftungsanlage über Temperatursensoren roller64 7 822 06.04.2019 10:26
Letzter Beitrag: rkuehle
  Zeit vom Nextion Enhanced mit Arduino auslesen MarkoM 47 5.540 06.03.2019 18:08
Letzter Beitrag: Tommy56
  Keypad auslesen Dieter_T 10 1.406 11.02.2019 20:46
Letzter Beitrag: Dieter_T
  Variablen über Eingabe im Setup beschreiben heini320 3 679 30.12.2018 11:37
Letzter Beitrag: Tommy56
  mcp2515 CAN BUS nur eine ID auslesen Golf_Cabrio 6 1.660 24.10.2018 20:51
Letzter Beitrag: Golf_Cabrio
  PHP WINDOWS XAMPP ARDUINO UNO SERVO steuern über Serielle Verbindung tr3 1 814 21.08.2018 21:59
Letzter Beitrag: georg01
  Sensor mit 10 Hz auslesen Olafson Larson 7 1.510 05.07.2018 15:59
Letzter Beitrag: Tommy56

Gehe zu:


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