TA的每日心情 | 奋斗 2018-8-29 20:40 |
---|
签到天数: 1341 天 连续签到: 1 天 [LV.10]以坛为家III
|
本帖最后由 w932443004 于 2015-6-19 12:11 编辑
考虑到Arduino自带SPI库,又有很多例子,于是使用了Arduino UNO 板子
首先是分线板的焊接
下面两个图分别是分线板焊接过程中的照片
按照电源以及SPI接口 连接导线
接着调用SPI库文件
编写初始化代码
- #include <SPI.h>
- void setup() {
- // put your setup code here, to run once:
- // set the slaveSelectPin as an output:
- pinMode (slaveSelectPin, OUTPUT);
- digitalWrite(slaveSelectPin, HIGH);
- SPI.setBitOrder(MSBFIRST);
- SPI.setClockDivider (SPI_CLOCK_DIV4);
- SPI.setDataMode(SPI_MODE0);
- SPI.begin();
- Serial.begin(9600);
- }
复制代码 首先是尝试读取设备的相关信息- // device id
- Serial.print("The device ID is: ");
- data = readRyte(0x00);
- Serial.println(data,HEX);
- delay(1000);
-
- // device mst
- Serial.print("The device mst is: ");
- data = readRyte(0x01);
- Serial.println(data,HEX);
- delay(1000);
-
- // part id
- Serial.print("The part id is: ");
- data = readRyte(0x02);
- Serial.println(data,HEX);
- delay(1000);
-
- // revid
- Serial.print("The rev id is: ");
- data = readRyte(0x03);
- Serial.println(data,HEX);
- delay(1000);
-
- // status
- Serial.print("The status is: ");
- data = readRyte(0x0B);
- Serial.println(data,BIN);
- delay(1000);
复制代码 得到的结果如下
可见我们手上这批芯片的芯片版本已经是2 了 而不是数据手册上写的 1
其次是读取8位的X Y Z 轴数据- // 测量并读取8位的x y z轴数据
- // start work
- Serial.println("test begin");
- writeRegister(0x2D, 0x0A);
- delay(100);
-
- // status
- data = readRyte(0x0B);
- Serial.print("The status is: ");
- Serial.println(data,BIN);
- while(!(data&0x01))
- {
- data = readRyte(0x0B);
- Serial.print("The status is: ");
- Serial.println(data,BIN);
- delay(100);
- }
-
- data2 = readRyte(0x08);
- Serial.print("The g_x data is : ");
- if(data2>127)
- {
- data2 = data2 - 256;
- }
- Serial.println(data2);
-
- data2 = readRyte(0x09);
- Serial.print("The g_ydata is : ");
- if(data2>127)
- {
- data2 = data2 - 256;
- }
- Serial.println(data2);
-
- data2 = readRyte(0x0a);
- Serial.print("The g_z data is : ");
- if(data2>127)
- {
- data2 = data2 - 256;
- }
- Serial.println(data2);
复制代码 得到的结果如下
发现即使我板子水平放置 x y z轴还是有偏差
难道是芯片需要水平校准?
查找开发板代码 发现果然如此:- __interrupt static void r_tau0_channel2_interrupt(void)
- {
- /* Start user code. Do not edit comment generated here */
- XL362MultiRead(XL362_XDATA_L,6);
- for(tTemp=0; tTemp<=2; tTemp++)
- {
- Acc[tTemp] = r_data[(tTemp*2+1)];
- Acc[tTemp] = (Acc[tTemp]<<8) | r_data[(tTemp*2)];
- sumAcc[tTemp] = sumAcc[tTemp] + Acc[tTemp];
- }
- sample_counter++;
- if(64 == sample_counter)
- {
- sample_counter = 0;
- R_TAU0_Channel2_Stop();
- for(tTemp=0; tTemp<=2; tTemp++)
- {
- Acc_Offset[tTemp] = (int16_t)(sumAcc[tTemp]>>6);
- sumAcc[tTemp] = 0;
- }
- Acc_Offset[Z_CHANNEL] = Acc_Offset[Z_CHANNEL] - 1000;
- Calibrate = 2;
- }
- /* End user code. Do not edit comment generated here */
- }
复制代码 读取64次 求水平下的平均值 作为校准值
实例代码的主函数中 也有一句明显的话- while(1 == Calibrate) //wait for offset calibration
- {;}
复制代码 即 水平放置 等待校准
且数据手册的技术规格上写着 0g偏移值的范围,对比我之前的读到的数据 也算是合格
接着尝试读取温度值- // 温度
-
- data = readRyte(0x15);
- Serial.print("The temp data high is : 0x");
- Serial.println(data,HEX);
- data = readRyte(0x14);
- Serial.print("The temp data low is : 0x");
- Serial.println(data,HEX);
-
- temperature = readRegisters(0x14,2);
- Serial.print("The temp data is : 0x");
- Serial.println(temperature,HEX);
- temp = temperature*0.065;
- Serial.print("The temp is : ");
- Serial.print(temp,3);
- Serial.println("'C");
复制代码 结果
这个偏差也太大了 我是在室温 好歹20多度 快30了
难道这个温度也需要校准?
不过看器件手册上写温度偏置 能有350个LSB 估计这个温度传感器是不能好好的玩耍了
|
|