|
基于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接口我还没有掌握,只好把它绕过去了,哈哈……………………
-
- //--------------传感器接口定义---------------
- #define MOSI_H GPIOSetValue( 3, 2, 1 ) //使用的是接口P3.2
- #define MOSI_L GPIOSetValue( 3, 2, 0 )
- #define SCLK_H GPIOSetValue( 2, 11, 1 ) //使用的是接口P2.11
- #define SCLK_L GPIOSetValue( 2, 11, 0 )
- #define SSEL_H GPIOSetValue( 0, 2, 1 ) //使用的是接口P0.2
- #define SSEL_L GPIOSetValue( 0, 2, 0 )
- #define MISO_VALUE GPIOReadValue(0,8) //使用的是接口P0.8
- void delay(int i){
- while(i--);
- }
- char spi_comm(unsigned char outgoing_byte)//模拟LIS3LV02DL时序
- {
- char incoming_byte, x;
- SCLK_H; //Pull SPI clock high
- delay(100);
- for(x = 0 ; x < 8 ; x++)
- {
- SCLK_L; //Pull SPI clock low
- delay(100);
- if(outgoing_byte & 0x80)
- MOSI_H; //Pull SPI data out high
- else
- MOSI_L; //Pull SPI data out low
- outgoing_byte = outgoing_byte << 1;
- SCLK_H; //Pull SPI clock high
- delay(100);
- incoming_byte = incoming_byte << 1;
- incoming_byte = incoming_byte | MISO_VALUE; //获取加速度传感器的输入数据
- }
- return(incoming_byte);
- }
- char read_register(unsigned char register_name)// 读LIS3LV02DL寄存器
- {
- char in_byte;
- register_name |= 0x80; //Set D7 to 1 for read mode
- SSEL_L; //Select LIS
- in_byte = spi_comm(register_name); //SPI read 6-bit register from LIS
- in_byte = spi_comm(0x00);
- SSEL_H;
- return(in_byte);
- }
- //Sends a write command to LIS
- void write_register(unsigned char register_name, unsigned char register_value)//写LIS3LV02DL寄存器
- {
- unsigned char in_byte;
- register_name &= 0x3f; //Clear D7 to 0 for write mode
- SSEL_L; //Select LIS
- in_byte = spi_comm(register_name); //SPI read 6-bit register from LIS
- in_byte = spi_comm(register_value);
- SSEL_H;
- }
- static void setupHardware(void) {//硬件初始化
- /* Config CLKOUT, mostly used for debugging. */
- CLKOUT_Setup( CLKOUTCLK_SRC_MAIN_CLK );
- LPC_IOCON->IO0_1 &= ~0x07;
- LPC_IOCON->IO0_1 |= 0x01; /* CLK OUT */
- /* Enable AHB clock to the GPIO domain. */
- LPC_SYSCON->SYSAHBCLKCTRL |= (1<<6);
- /* Set port for LED to output */
- GPIOSetDir( SYS_LED_PORT, SYS_LED_BIT, 1 ); //配置系统LED
- GPIOSetDir( LED_PORT, LED_BIT, 1 );
- //------------for sensor---------------
- GPIOSetDir( 3, 2, 1 ); //mosi //配置LIS3LV02DL接口
- GPIOSetDir( 0, 8, 0 ); //miso
- GPIOSetDir( 2, 11, 1 ); //sclk
- GPIOSetDir( 0, 2, 1 ); //ssel
- UARTInit(9600);//初始化串口
-
- sensor_data1 = read_register(0x0f);//读取期间ID,应该反馈3A
- UARTSendchar(sensor_data1); //从串口可以看到打印0x3A
- write_register(LIS3L_CTRL_REG1,0xD7); //设置采样率,160khz,正常工作模式
- write_register(LIS3L_CTRL_REG2,0x44); //读取完高字节后数据更新,确保数据传输正确,
- }
- void vUserTask1(void *pvParameters) {//闪灯任务
- while (1) {
- if (sys_led_state == LED_OFF) {
- GPIOSetValue( SYS_LED_PORT, SYS_LED_BIT, LED_ON );
- sys_led_state = LED_ON;
- } else {
- GPIOSetValue( SYS_LED_PORT, SYS_LED_BIT, LED_OFF );
- sys_led_state = LED_OFF;
- }
- vTaskDelay(10);
- }
- }
- void vUserTask2(void *pvParameters) {//加速度传感器监测任务
- while (1) {
- sensor_data1 = read_register(LIS3L_OUTZ_L);
- sensor_data1 = read_register(LIS3L_OUTX_H);
- UARTSendchar(sensor_data1); //打印X轴的高字节
- if(sensor_data1>0x00) //判断是否报警,阈值可以根据实际调节
- iState = 1;
- vTaskDelay(10) ;
- }
- }
- void vUserTask3(void *pvParameters) {//Beep报警任务
- while (1) {
- if(iState == 1){
- GPIOSetValue( 2, 0, 0 );
- iState = 0;
- }
- else
- GPIOSetValue( 2, 0, 1 );
- vTaskDelay(10) ;
- }
- }
- int main(void) {
- setupHardware(); //初始化硬件系统
- //建立3个任务
- xTaskCreate( vUserTask1, ( signed portCHAR * ) "Sys_led", USERTASK_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
- xTaskCreate( vUserTask2, ( signed portCHAR * ) "Sensor", USERTASK_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
- xTaskCreate( vUserTask3, ( signed portCHAR * ) "Beep", USERTASK_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
- vTaskStartScheduler(); //开始任务调度
- return 1;
- }
复制代码
让大家看看我最新的底板,手机拍的,好模糊,哈哈。。。。。。。。。。。
双面胶上贴的那个就是加速度传感器
再加一段视频,哈哈
参考资料:
新型MEMS三轴加速度计LIS3LV02DL原理与应用.pdf
(1.32 MB, 下载次数: 318)
LIS3LV02DL.pdf
(669.2 KB, 下载次数: 209)
我写的文档pdf版本
基于LPC1343与三轴加速度传感器震动报警装置 .pdf
(243.59 KB, 下载次数: 237)
|
|