21253|27

5979

帖子

8

TA的资源

版主

楼主
 

DIY三轴加速度传感器STEP 1:震动报警 [复制链接]

基于LPC1343与三轴加速度传感器

的震动报警装置

Author: chenzhufly


2010-05-18

系统硬件框图:





系统硬件主要有以下几部分组成:

LPC1343: 主控,协调各部分的工作;
SYS_LED: 指示系统正在工作;
BEEP:
给出报警声音;
SENSOR:
检测装置震动信息;
UART:
打印调试信息。

系统软件框图:







系统软件主要分以下几部分
1.
系统软件基于FreeRtos操作系统,分3个任务;(FreeRtos的移植我前面已经写过J)
2.
Task1主要完成闪灯功能,指示系统工作;
3.
Task2驱动加速度传感器,阈值判读,给出触发条件;
4.
Task3主要检测Task2给出的条件,驱动Beep,进行报警。


加速度传感器简介:

我这里使用的加速度传感器是ST公司出品的LIS3LV02DL,是一款三轴低压数字输出线性加速度传感器,它由一个感应单元和接口单元组成。感应单元由三个桥式电容以及放大、A/D采样测量电路组成,测量在X,Y,Z轴方向的加速度,接口单元提供I2C或者SPI接口,如下图所示:









LIS3LV02DL的主要特点:






LIS3LV02DL的管脚定义:











LIS3LV02DL的典型外围电路:






LIS3LV02DL的读写时序关系:





代码示例:
这里使用LPC1343的IO模拟LIS3LV02DL的spi时序,LPC1343的ssp接口我还没有掌握,只好把它绕过去了,哈哈……………………


  1. //--------------传感器接口定义---------------
  2. #define MOSI_H GPIOSetValue( 3, 2, 1 )   //使用的是接口P3.2
  3. #define MOSI_L GPIOSetValue( 3, 2, 0 )
  4. #define SCLK_H GPIOSetValue( 2, 11, 1 )  //使用的是接口P2.11
  5. #define SCLK_L GPIOSetValue( 2, 11, 0 )   
  6. #define SSEL_H GPIOSetValue( 0, 2, 1 )   //使用的是接口P0.2
  7. #define SSEL_L GPIOSetValue( 0, 2, 0 )   
  8. #define MISO_VALUE GPIOReadValue(0,8)    //使用的是接口P0.8

  9. void delay(int i){
  10.     while(i--);
  11. }

  12. char  spi_comm(unsigned char outgoing_byte)//模拟LIS3LV02DL时序
  13. {
  14.     char incoming_byte, x;
  15.     SCLK_H; //Pull SPI clock high
  16.     delay(100);
  17.     for(x = 0 ; x < 8 ; x++)
  18.     {
  19.         SCLK_L; //Pull SPI clock low
  20.         delay(100);
  21.         if(outgoing_byte & 0x80)
  22.         MOSI_H; //Pull SPI data out high
  23.         else
  24.         MOSI_L; //Pull SPI data out low
  25.         outgoing_byte = outgoing_byte << 1;
  26.         SCLK_H; //Pull SPI clock high
  27.         delay(100);
  28.         incoming_byte = incoming_byte << 1;
  29.         incoming_byte = incoming_byte | MISO_VALUE; //获取加速度传感器的输入数据
  30.     }  
  31.     return(incoming_byte);
  32. }

  33. char read_register(unsigned char register_name)// 读LIS3LV02DL寄存器
  34. {
  35.     char in_byte;
  36.     register_name |= 0x80; //Set D7 to 1 for read mode
  37.     SSEL_L; //Select LIS
  38.     in_byte = spi_comm(register_name); //SPI read 6-bit register from LIS
  39. in_byte = spi_comm(0x00);
  40.     SSEL_H;
  41.     return(in_byte);
  42. }

  43. //Sends a write command to LIS
  44. void write_register(unsigned char register_name, unsigned char register_value)//写LIS3LV02DL寄存器
  45. {
  46.     unsigned char in_byte;
  47.     register_name &= 0x3f; //Clear D7 to 0 for write mode
  48.     SSEL_L; //Select LIS
  49.     in_byte = spi_comm(register_name); //SPI read 6-bit register from LIS
  50.     in_byte = spi_comm(register_value);
  51.     SSEL_H;
  52. }

  53. static void setupHardware(void) {//硬件初始化
  54.       /* Config CLKOUT, mostly used for debugging. */
  55.       CLKOUT_Setup( CLKOUTCLK_SRC_MAIN_CLK );
  56.       LPC_IOCON->IO0_1 &= ~0x07;
  57.       LPC_IOCON->IO0_1 |= 0x01;    /* CLK OUT */

  58.       /* Enable AHB clock to the GPIO domain. */
  59.       LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6);

  60.       /* Set port for LED to output */
  61.       GPIOSetDir( SYS_LED_PORT, SYS_LED_BIT, 1 ); //配置系统LED
  62.       GPIOSetDir( LED_PORT, LED_BIT, 1 );

  63. //------------for sensor---------------
  64.       GPIOSetDir( 3, 2, 1 ); //mosi  //配置LIS3LV02DL接口
  65.       GPIOSetDir( 0, 8, 0 ); //miso
  66.       GPIOSetDir( 2, 11, 1 ); //sclk
  67.       GPIOSetDir( 0, 2, 1 ); //ssel

  68.       UARTInit(9600);//初始化串口

  69.    
  70. sensor_data1 = read_register(0x0f);//读取期间ID,应该反馈3A
  71.      UARTSendchar(sensor_data1); //从串口可以看到打印0x3A

  72.      write_register(LIS3L_CTRL_REG1,0xD7);  //设置采样率,160khz,正常工作模式
  73.      write_register(LIS3L_CTRL_REG2,0x44);  //读取完高字节后数据更新,确保数据传输正确,

  74. }

  75. void vUserTask1(void *pvParameters) {//闪灯任务
  76.     while (1) {
  77.        if (sys_led_state == LED_OFF) {
  78.            GPIOSetValue( SYS_LED_PORT, SYS_LED_BIT, LED_ON );
  79.            sys_led_state = LED_ON;
  80.        } else {
  81.            GPIOSetValue( SYS_LED_PORT, SYS_LED_BIT, LED_OFF );
  82.            sys_led_state = LED_OFF;
  83.        }
  84.        vTaskDelay(10);
  85.     }
  86. }
  87. void vUserTask2(void *pvParameters) {//加速度传感器监测任务
  88.     while (1) {
  89.            sensor_data1 = read_register(LIS3L_OUTZ_L);
  90.            sensor_data1 = read_register(LIS3L_OUTX_H);
  91.            UARTSendchar(sensor_data1); //打印X轴的高字节
  92.            if(sensor_data1>0x00)        //判断是否报警,阈值可以根据实际调节
  93.            iState = 1;
  94.            vTaskDelay(10) ;
  95.     }
  96. }

  97. void vUserTask3(void *pvParameters) {//Beep报警任务
  98.     while (1) {
  99.     if(iState == 1){
  100.        GPIOSetValue( 2, 0, 0 );
  101.        iState = 0;
  102.     }
  103.     else
  104.        GPIOSetValue( 2, 0, 1 );
  105.        vTaskDelay(10) ;
  106.     }
  107. }
  108. int main(void) {
  109.     setupHardware(); //初始化硬件系统

  110. //建立3个任务
  111.     xTaskCreate( vUserTask1, ( signed portCHAR * ) "Sys_led", USERTASK_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
  112.     xTaskCreate( vUserTask2, ( signed portCHAR * ) "Sensor", USERTASK_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
  113.     xTaskCreate( vUserTask3, ( signed portCHAR * ) "Beep", USERTASK_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );

  114.     vTaskStartScheduler(); //开始任务调度
  115.     return 1;
  116. }
复制代码




让大家看看我最新的底板,手机拍的,好模糊,哈哈。。。。。。。。。。。







双面胶上贴的那个就是加速度传感器


再加一段视频,哈哈




参考资料:

新型MEMS三轴加速度计LIS3LV02DL原理与应用.pdf (1.32 MB, 下载次数: 318)


LIS3LV02DL.pdf (669.2 KB, 下载次数: 209)

我写的文档pdf版本

基于LPC1343与三轴加速度传感器震动报警装置 .pdf (243.59 KB, 下载次数: 237)
此帖出自传感器论坛

最新回复

好东西。  详情 回复 发表于 2013-2-24 11:41
点赞 关注(1)
个人签名生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
 
 

回复
举报

4997

帖子

19

TA的资源

裸片初长成(初级)

沙发
 

好东西,这个得顶!!!!!!!!!!!!!!!!

此帖出自传感器论坛
 
 
 

回复

2955

帖子

0

TA的资源

纯净的硅(初级)

板凳
 
好 学习学习................
此帖出自传感器论坛
个人签名不断地学习,才会有创新!
淘宝小店:手机、qq点卡、游戏点卡自动充值 http://shop63727265.taobao.com/
 
 
 

回复

68

帖子

0

TA的资源

五彩晶圆(初级)

4
 

顶一下

加速度传感器是个好东西,原来主要是军用制导设备上的,现在逐步进入民用各个领域。如汽车导航,汽车防盗报警等领域。我觉得用于防盗报警,不一定要使用三轴的。我用单轴的实验效果就很好
此帖出自传感器论坛
 
 
 

回复

2万

帖子

71

TA的资源

管理员

5
 
chenzhufly做了一个大致思路出来,用他自己的话说:算是个模型

大家可以在此基础上,多多提建议,多多发挥。
此帖出自传感器论坛
加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
个人签名

加油!在电子行业默默贡献自己的力量!:)

 
 
 

回复

148

帖子

3

TA的资源

五彩晶圆(初级)

6
 
好厉害啊
此帖出自传感器论坛
 
 
 

回复

2131

帖子

0

TA的资源

至上芯片

7
 

回复 4楼 RF研究 的帖子

汽车导航上用过三轴的,不过没有找到一个好的算法!
此帖出自传感器论坛
个人签名处处留心皆学问!
 
 
 

回复

349

帖子

0

TA的资源

裸片初长成(初级)

8
 
楼主已经开始了啊!
只是用于防盗报警,是不必要用,我们做的汽车防盗器,用的只是反向应用了蜂鸣器,就实现了震动的检测
此帖出自传感器论坛
 
 
 

回复

3138

帖子

0

TA的资源

裸片初长成(初级)

9
 

干滴不错嘛!

 看了哈任务2的程序,是不是只检查了传感器1轴的输出,超过固定阈值就报警? 而且从视频看也似乎是倾斜报警而不是震动?
此帖出自传感器论坛
 
 
 

回复

5979

帖子

8

TA的资源

版主

10
 
是只检测了一轴,可以同时检测3轴

我的桌子固定住了,拍一下动都不动,哈哈。。
我只好把它拿在手把玩把玩了
此帖出自传感器论坛
个人签名生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
 
 
 

回复

3138

帖子

0

TA的资源

裸片初长成(初级)

11
 
 拍桌子不叫唤,是因为测的是“变化”而不是“变化率”,所以现在测的实际是倾角而不是震动。监视变化率需要将传感器的即时输出和它通过LPF的信号做差分比较,这样甩一下或拍桌子就能报警,而缓慢地改变置向甚至颠倒都不会报警,这才是真正意义上的“震动传感器”。
此帖出自传感器论坛
 
 
 

回复

33

帖子

0

TA的资源

一粒金砂(初级)

12
 
好厉害啊
此帖出自传感器论坛
 
 
 

回复

5979

帖子

8

TA的资源

版主

13
 
仙猫说的很有道理!

检测变化和变化率是不同的两种方式

我这明显检测的是变化,可以改成检测变化率的,可能效果更好点

希望有更多像您这样有经验的加入讨论,我感觉这里面的算法还挺麻烦

我后面准备搞个手柄,目前还不太清楚如何把传感器信号和鼠标的信号映射起来

欢迎大家讨论
此帖出自传感器论坛
个人签名生活就是油盐酱醋再加一点糖,快活就是一天到晚乐呵呵的忙
===================================
做一个简单的人,踏实而务实,不沉溺幻想,不庸人自扰
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

14
 
受教了……
此帖出自传感器论坛
 
 
 

回复

66

帖子

0

TA的资源

纯净的硅(中级)

15
 
以前,搞过倾角传感器,用于汽车倾斜检测,感觉和你这个类似,关键在算法。
此帖出自传感器论坛
 
 
 

回复

349

帖子

0

TA的资源

裸片初长成(初级)

16
 

回复 13楼 chenzhufly 的帖子

鼠标的移动可以映射为加速度传感器的倾斜,点击的话还是用按键好些,要是在用上触摸那就更好了
此帖出自传感器论坛
 
 
 

回复

66

帖子

0

TA的资源

纯净的硅(高级)

17
 
楼主辛苦了1
此帖出自传感器论坛
 
 
 

回复

185

帖子

0

TA的资源

一粒金砂(初级)

18
 
赞一下
此帖出自传感器论坛
个人签名加油学习,努力提高
 
 
 

回复

33

帖子

0

TA的资源

一粒金砂(初级)

19
 
好好地学学楼主的经验。该器件用在导航上会更好地发挥器件的功能。
此帖出自传感器论坛
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(中级)

20
 

有关测量三轴问题

如何计算一个人在摔倒时的参数啊!我是才进入加速度传感器的学习,请求指点!谢谢!
此帖出自传感器论坛
 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表