SCP1000 Drucksensor Problem - Gibt bei höherem Luftdruck einen niedrigeren Wert aus

Gast #1849090
Lesenswert?
• ▲
▼
Hallo!

Ich nutze an einem Arduino Duemilanove den SCP 1000. Angeschlossen ist 
er über 2 Pegelwandler an die SPI Ports (Pin 10-13). DRDY ist nicht 
angeschlossen.

Mit diesem Code habe ich das Problem, dass bei höherem Druck ein 
niedriegerer Wert angezeigt wird.

Wisst ihr woran das liegen kann?

Btw: Sind meine Komentare richtig? Habe mich das erste mal mit SPI 
beschäftigt.

SCP1000:

http://www.sparkfun.com/datasheets/Components/SCP1000-D01.pdf
1
//Pins definieren, werden durchgängig mit diesen Namen benutzt
2
#define SLAVESELECT 10
3
#define SPICLOCK 13
4
#define DATAOUT 11  //MOSI
5
#define DATAIN 12   //MISO
6
#define UBLB(a,b)  ( ( (a) << 8) | (b) )
7
#define UBLB19(a,b) ( ( (a) << 16 ) | (b) )
8

9
//Register Adressen
10
#define REVID 0x00  //ASIC Revision Nummer
11
#define OPSTATUS 0x04   //Operation Status
12
#define STATUS 0x07     //ASIC Status
13
#define START 0x0A      //Konstante Leserate
14
#define PRESSURE 0x1F   //Druck 3 MSB
15
#define PRESSURE_LSB 0x20 //Druck 16 LSB
16
#define TEMP 0x21       //16 bit Temperaut
17

18
char rev_in_byte;      
19
int temp_in;
20
unsigned long pressure_lsb;
21
unsigned long pressure_msb;
22
unsigned long temp_pressure;
23
unsigned long pressure;
24

25
void setup()
26
{
27
  byte clr;
28
  pinMode(DATAOUT, OUTPUT);
29
  pinMode(DATAIN, INPUT);
30
  pinMode(SPICLOCK,OUTPUT);
31
  pinMode(SLAVESELECT,OUTPUT);
32
  digitalWrite(SLAVESELECT,HIGH); //Sensor ausschalten und neue Konfiguration übernehmen
33
  
34
  SPCR = B01010011; //MPIE=0, SPE=1 (on), DORD=0 (MSB first), MSTR=1 (master), CPOL=0 (clock idle when low), CPHA=0 (samples MOSI on rising edge), SPR1=0 & SPR0=0 (500kHz)
35
  clr=SPSR;
36
  clr=SPDR;
37
  delay(10);
38
  Serial.begin(9600);
39
  delay(500);
40

41
  Serial.println("Initialisiere hohe Leserate");
42
  write_register(0x03,0x09);
43
}
44

45
void loop()
46
{
47
  
48
  rev_in_byte = read_register(REVID);
49
  
50
  pressure_msb = read_register(PRESSURE);
51
  pressure_msb &= B00000111;
52
  pressure_lsb = read_register16(PRESSURE_LSB);
53
  pressure_lsb &= 0x0000FFFF;
54
  pressure = UBLB19(pressure_msb, pressure_lsb);
55
  pressure /= 4;
56
  
57
  Serial.print("Druck in Pascal [");
58
  Serial.print(pressure, DEC);  
59
  Serial.print(" P");
60
  Serial.print("");
61
  Serial.println("]");
62
  
63
  Serial.print("Druck in Hekto-Pascal [");
64
  Serial.print(pressure/100, DEC);
65
  Serial.print(" hPa");
66
  Serial.print("");
67
  Serial.println("]");
68
  
69
  temp_in = read_register16(TEMP);
70
  temp_in = temp_in / 20;
71
  Serial.print("Temperatur in Grad Celcius [");     //Direkte Ausgabe
72
  Serial.print(temp_in , DEC);
73
  Serial.println("]");
74
  
75
  Serial.println("");
76
  delay(1500);
77
  
78
}
79

80
char spi_transfer(volatile char data)
81
{
82
  SPDR = data;        // SPDR auf Datenübergabe vorbereiten
83
  while (!(SPSR & (1<<SPIF)))     // Solange warten bis alle Bytes übertrage wurden
84
  {
85
  };
86
  return SPDR;        // return the received byte
87
}
88

89

90
char read_register(char register_name)
91
{
92
    char in_byte;
93
    register_name <<= 2;
94
    register_name &= B11111100; //Register lesen
95
  
96
    digitalWrite(SLAVESELECT,LOW); //SPI auswählen
97
    spi_transfer(register_name); //Datenbyte "in" SPI schreiben
98
    in_byte = spi_transfer(0x00); //Nichts senden. Gibt Register-Variable aus
99
    digitalWrite(SLAVESELECT,HIGH);
100
    delay(10);
101
    return(in_byte);
102
  
103
}
104

105
float read_register16(char register_name)
106
{
107
    byte in_byte1;
108
    byte in_byte2;
109
    float in_word;
110
    
111
    register_name <<= 2;
112
    register_name &= B11111100; //Register lesen
113

114
    digitalWrite(SLAVESELECT,LOW); //SPI auswählen
115
    spi_transfer(register_name); //Datenbyte "in" SPI schreiben
116
    in_byte1 = spi_transfer(0x00);    
117
    in_byte2 = spi_transfer(0x00);
118
    digitalWrite(SLAVESELECT,HIGH);
119
    in_word = UBLB(in_byte1,in_byte2);
120
    return(in_word);
121
}
122

123
void write_register(char register_name, char register_value)
124
{
125
    register_name <<= 2;
126
    register_name |= B00000010; //Register lsen
127

128
    digitalWrite(SLAVESELECT,LOW); //Datenbyte "in" SPI schreiben
129
    spi_transfer(register_name); //Send register location
130
    spi_transfer(register_value); //Send value to record into register
131
    digitalWrite(SLAVESELECT,HIGH);
132
}
Gast #1849200
Lesenswert?
• ▲
▼
Hi

Arbeite ich auch grad mit.
So umgerechnet funktionierts.
1
  press   = 8BitPressureData;
2
  press <<= 8;
3
  press  |= 16BitPressureData;
4
  press <<= 8;
5
  press  |= 16BitPressureData;
6
  press  += 2;
7
  press >>= 2; //dividing / 4

Liefer PA z.B. 100.000
senkt man den Sensor ab, steigt der Luftdruck,
hebt man ihn hoch, sinkt der Luftdruck folglich.

Vg
Klaus

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.