查看: 3853|回复: 1

【ADXL362Z分线板】基于Arduino的实验 1

[复制链接]
  • TA的每日心情
    奋斗
    2018-8-29 20:40
  • 签到天数: 1341 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2015-6-19 00:08:56 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 w932443004 于 2015-6-19 12:11 编辑

    考虑到Arduino自带SPI库,又有很多例子,于是使用了Arduino UNO 板子
    首先是分线板的焊接
    下面两个图分别是分线板焊接过程中的照片
    WP_20150613_005.jpg
    WP_20150613_006.jpg
    按照电源以及SPI接口 连接导线
    WP_20150618_003.jpg

    接着调用SPI库文件
    编写初始化代码

    1. #include <SPI.h>

    2. void setup() {
    3.   // put your setup code here, to run once:
    4.   // set the slaveSelectPin as an output:
    5.   pinMode (slaveSelectPin, OUTPUT);
    6.   digitalWrite(slaveSelectPin, HIGH);  
    7.   SPI.setBitOrder(MSBFIRST);
    8.   SPI.setClockDivider (SPI_CLOCK_DIV4);
    9.   SPI.setDataMode(SPI_MODE0);   
    10.   SPI.begin();  
    11.   Serial.begin(9600);
    12. }
    复制代码
    首先是尝试读取设备的相关信息
    1.   // device id
    2.   Serial.print("The device ID is: ");
    3.   data = readRyte(0x00);
    4.   Serial.println(data,HEX);
    5.   delay(1000);
    6.   
    7.   // device mst
    8.   Serial.print("The device mst is: ");
    9.   data = readRyte(0x01);
    10.   Serial.println(data,HEX);
    11.   delay(1000);
    12.   
    13.   // part id
    14.   Serial.print("The part id is: ");
    15.   data = readRyte(0x02);
    16.   Serial.println(data,HEX);
    17.   delay(1000);  
    18.   
    19.   // revid
    20.   Serial.print("The rev id is: ");
    21.   data = readRyte(0x03);
    22.   Serial.println(data,HEX);
    23.   delay(1000);  
    24.   
    25.   // status
    26.   Serial.print("The status is: ");
    27.   data = readRyte(0x0B);
    28.   Serial.println(data,BIN);
    29.   delay(1000);
    复制代码
    得到的结果如下
    QQ截图-1.jpg
    可见我们手上这批芯片的芯片版本已经是2 了 而不是数据手册上写的 1

    其次是读取8位的X Y Z 轴数据
    1. // 测量并读取8位的x y z轴数据
    2. // start work
    3.   Serial.println("test begin");
    4.   writeRegister(0x2D, 0x0A);
    5.   delay(100);
    6.   
    7.   // status
    8.   data = readRyte(0x0B);
    9.   Serial.print("The status is: ");
    10.   Serial.println(data,BIN);
    11.   while(!(data&0x01))
    12.   {
    13.     data = readRyte(0x0B);
    14.     Serial.print("The status is: ");
    15.     Serial.println(data,BIN);
    16.     delay(100);
    17.   }
    18.   
    19.   data2 = readRyte(0x08);
    20.   Serial.print("The g_x data is : ");
    21.   if(data2>127)
    22.   {
    23.     data2 = data2 - 256;
    24.   }
    25.   Serial.println(data2);
    26.   
    27.   data2 = readRyte(0x09);
    28.   Serial.print("The g_ydata is : ");
    29.   if(data2>127)
    30.   {
    31.     data2 = data2 - 256;
    32.   }
    33.   Serial.println(data2);
    34.   
    35.   data2 = readRyte(0x0a);
    36.   Serial.print("The g_z data is : ");
    37.   if(data2>127)
    38.   {
    39.     data2 = data2 - 256;
    40.   }
    41.   Serial.println(data2);
    复制代码
    得到的结果如下
    QQ截图-2.jpg
    发现即使我板子水平放置 x y z轴还是有偏差
    难道是芯片需要水平校准?
    查找开发板代码 发现果然如此:
    1. __interrupt static void r_tau0_channel2_interrupt(void)
    2. {
    3.     /* Start user code. Do not edit comment generated here */
    4.         XL362MultiRead(XL362_XDATA_L,6);
    5.         for(tTemp=0; tTemp<=2; tTemp++)
    6.         {
    7.                 Acc[tTemp] = r_data[(tTemp*2+1)];
    8.                 Acc[tTemp] = (Acc[tTemp]<<8) | r_data[(tTemp*2)];
    9.                 sumAcc[tTemp] = sumAcc[tTemp] + Acc[tTemp];
    10.         }
    11.         sample_counter++;
    12.         if(64 == sample_counter)
    13.         {
    14.                 sample_counter = 0;
    15.                 R_TAU0_Channel2_Stop();
    16.                 for(tTemp=0; tTemp<=2; tTemp++)
    17.                 {
    18.                         Acc_Offset[tTemp] = (int16_t)(sumAcc[tTemp]>>6);
    19.                         sumAcc[tTemp] = 0;
    20.                 }
    21.                 Acc_Offset[Z_CHANNEL] = Acc_Offset[Z_CHANNEL] - 1000;
    22.                 Calibrate = 2;
    23.         }
    24.     /* End user code. Do not edit comment generated here */
    25. }
    复制代码
    读取64次 求水平下的平均值 作为校准值
    实例代码的主函数中 也有一句明显的话
    1.         while(1 == Calibrate)        //wait for offset calibration
    2.         {;}
    复制代码
    即 水平放置 等待校准
    且数据手册的技术规格上写着 0g偏移值的范围,对比我之前的读到的数据 也算是合格

    接着尝试读取温度值
    1.   // 温度
    2.   
    3.   data = readRyte(0x15);
    4.   Serial.print("The temp data high is : 0x");
    5.   Serial.println(data,HEX);
    6.   data = readRyte(0x14);
    7.   Serial.print("The temp data low is : 0x");
    8.   Serial.println(data,HEX);
    9.   
    10.   temperature = readRegisters(0x14,2);
    11.   Serial.print("The temp data is : 0x");
    12.   Serial.println(temperature,HEX);
    13.   temp =  temperature*0.065;
    14.   Serial.print("The temp  is : ");
    15.   Serial.print(temp,3);
    16.   Serial.println("'C");
    复制代码
    结果
    QQ截图-3.jpg
    这个偏差也太大了 我是在室温 好歹20多度 快30了
    难道这个温度也需要校准?
    不过看器件手册上写温度偏置 能有350个LSB 估计这个温度传感器是不能好好的玩耍了


    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-12-6 17:33
  • 签到天数: 853 天

    连续签到: 1 天

    [LV.10]以坛为家III

    发表于 2015-6-19 07:51:51 | 显示全部楼层
    350个LSB
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /2 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-4-20 21:21 , Processed in 0.113345 second(s), 18 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.