本帖最后由 littleshrimp 于 2014-12-27 13:24 编辑
世界上最低功耗的MCUMSP430FR5969+世界最低功耗的加速度传感器ADXL362堪称完美组合。组合完能嘎蛤?谁知道,先跑起来再说。
MSP430FR5969就不介绍了,那不是一搬的强大。
ADXL362是一款超低功耗、3轴MEMS加速度计,输出数据速率为100 Hz时功耗低于2 μA,在运动触发唤醒模式下功耗为270 nA。与使用功率占空比来实现低功耗的加速度计不同,ADXL362没有通过欠采样混叠输入信号;它采用全数据速率对传感器的整个带宽进行采样。
ADXL362通常提供12位输出分辨率;在较低分辨率足够时,还提供8位格式化数据以实现更高效的单字节传送。测量范围为±2g、±4 g及±8 g,±2 g范围内的分辨率为1 mg/LSB。噪声电平要求低于ADXL362正常值550 μg/√Hz的应用可以选择两个低噪声模式(典型值低至175μg/√Hz)之一,电源电流增加极小。
除了超低功耗以外,ADXL362还具有许多特性来实现真正的系统级节能。该器件包含了一个深度多模式输出FIFO、一个内置微功耗温度传感器和几个运动检测模式,其中包括可调阙值的睡眠和唤醒工作模式,在该模式下当测量速率为6HZ(大约)时功耗低至270nA。如有需要,可在检测到运动时提供一个引脚输出来直接控制外部开关。此外,ADXL362还支持对采样时间和/或外部时钟进行外部控制。
ADXL362可以在1.6V至3.5V的宽电源电压范围内工作,并且必要时可以与采用独立低电源电压工作的主机接口。ADXL362采用3 mm ×3.25 mm × 1.06 mm封装。
这么先进的传感器请问在哪里才能买的到?
ADI官网就可以申请。
这款传感器的价格不便宜,所以如果对功耗要求不高就贝选这颗了。
要调试这个传感器首先要做个PCB,封装方面ADI官方提供了BXL文件
装一个Ultra Librarian的软件就可以把BXL文件转换成任何你想要的格式,应该是任何。
PCB解决了就开始调程序,ADI所以招人欣恨的一点就是除了提供BXL封闭库,还提供了器件驱动。
瑞萨的代码看起来比较舒服,所以我下了这个原码。
打开压缩包会看到这些文件
ADXL362.C和ADXL362.H不用动,把Communication.c里的SPI改成MSP430FR5969的
再把MAIN.H里的配置代码摘出来放到工程里就可以使用了。是不是非常简单?
调试好ADXL362后为了方便测试,把它和我的第一个外设程序
MSP430FR5969 +CC1101 https://bbs.eeworld.com.cn/thread-453143-1-1.html
结合到一起实现ADXL362加速度数据的无线采集。
主程序是这样写的:
- <font face="宋体" size="4">void adxl362(void)
- {
- uint8_t i = 0;
- LED_TOG();
- LED_TOG();
- /* Init device. */
- if(ADXL362_Init())
- {
- i++;
- //ADI_Component("ADXL362 OK");
- }
- else
- {
- i--;
- //ADI_Component("ADXL362 Err");
- }
- /* Put the device in standby mode. */
- ADXL362_SetPowerMode(0);
- /* Set accelerometer's output data rate to: 12.5 Hz. */
- ADXL362_SetOutputRate(ADXL362_ODR_12_5_HZ);
- /* Setup the activity and inactivity detection. */
- ADXL362_SetRegisterValue(
- ADXL362_ACT_INACT_CTL_LINKLOOP(ADXL362_MODE_LINK),
- ADXL362_REG_ACT_INACT_CTL,
- 1);
- ADXL362_SetupActivityDetection(1, 30, 1);
- ADXL362_SetupInactivityDetection(1, 700, 25);
- /* Start the measurement process. */
- ADXL362_SetPowerMode(1);
- /* Clear ACT and INACT bits by reading the Status Register. */
- ADXL362_GetRegisterValue(&adxl362_status,
- ADXL362_REG_STATUS,
- 1);
-
- while(1)
- {
- /* Wait for the detection of an activity or inactivity or for available
- data. */
- do
- {
- ADXL362_GetRegisterValue(&adxl362_status, ADXL362_REG_STATUS, 1);
-
- }while(
- ((adxl362_status & ADXL362_STATUS_DATA_RDY) == 0) &&
- ((adxl362_status & ADXL362_STATUS_INACT) == 0) &&
- ((adxl362_status & ADXL362_STATUS_ACT == 0)));
- /* Get the data from the device and display it. */
- if(adxl362_status & ADXL362_STATUS_DATA_RDY)
- {
- ADXL362_GetXyz(&xAxis, &yAxis, &zAxis);
- memset(str_buffer,0,sizeof(str_buffer));
- sprintf(str_buffer,"x:%d,y:%d,z:%d",xAxis,yAxis,zAxis);
- send_packet_string(str_buffer);
- LED_TOG();
- //temperature = ADXL362_ReadTemperature();
- }
- /* Display the activity/inactivity adxl362_status. */
- if(adxl362_status & ADXL362_STATUS_INACT)
- {
- }
- else if(adxl362_status & ADXL362_STATUS_ACT)
- {
-
- }
- LED1_TOG();
- delay_s(1);
- }
- }
- int main( void )
- {
- // Stop watchdog timer to prevent time out reset
- WDTCTL = WDTPW + WDTHOLD;
-
- PM5CTL0 &= ~LOCKLPM5;
-
-
-
- CC1101_Init(); //始始化cc1101
- CC1101_SetRx(); //配置cc1101进入接收模式
- send_packet_string("Acceleration sensor is running!");
- adxl362();
- }</font>
复制代码
下面附上一段演示视频和ADXL362在不同角度时采集数据的图片