Forum: Mikrocontroller und Digitale Elektronik SCP1000 Drucksensor Problem - Gibt bei höherem Luftdruck einen niedrigeren Wert aus


von Benutzer (Gast)


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
}

von Klaus (Gast)


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

von Benutzer (Gast)


Lesenswert?

Super!

Kannst du mir mal deinen kompletten Code posten? Würde ganz gerne beide 
vergleichen und auf meinen Fehler kommen ;)

MFG

von Benutzer (Gast)


Lesenswert?

Könntest du mir auch noch knapp erklären wie dein Code funktioniert? 
Find ich ja echt ulkig wieso meine Skale verkehrt herum ist....

MFG

von xmega (Gast)


Angehängte Dateien:

Lesenswert?

Servus,

Benutzer schrieb:
> Wisst ihr woran das liegen kann?

ich habe dir mal einen funktionierenden Code als Anlage beigelegt.


Gruß XMEGA

von Benutzer (Gast)


Lesenswert?

Woah Respekt! Bei mir hat er aber beim Kompilieren irgendwo einen 
Fehler, aber das guck ich mir heute Abend an.

Hast du noch irgend welche Libraries benutzt die nicht Standart sind?

MFG

von xmega (Gast)


Lesenswert?

Hallo,


Benutzer schrieb:
> Hast du noch irgendwelche Libraries benutzt die nicht Standard sind?

ich habe den Code auch nur zur Vervollständigung meines Codes 
hergenommen.
Ich arbeite aber mit XMEGAS.

Gruß XMEGA

von Benutzer (Gast)


Lesenswert?

Hmm daran könnte es bei mir liegen. Ich habe ja den Arduino (atmega 
328). Mal gucken ob ich einen vernünftigen Code zu stande bekomme

MFG

von Benutzer (Gast)


Lesenswert?

Ich hab grad was gefunden:

[LINK]
http://sites.google.com/site/measuringstuff/code-examples#TOC-SCP1000-Pressure-Temperature-Sensor
[/LINK]

Ist ein Arduino Mega Code, aber wenn man die Pins auf 10-13 ändert kann 
man den auch mit dem Arduino benutzen. Funktioniert einwandfrei!

MFG

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.