SPI应用 用SPI总线读取气压传感器SCP1000的数据
Posted myautomation
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SPI应用 用SPI总线读取气压传感器SCP1000的数据相关的知识,希望对你有一定的参考价值。
Using SPI to read a Barometric Pressure Sensor
This example shows how to use the SPI (Serial Peripheral Interface) Communications Library to read data from a SCP1000 Barometric Pressure sensor. Please click here for more information on SPI.
Hardware Required 硬件准备
Arduino or Genuino board
SCP1000 Pressure Sensor Breakout Board
hook-up wires
Circuit 电路图
image developed using Fritzing. For more circuit examples, see the Fritzing project page
Schematic 原理图
The SCP1000 barometric pressure sensor can read both air presure and temperature and report them via the SPI connection. For details of the control registers, see the SCP1000 data sheet.
SCP1000传感器可测量气压和温度,并通过SPI总线与控制器连接
Code 程序代码
The code below starts out by setting the SCP1000‘s configuration registers in the setup()
. In the main loop, it sets the sensor to read in high resolution mode, meaning that it will return a 19-bit value, for the pressure reading, and 16 bits for the temperature. The actual reading in degrees Celsius is the 16-bit result divided by 20.
使用时首先用setup()
对
SCP1000的配置寄存器进行设置。测量结果包含19位的气压值,16位的温度值。摄氏度等于16位数据除以20。
Then it reads the temperature‘s two bytes. Once it‘s got the temperature, it reads the pressure in two parts. First it reads the highest three bits, then the lower 16 bits. It combines these two into one single long integer by bit shifting the high bits then using a bitwise OR to combine them with the lower 16 bits. The actual pressure in Pascal is the 19-bit result divide by 4.
读取压力值时,先读高3位,再读低16位,然后通过移位组成19位的整数。帕斯卡数等于19位数据除以4。
1 /* 2 SCP1000 Barometric Pressure Sensor Display 3 4 Shows the output of a Barometric Pressure Sensor on a 5 Uses the SPI library. For details on the sensor, see: 6 http://www.sparkfun.com/commerce/product_info.php?products_id=8161 7 http://www.vti.fi/en/support/obsolete_products/pressure_sensors/ 8 9 This sketch adapted from Nathan Seidle‘s SCP1000 example for PIC: 10 http://www.sparkfun.com/datasheets/Sensors/SCP1000-Testing.zip 11 12 Circuit: SCP1000与控制板的接线 13 SCP1000 sensor attached to pins 6, 7, 10 - 13: 14 DRDY: pin 6 dataReadyPin 15 CSB: pin 7 chipSelectPin 16 MOSI: pin 11 17 MISO: pin 12 18 SCK: pin 13 19 20 created 31 July 2010 21 modified 14 August 2010 22 by Tom Igoe 23 */ 24 // the sensor communicates using SPI, so include the library: 25 #include <SPI.h> 26 27 //Sensor‘s memory register addresses: 28 29 const int PRESSURE = 0x1F; //3 most significant bits of pressure 30 const int PRESSURE_LSB = 0x20; //16 least significant bits of pressure 31 const int TEMPERATURE = 0x21; //16 bit temperature reading 32 const byte READ = 0b11111100; // SCP1000‘s read command SCP1000的读指令 33 const byte WRITE = 0b00000010; // SCP1000‘s write command SCP1000的写指令 34 35 // pins used for the connection with the sensor 36 // the other you need are controlled by the SPI library): 37 const int dataReadyPin = 6; 38 const int chipSelectPin = 7; 39 void setup() 40 41 { 42 Serial.begin(9600); 43 // start the SPI library: 44 SPI.begin(); 45 46 // initalize the data ready and chip select pins: 47 pinMode(dataReadyPin, INPUT); //数据准备信号来自传感器 48 pinMode(chipSelectPin, OUTPUT); //芯片选择信号来自控制器 49 50 //Configure SCP1000 for low noise configuration: 51 writeRegister(0x02, 0x2D); 52 writeRegister(0x01, 0x03); 53 writeRegister(0x03, 0x02); 54 // give the sensor time to set up: 55 delay(100); 56 } 57 58 59 void loop() 60 61 { 62 //Select High Resolution Mode 63 writeRegister(0x03, 0x0A); 64 65 // don‘t do anything until the data ready pin is high: 66 if (digitalRead(dataReadyPin) == HIGH) 67 68 { 69 //Read the temperature data 70 int tempData = readRegister(0x21, 2); //2个字节 71 // convert the temperature to celsius and display it: 72 float realTemp = (float)tempData / 20.0; //转换为摄氏温度 73 Serial.print("Temp[C]="); 74 Serial.print(realTemp); 75 76 77 //Read the pressure data highest 3 bits: 78 byte pressure_data_high = readRegister(0x1F, 1); 79 pressure_data_high &= 0b00000111; //you only needs bits 2 to 0 80 81 //Read the pressure data lower 16 bits: 82 unsigned int pressure_data_low = readRegister(0x20, 2); 83 //combine the two parts into one 19-bit number: 并转换为帕斯卡 84 long pressure = ((pressure_data_high << 16) | pressure_data_low) / 4; 85 // display the temperature: 86 Serial.println(" Pressure [Pa]=" + String(pressure)); 87 } 88 } 89 90 //Read from or write to register from the SCP1000: 91 unsigned int readRegister(byte thisRegister, int bytesToRead) //读SCP1000的寄存器 92 93 { 94 byte inByte = 0; // incoming byte from the SPI 95 unsigned int result = 0; // result to return 96 Serial.print(thisRegister, BIN); 97 Serial.print(" "); 98 // SCP1000 expects the register name in the upper 6 bits 99 // of the byte. So shift the bits left by two bits: 100 thisRegister = thisRegister << 2; 101 // now combine the address and the command into one byte 102 byte dataToSend = thisRegister & READ; // READ是读指令0b11111100 103 Serial.println(thisRegister, BIN); 104 // take the chip select low to select the device: 105 digitalWrite(chipSelectPin, LOW); 106 // send the device the register you want to read: 107 SPI.transfer(dataToSend); //传送寄存器地址 108 // send a value of 0 to read the first byte returned: 109 result = SPI.transfer(0x00); //传送0x00以得到第1个字节的数据 110 // decrement the number of bytes left to read: 111 bytesToRead--; 112 // if you still have another byte to read: 113 if (bytesToRead > 0) 114 115 { 116 // shift the first byte left, then get the second byte: 117 result = result << 8; 118 inByte = SPI.transfer(0x00); 119 // combine the byte you just got with the previous one: 120 result = result | inByte; 121 // decrement the number of bytes left to read: 122 bytesToRead--; 123 } 124 // take the chip select high to de-select: 125 digitalWrite(chipSelectPin, HIGH); 126 // return the result: 127 return (result); 128 } 129 130 //Sends a write command to SCP1000 131 void writeRegister(byte thisRegister, byte thisValue) //写SCP1000的寄存器 132 133 { 134 // SCP1000 expects the register address in the upper 6 bits 135 // of the byte. So shift the bits left by two bits: 136 thisRegister = thisRegister << 2; 137 // now combine the register address and the command into one byte: 138 byte dataToSend = thisRegister | WRITE; // WRITE是写指令0b00000010 139 // take the chip select low to select the device: 140 digitalWrite(chipSelectPin, LOW); 141 SPI.transfer(dataToSend); //Send register location 142 SPI.transfer(thisValue); //Send value to record into register 143 // take the chip select high to de-select: 144 digitalWrite(chipSelectPin, HIGH); 145 } 146 147
以上是关于SPI应用 用SPI总线读取气压传感器SCP1000的数据的主要内容,如果未能解决你的问题,请参考以下文章
STM32F407的SPI总线应用之驱动DAC8563(双通道,16bit分辨率,正负10V)