OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 32735|回复: 68

【ALIENTEK 战舰STM32开发板例程系列连载+教学】第三十四章 ADXL345三轴加速度传感器实验

[复制链接]

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2013-3-22 23:23:48 | 显示全部楼层 |阅读模式
 

第三十四章 三轴加速度传感器实验

 

自从有了Iphone,各种新技术的普及程度越来越快,人们喜欢的不再是摔不坏的诺基亚,而是用户体验极佳的Iphone

本章,我们介绍一种当今智能手机普遍具有的传感器:加速度传感器。在手机上,这个功能可以用来:自动切换横竖屏、玩游戏和切歌等。ALIENTEK战舰STM32开发板自带了加速度传感器:ADXL345。本章我们将使用STM32来驱动ADXL345,读取3个方向的重力加速度值,并转换为角度,显示在TFTLCD模块上。本章分为如下几个部分:

34.1 ADXL345简介

34.2 硬件设计

34.3 软件设计

34.4 下载验证


34.1 ADXL345简介

ADXL345ADI公司的一款3轴、数字输出的加速度传感器。ADXL345ADI公司推出的基于iMEMS技术的3轴、数字输出加速度传感器。该加速度传感器的特点有:

l  分辨率高。最高13位分辨率。

l  量程可变。具有+/-2g+/-4g+/-8g+/-16g可变的测量范围。

l  灵敏度高。最高达3.9mg/LSB,能测量不到1.0°的倾斜角度变化。

l  功耗低。40~145uA的超低功耗,待机模式只有0.1uA

l  尺寸小。整个IC尺寸只有3mm*5mm*1mmLGA封装。

ADXL支持标准的I2CSPI数字接口,自带32FIFO存储,并且内部有多种运动状态检测和灵活的中断方式等特性。ADXL345传感器的检测轴如图34.1.1所示:


34.1.1 ADXL345的三个检测轴

ADXL345沿检测轴正向加速时,它对正加速度进行检测。在检测重力时用户需要注意,当检测轴的方向与重力的方向相反时检测到的是正加速度。图33.1.2所示为输出对重力的响应。


34.1.2 ADXL345输出对重力的响应

       34.1.2列出了ADXL345在不同摆放方式时的输出,以便后续分析。接下来我们看看ADXL345的引脚图,如图34.1.3所示:


34.1.3 ADXL345引脚图

       ADXL345支持SPIIIC两种通信方式,为了节省IO口,战舰STM32开发板采用的是IIC方式连接,官方推荐的IIC连接电路如图34.1.4所示:


34.1.4 ADXL345 IIC模式连接电路

       从上图可看出,ADXL345的连接十分简单,外围需要的器件也极少(就2个电容),如上连接(SDO/ALT ADDRESS接地),则ADXL345的地址为0X53(不含最低位),如果SDO/ALT ADDRESS接高,那么ADXL345的地址将变为0X1D(不含最低位)。IIC通信的时序我们在之前已经介绍过(第二十七章,IIC实验),这里就不再细说了。

       最后,我们介绍一下ADXL345的初始化步骤。ADXL345的初始化步骤如下:

1) 上电

2) 等待1.1ms

3) 初始化命令序列

4) 结束

其中上电这个动作发生在开发板第一次上电的时候,在上电之后,等待1.1ms左右,就可以开始发送初始化序列了,初始化序列一结束,ADXL345就开始正常工作了。这里的初始化序列,最简单的只需要配置3个寄存器,如表34.1.1所示:

 

步骤

寄存器地址

寄存器名字

寄存器值

功能描述

1

0X31

DATA_FORMAT

0X0B

±16g13位模式

2

0X2D

POWER_CTL

0X08

测量模式

3

0X2E

INT_ENABLE

0X80

使能DATA_READY中断

34.1.1 ADXL345最简单的初始化命令序列

       发送以上序列给ADXL345以后,ADXL345即开始正常工作。

       ADXL345我们就介绍到这里,详细的介绍,请参考ADXL345的数据手册。

34.2 硬件设计

本实验采用STM323个普通IO连接ADXL345本章实验功能简介:主函数不停的查询ADXL345的转换结果,得到xyz三个方向的加速度值(读数值),然后将其转换为与自然系坐标的角度,并将结果在LCD模块上显示出来。DS0来指示程序正在运行,通过按下WK_UP按键,可以进行ADXL345的自动校准(DS1用于提示正在校准)。

所要用到的硬件资源如下:

1)  指示灯DS0DS1

2)  WK_UP按键

3) TFTLCD模块

4)  ADXL345

    3个,在之前的实例已经介绍过了,这里我们仅介绍ADXL345与战舰STM32开发板的连接。该接口与MCU的连接原理图如34.2.1所示:


                 
34.2.1 ADXL345STM32的连接电路图

从上图可以看出,ADXL345通过三根线与STM32开发板连接,其中IIC总线时和24C02以及RDA5820共用,接在PB10PB11上面。ADXL345的两个中断输出,这里我们只用了一个,连接在STM32PF11脚,另外这里的地址线是接3.3V,所以ADXL345的地址是0X1D,转换为0X3A写入,0X3B读取。

  


34.3 软件设计

打开上一章的工程,首先在HARDWARE文件夹下新建一个ADXL345的文件夹。然后新建一个adxl345.cadxl345.h的文件保存在JOYPAD文件夹下,并将这个文件夹加入头文件包含路径。

打开adxl345.c文件,输入如下代码:

#include "adxl345.h"

#include "sys.h"

#include "delay.h"

#include "math.h"  

//初始化ADXL345.

//返回值:0,初始化成功;1,初始化失败.

u8 ADXL345_Init(void)

{                           

       IIC_Init();                                                       //初始化IIC总线 

       if(ADXL345_RD_Reg(DEVICE_ID)==0XE5)    //读取器件ID

       { 

              ADXL345_WR_Reg(DATA_FORMAT,0X2B);   

//低电平中断输出,13位全分辨率,输出数据右对齐,16g量程

              ADXL345_WR_Reg(BW_RATE,0x0A);             //数据输出速度为100Hz

              ADXL345_WR_Reg(POWER_CTL,0x28);       //链接使能,测量模式

              ADXL345_WR_Reg(INT_ENABLE,0x00);        //不使用中断        

             ADXL345_WR_Reg(OFSX,0x00);

              ADXL345_WR_Reg(OFSY,0x00);

              ADXL345_WR_Reg(OFSZ,0x00);      

              return 0;

       }                  

       return 1;                                                          

}  

//ADXL345寄存器

//addr:寄存器地址

//val:要写入的值

//返回值:

void ADXL345_WR_Reg(u8 addr,u8 val)

{

       IIC_Start();                         

       IIC_Send_Byte(ADXL_WRITE);     //发送写器件指令

       IIC_Wait_Ack();      

    IIC_Send_Byte(addr);                      //发送寄存器地址

       IIC_Wait_Ack();                                                                                        

       IIC_Send_Byte(val);                       //发送值                                

       IIC_Wait_Ack();                        

    IIC_Stop();                                        //产生一个停止条件       

}

//ADXL345寄存器

//addr:寄存器地址

//返回值:读到的值

u8 ADXL345_RD_Reg(u8 addr)        

{

       u8 temp=0;           

       IIC_Start();                         

       IIC_Send_Byte(ADXL_WRITE);  //发送写器件指令 

       temp=IIC_Wait_Ack();    

    IIC_Send_Byte(addr);               //发送寄存器地址

       temp=IIC_Wait_Ack();                                                                                             

       IIC_Start();                    //重新启动

       IIC_Send_Byte(ADXL_READ);   //发送读器件指令 

       temp=IIC_Wait_Ack();    

    temp=IIC_Read_Byte(0);             //读取一个字节,不继续再读,发送NAK                   

    IIC_Stop();                                 //产生一个停止条件        

       return temp;                         //返回读到的值

//读取ADXL的平均值

//x,y,z:读取10次后取平均值

void ADXL345_RD_Avval(short *x,short *y,short *z)

{

       short tx=0,ty=0,tz=0;       

       u8 i; 

       for(i=0;i<10;i++)

       {

              ADXL345_RD_XYZ(x,y,z);

              delay_ms(10);

              tx+=(short)*x; ty+=(short)*y; tz+=(short)*z;     

       }

       *x=tx/10; *y=ty/10; *z=tz/10;

}

//自动校准

//xval,yval,zval:x,y,z轴的校准值

void ADXL345_AUTO_Adjust(char *xval,char *yval,char *zval)

{

       short tx,ty,tz;

       u8 i;

       short offx=0,offy=0,offz=0;

       ADXL345_WR_Reg(POWER_CTL,0x00);       //先进入休眠模式.

       delay_ms(100);

       ADXL345_WR_Reg(DATA_FORMAT,0X2B);   

//低电平中断输出,13位全分辨率,输出数据右对齐,16g量程

       ADXL345_WR_Reg(BW_RATE,0x0A);             //数据输出速度为100Hz

       ADXL345_WR_Reg(POWER_CTL,0x28);       //链接使能,测量模式

       ADXL345_WR_Reg(INT_ENABLE,0x00);        //不使用中断                                     `             ADXL345_WR_Reg(OFSX,0x00);

       ADXL345_WR_Reg(OFSY,0x00);

       ADXL345_WR_Reg(OFSZ,0x00);

       delay_ms(12);

       for(i=0;i<10;i++)

       {

              ADXL345_RD_Avval(&tx,&ty,&tz);

              offx+=tx; offy+=ty; offz+=tz;

       }                

       offx/=10; offy/=10; offz/=10;

       *xval=-offx/4; *yval=-offy/4; *zval=-(offz-256)/4;

      ADXL345_WR_Reg(OFSX,*xval);

       ADXL345_WR_Reg(OFSY,*yval);

       ADXL345_WR_Reg(OFSZ,*zval);     

}

//读取3个轴的数据

//x,y,z:读取到的数据

void ADXL345_RD_XYZ(short *x,short *y,short *z)

{

       u8 buf[6],i;

       IIC_Start();                         

       IIC_Send_Byte(ADXL_WRITE);  //发送写器件指令 

       IIC_Wait_Ack();      

    IIC_Send_Byte(0x32);               //发送寄存器地址(数据缓存的起始地址为0X32)

       IIC_Wait_Ack();           

      IIC_Start();                           //重新启动

       IIC_Send_Byte(ADXL_READ);   //发送读器件指令

       IIC_Wait_Ack();

       for(i=0;i<6;i++)

       {

              if(i==5)buf=IIC_Read_Byte(0);       //读取一个字节,不继续再读,发送NACK 

              else buf=IIC_Read_Byte(1);      //读取一个字节,继续读,发送ACK

      }                       

    IIC_Stop();                                        //产生一个停止条件

       *x=(short)(((u16)buf[1]<<8)+buf[0]);            

       *y=(short)(((u16)buf[3]<<8)+buf[2]);            

       *z=(short)(((u16)buf[5]<<8)+buf[4]);           

}

//读取ADXL345的数据times,再取平均

//x,y,z:读到的数据

//times:读取多少次

void ADXL345_Read_Average(short *x,short *y,short *z,u8 times)

{

       u8 i;

       short tx,ty,tz;

       *x=0; *y=0; *z=0;

       if(times)//读取次数不为0

       {

              for(i=0;i<times;i++)//连续读取times

              {

                     ADXL345_RD_XYZ(&tx,&ty,&tz);

                     *x+=tx; *y+=ty; *z+=tz;

                     delay_ms(5);

              }

              *x/=times; *y/=times; *z/=times;

       }

}

//得到角度

//x,y,z:x,y,z方向的重力加速度分量(不需要单位,直接数值即可)

//dir:要获得的角度.0,Z轴的角度;1,X轴的角度;2,Y轴的角度.

//返回值:角度值.单位0.1°.

short ADXL345_Get_Angle(float x,float y,float z,u8 dir)

{

       float temp,res=0;

       switch(dir)

       {

              case 0://与自然Z轴的角度

                    temp=sqrt((x*x+y*y))/z;

                    res=atan(temp);

                    break;

              case 1://与自然X轴的角度

                    temp=x/sqrt((y*y+z*z));

                    res=atan(temp);

                    break;

             case 2://与自然Y轴的角度

                    temp=y/sqrt((x*x+z*z));

                    res=atan(temp);

                    break;

      }

       return res*1800/3.14;

}

该部分代码总共有8个函数,这里我们仅介绍其中4个。首先是ADXL345_Init函数,该函数用来初始化ADXL345,和前面我们提到的步骤差不多,不过本章我们而是采用查询的方式来读取数据的,所以在这里并没有开启中断。另外3个偏移寄存器,都默认设置为0

其次,我们介绍ADXL345_RD_XYZ函数,该函数用于从ADXL345读取数据,通过该函数可以读取ADXL345的转换结果,得到三个轴的加速度值(仅是数值,并没有转换单位)。

接着,我们介绍ADXL345_AUTO_Adjust函数,该函数用于ADXL345的校准,ADXL345有偏移校准的功能,该功能的详细介绍请参考ADXL345数据手册的第29页,偏移校准部分。这里我们就不细说了,如果不进行校准的话,ADXL345的读数可能会有些偏差,通过校准,我们可以讲这个偏差减少甚至消除。

最后,我们看看ADXL345_Get_Angle函数,该函数根据ADXL345的读值,转换为与自然坐标系的角度。计算公式如下:


其中AxAyAz分别代表从ADXL345读到的XYZ方向的加速度值。通过该函数,我们只需要知道三个方向的加速度值,就可以将其转换为对应的弧度值,再通过弧度角度转换,就可以得到角度值了。

其他函数,我们就不介绍了,也比较简单。保存adxl345.c,然后把该文件加入HARDWARE组下。接下来打开adxl345.h在该文件里面加入如下代码:

#ifndef __ADXL345_H

#define __ADXL345_H

#include "myiic.h"  

#define DEVICE_ID            0X00      //器件ID,0XE5

#define THRESH_TAP         0X1D          //敲击阀值

……省略部分寄存器定义

#define FIFO_STATUS         0X39

 

//0X0B TO OX1F Factory Reserved    

//如果ALT ADDRESS(12)接地,IIC地址为0X53(不包含最低位).

//如果接V3.3,IIC地址为0X1D(不包含最低位).

//开发板接V3.3,所以转为读写地址后,0X3B0X3A(如果接GND,则为0XA70XA6) 

#define ADXL_READ    0X3B

#define ADXL_WRITE   0X3A

u8 ADXL345_Init(void);                                                              //初始化ADXL345

void ADXL345_WR_Reg(u8 addr,u8 val);                                      //ADXL345寄存器

u8 ADXL345_RD_Reg(u8 addr);                                                   //ADXL345寄存器

void ADXL345_RD_XYZ(short *x,short *y,short *z);                      //读取一次值

void ADXL345_RD_Avval(short *x,short *y,short *z);                    //读取平均值

void ADXL345_AUTO_Adjust(char *xval,char *yval,char *zval);     //自动校准

void ADXL345_Read_Average(short *x,short *y,short *z,u8 times);//连续读取times,取平均

short ADXL345_Get_Angle(float x,float y,float z,u8 dir);

#endif

上面的代码省略了部分寄存器的定义,其他部分比较简单,我们不作介绍。保存adxl345.h,然后在test.c里面修改代码如下:

//x,y:开始显示的坐标位置

//num:要显示的数据

//mode:0,显示加速度值;1,显示角度值;

void Adxl_Show_Num(u16 x,u16 y,short num,u8 mode)

{

       if(mode==0)   //显示加速度值

       {

              if(num<0)

              {

                     LCD_ShowChar(x,y,'-',16,0);               //显示负号

                     num=-num;                                       //转为正数

              }else LCD_ShowChar(x,y,' ',16,0);                     //去掉负号

              LCD_ShowNum(x+8,y,num,4,16);                     //显示值            

      }else             //显示角度值

       {

              if(num<0)

              {

                     LCD_ShowChar(x,y,'-',16,0);               //显示负号

                     num=-num;                                       //转为正数

              }else LCD_ShowChar(x,y,' ',16,0);                     //去掉负号

             LCD_ShowNum(x+8,y,num/10,2,16);         //显示整数部分               

              LCD_ShowChar(x+24,y,'.',16,0);                //显示小数点

              LCD_ShowNum(x+32,y,num%10,1,16);     //显示小数部分               

       }

}                                                          

int main(void)

{           

       u8 key;

       u8 t=0;   

       short x,y,z;        

       short angx,angy,angz;      

      Stm32_Clock_Init(9);           //系统时钟设置

       uart_init(72,9600);             //串口初始化为9600

       delay_init(72);                         //延时初始化

       LED_Init();                        //初始化与LED连接的硬件接口

       LCD_Init();                       //初始化LCD

       usmart_dev.init(72);             //初始化USMART       

      KEY_Init();                         //按键初始化

       POINT_COLOR=RED;//设置字体为红色

       LCD_ShowString(60,50,200,16,16,"WarShip STM32");   

       LCD_ShowString(60,70,200,16,16,"3D TEST");

       LCD_ShowString(60,90,200,16,16,"ATOM@ALIENTEK");

       LCD_ShowString(60,110,200,16,16,"2012/9/12");

      LCD_ShowString(60,130,200,16,16,"KEY0:Auto Adjust");

      while(ADXL345_Init()) //3D加速度传感器初始化   

       {

              LCD_ShowString(60,150,200,16,16,"ADXL345 Error");

              delay_ms(200);

              LCD_Fill(60,150,239,150+16,WHITE);

             delay_ms(200);

       }                                                        

       LCD_ShowString(60,150,200,16,16,"ADXL345 OK");

      LCD_ShowString(60,170,200,16,16,"X VAL:");

       LCD_ShowString(60,190,200,16,16,"Y VAL:");

       LCD_ShowString(60,210,200,16,16,"Z VAL:");

      LCD_ShowString(60,230,200,16,16,"X ANG:");

       LCD_ShowString(60,250,200,16,16,"Y ANG:");

       LCD_ShowString(60,270,200,16,16,"Z ANG:");

       POINT_COLOR=BLUE;//设置字体为红色

       while(1)

       {                      

             if(t%10==0)//100ms读取一次

              {

                     //得到X,Y,Z轴的加速度值(原始值)

                     ADXL345_Read_Average(&x,&y,&z,10);   //读取X,Y,Z三个方向的加速度值

                     Adxl_Show_Num(60+48,170,x,0);             //显示加速度原始值

                     Adxl_Show_Num(60+48,190,y,0);

                     Adxl_Show_Num(60+48,210,z,0);

                    //得到角度值,并显示

                     angx=ADXL345_Get_Angle(x,y,z,1);   

                     angy=ADXL345_Get_Angle(x,y,z,2);  

                     angz=ADXL345_Get_Angle(x,y,z,0);

                     Adxl_Show_Num(60+48,230,angx,1);        //显示角度值

                     Adxl_Show_Num(60+48,250,angy,1);

                     Adxl_Show_Num(60+48,270,angz,1);

              }

              key=KEY_Scan(0);

              if(key==KEY_UP)

              {

                     LED1=0;//绿灯亮,提示校准中

                     ADXL345_AUTO_Adjust((char*)&x,(char*)&y,(char*)&z);//自动校准

                     LED1=1;//绿灯灭,提示校准完成

              }

             delay_ms(10);

              t++;

              if(t==20)

              {

                     t=0;

                     LED0=!LED0;

              }

       }

}

此部分代码除了main函数,还有一个Adxl_Show_Num函数,该函数用于数据显示,因为在ILI93xx.c里面,没有提供可以显示小数和负数的函数,所以我们这里编写了该函数,来实现小数和负数的显示,以满足本章要求。

其他部分,我们就不多说了。至此,我们的软件设计部分就结束了。

34.4 下载验证

在代码编译成功之后,我们通过下载代码到ALIENTEK战舰STM32开发板上,可以看到LCD显示如图34.4.1所示的内容:


34.4.1 程序运行时LCD显示内容

可以看到,X方向和Z方向的角度有些大(最佳值是0),所以我们按下WK_UP键,进行一次校准(注意校准的时候保持开发板水平,并且稳定),校准后如图34.4.2所示:


34.4.2 校准后

可以看到,校准后,比未校准前好了很多,此时我们移动开发板到不同角度,可以看到XYZ的数值和角度也跟着变化。      

《STM32开发指南》第三十四章 ADXL345三轴加速度传感器实验.rar

660.12 KB, 下载次数: 5440

实验29 三轴加速度传感器实验.rar

153.39 KB, 下载次数: 5647

我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2013-7-10 21:09:59 | 显示全部楼层
有加速度,就有对应方向的值可以读出来.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 0 反对 1

使用道具 举报

3

主题

6

帖子

0

精华

初级会员

Rank: 2

积分
51
金钱
51
注册时间
2012-7-7
在线时间
3 小时
发表于 2013-3-23 11:22:13 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

10

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2013-3-22
在线时间
3 小时
发表于 2013-3-24 12:32:36 | 显示全部楼层
谢谢大哥
回复 支持 反对

使用道具 举报

54

主题

537

帖子

0

精华

高级会员

Rank: 4

积分
797
金钱
797
注册时间
2012-2-27
在线时间
7 小时
发表于 2013-3-24 12:39:01 | 显示全部楼层
回复【楼主位】正点原子:
---------------------------------
原子有没有搞过加速计+地磁+陀螺仪的姿态数据融合
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2013-3-24 13:47:08 | 显示全部楼层
没哦
回复 支持 反对

使用道具 举报

29

主题

311

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1530
金钱
1530
注册时间
2012-9-4
在线时间
262 小时
发表于 2013-7-10 16:14:42 | 显示全部楼层
回复【5楼】正点原子:
---------------------------------
原子哥啊,我想问,我如果用你这个程序,把ADXL345放在桌子上平移,会是什么数据输出呢????就平移,不倾斜。。。。
STM32---STM32---STM32---STM32---STM32---STM32---STM32---STM32---STM32
回复 支持 反对

使用道具 举报

29

主题

311

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1530
金钱
1530
注册时间
2012-9-4
在线时间
262 小时
发表于 2013-7-10 23:52:51 | 显示全部楼层
回复【7楼】正点原子:
-------------------------------
原子哥,你是有试过的是吧???如果只平移的话,你测出来的上面三个量是变化的喽???
STM32---STM32---STM32---STM32---STM32---STM32---STM32---STM32---STM32
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2013-7-11 00:19:26 | 显示全部楼层
2个变化。Z方向不会变化。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

29

主题

311

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1530
金钱
1530
注册时间
2012-9-4
在线时间
262 小时
发表于 2013-7-11 09:19:42 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
那你接PF11的那个INT1中断在程序中起什么作用啊,我在程序中都没找到哪用了PF11??
原子哥点个回复,我好看啊。。。。。。。。嘿嘿
STM32---STM32---STM32---STM32---STM32---STM32---STM32---STM32---STM32
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2013-7-11 10:36:49 | 显示全部楼层
回复【10楼】aben:
---------------------------------
没用到.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

4

帖子

0

精华

新手入门

积分
28
金钱
28
注册时间
2012-11-20
在线时间
0 小时
发表于 2013-7-29 08:24:28 | 显示全部楼层
顶起
回复 支持 反对

使用道具 举报

2

主题

21

帖子

0

精华

新手上路

积分
49
金钱
49
注册时间
2013-8-7
在线时间
0 小时
发表于 2013-8-30 16:27:47 | 显示全部楼层
原子哥,我把例程改为串口输出的,还改了地址,结果出来的角度值怎么都不会大于25度,怎么回事啊
回复 支持 反对

使用道具 举报

11

主题

94

帖子

0

精华

初级会员

Rank: 2

积分
158
金钱
158
注册时间
2012-9-25
在线时间
0 小时
发表于 2013-8-30 16:31:43 | 显示全部楼层
顶一个!
回复 支持 反对

使用道具 举报

3

主题

14

帖子

0

精华

新手上路

积分
46
金钱
46
注册时间
2013-9-14
在线时间
0 小时
发表于 2013-10-10 16:40:22 | 显示全部楼层
原子哥 弧度数转角度时不是要乘以180/Pi的吗,但是我看到你的程序里写的是 return res*1800/3.14  不明白,求解释.....
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2013-10-10 23:25:48 | 显示全部楼层
回复【15楼】hailin_3:
---------------------------------
按你的想法去验证。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

56

主题

289

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2012-11-16
在线时间
65 小时
发表于 2013-10-20 16:11:30 | 显示全部楼层

ADXL345_WR_Reg(DATA_FORMAT,0X2B);   

//低电平中断输出,13位全分辨率,输出数据右对齐,16g量程
原子老师,我感觉没用到什么低电平中断输出???

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2013-10-20 16:51:37 | 显示全部楼层
回复【17楼】一般BDN:
---------------------------------
我们例程没用中断的...
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

56

主题

289

帖子

0

精华

高级会员

Rank: 4

积分
865
金钱
865
注册时间
2012-11-16
在线时间
65 小时
发表于 2013-10-20 17:22:09 | 显示全部楼层
那为什么还要设置低电平中断输出
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2013-10-20 20:31:00 | 显示全部楼层
回复【19楼】一般BDN:
---------------------------------
不影响.
你觉得不妥,去掉吧.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

9

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2013-7-6
在线时间
0 小时
发表于 2013-11-18 20:17:35 | 显示全部楼层
原子哥  我想把adxl345移植到k60中去   但是移植以后发现初始化都无法成功  我觉得是硬件连接的问题 vcc+5V  GND  SCL SDA +3.3 VS .CS .SD0 .INT1 INT2  这些脚哪些是要用到的 我是按照你的例程移植的 IIC通讯的 能解释一下吗@正点原子
回复 支持 反对

使用道具 举报

9

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2013-7-6
在线时间
0 小时
发表于 2013-11-18 20:17:51 | 显示全部楼层
回复【20楼】正点原子:

回复【19楼】一般BDN:
---------------------------------
不影响.
你觉得不妥,去掉吧.

---------------------------------
原子哥  我想把adxl345移植到k60中去   但是移植以后发现初始化都无法成功  我觉得是硬件连接的问题 vcc+5V  GND  SCL SDA +3.3 VS .CS .SD0 .INT1 INT2  这些脚哪些是要用到的 我是按照你的例程移植的 IIC通讯的 能解释一下吗@正点原子
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2013-11-19 11:02:21 | 显示全部楼层
接电源,IIC,就可以了
你参考下我们的硬件。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

11

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2014-1-3
在线时间
0 小时
发表于 2014-1-6 22:38:40 | 显示全部楼层
原子哥,我把你的程序写成自己的模块了,还是战舰的板子,感觉频率快了好多,为什么呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2014-1-7 00:12:43 | 显示全部楼层
回复【24楼】jidian0177:
---------------------------------
频率快好多是指?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

11

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2014-1-3
在线时间
0 小时
发表于 2014-1-7 09:04:34 | 显示全部楼层
回复【25楼】正点原子:
---------------------------------
TFT上角度改变比之前快了很多
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2014-1-7 14:37:36 | 显示全部楼层
那是你读取速度快了吧?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

11

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2014-1-3
在线时间
0 小时
发表于 2014-1-7 16:00:44 | 显示全部楼层
程序我几乎没改啊
回复 支持 反对

使用道具 举报

0

主题

14

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2013-12-6
在线时间
0 小时
发表于 2014-5-29 11:12:04 | 显示全部楼层
回复【4楼】wwjdwy:
---------------------------------
我公司有个项目在做 我在学习怎么融合 做成电子罗盘的
回复 支持 反对

使用道具 举报

0

主题

14

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2013-12-6
在线时间
0 小时
发表于 2014-5-29 11:13:16 | 显示全部楼层
回复【8楼】aben:
---------------------------------
平移时候不变 加速度没有分量  没有角度变化 所以没有变化
回复 支持 反对

使用道具 举报

0

主题

14

帖子

0

精华

新手上路

积分
34
金钱
34
注册时间
2013-12-6
在线时间
0 小时
发表于 2014-5-30 11:26:32 | 显示全部楼层
回复【15楼】hailin_3:
---------------------------------
先扩大10倍 后来显示函数在main函数里面显示整数和小数缩小10倍 所以正常显示
回复 支持 反对

使用道具 举报

8

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2014-5-15
在线时间
8 小时
发表于 2014-6-24 16:18:43 | 显示全部楼层
回复【27楼】正点原子:
---------------------------------
原子哥我最近在做这个三轴重力加速度实验我有几个问题想请教一下你:
1.那个最后下载验证的显示中x,y,z val后面的值代表是什么意思,例程中是说为重力加速度初始值,这是指从ADXL345读出来的初始值吗?然后怎样把它转换成正常的加速度显示值呢?就是从void ADXL345_RD_XYZ(short *x,short *y,short *z);这里读出的
        *x=(short)(((u16)buf[1]<<8)+buf[0]);      
*y=(short)(((u16)buf[3]<<8)+buf[2]);      
*z=(short)(((u16)buf[5]<<8)+buf[4]);
这个x,y,z的16位变量存的值每位是代表什么意思,我在哪儿可以了解到呢?我们好像只用到这16位的最后四位,并把它显示在x,y,z的val中。
2.就是这个程序可以实时显示角度的变化吗?怎么好像不能即时显示呢,必须重新复位检测一下,才能显示此刻的角度值是吗?
回复 支持 反对

使用道具 举报

8

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2014-5-15
在线时间
8 小时
发表于 2014-6-24 17:25:08 | 显示全部楼层
回复【32楼】whut-showming:
---------------------------------
原子大哥第二个问题已经解决了,是我程序有些问题,是可以实时更新的,帮忙解答一下第一个问题,谢谢!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2014-6-24 23:11:32 | 显示全部楼层
回复【33楼】whut-showming:
---------------------------------
我们函数有注释吧?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

8

主题

72

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2014-5-15
在线时间
8 小时
发表于 2014-6-25 09:30:52 | 显示全部楼层
回复【34楼】正点原子:
---------------------------------
回复【34楼】正点原子:
---------------------------------
关于这个加速度初始值没有注释,我就想了解一下这个加速度初始值的这几位数值是代表什么意思,看不出它是加速度呢,因为哪有这么大,好几百呢。
哦,还有,原子哥,你头像哪儿找的啊,可不可以共享一下?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2014-6-25 22:55:10 | 显示全部楼层
回复【35楼】whut-showming:
---------------------------------
这就是读到的三轴加速度,三个方向的值.
是原始的寄存器值.
要根据你设置的量程,来转换才可以求得加速度值(单位:g)
但是我们例程,只是用来测量角度,不需要转换成标准的g单位,直接拿原始数据计算即可.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2014-5-31
在线时间
8 小时
发表于 2014-9-12 11:11:29 | 显示全部楼层
回复【36楼】正点原子:
---------------------------------
原子哥你好。函数void ADXL345_RD_XYZ(short *x,short *y,short *z)中有一点我没有理解到,就是:IIC_Send_Byte(0x32); 这条语句只发送了DATAX0寄存器的地址,为啥后面不用发 DATAX1、DATAY0、DATAY1、DATAZ0和DATAZ1的地址就读出了它们的值了。我看到你有条注释语句:(数据缓存的起始地址为0X32)。意思好像是说地址0x32~0x37在一个数据缓冲区里,发了地址0x32读出数据后地址会自加接着读出后面的5个数据,不晓得我理解对了没有!     
麻烦你了原子哥!
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2014-9-12 23:56:06 | 显示全部楼层
回复【37楼】阿Q小狗:
---------------------------------
支持连读。地址自增,所以不用发了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

5

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
134
金钱
134
注册时间
2014-5-31
在线时间
8 小时
发表于 2014-9-13 09:31:13 | 显示全部楼层
回复【38楼】正点原子:
---------------------------------
太感谢了,原子哥,半夜12点了,你都还在为我解答问题。原子哥真的是太感谢了!
原子哥很期待你的F4板子,还有17天就10月份了,有点急不可待了!!
回复 支持 反对

使用道具 举报

17

主题

102

帖子

0

精华

初级会员

Rank: 2

积分
191
金钱
191
注册时间
2014-10-14
在线时间
0 小时
发表于 2014-11-15 13:46:07 | 显示全部楼层
原子哥,我买了一个ADXL345的模块,代码用的战舰开发部的代码,可是输出的XYZ轴都偏大,静制的时候Z轴原始数据居然达到了1800,按道理应该是256,网上有很多人有同样问题,但都没解决,请问原子哥这是什么原因?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
 楼主| 发表于 2014-11-15 23:25:03 | 显示全部楼层
回复【40楼】名侦探:
---------------------------------
这个没遇到过。。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

15

主题

181

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
389
金钱
389
注册时间
2014-11-8
在线时间
40 小时
发表于 2015-1-19 18:04:41 | 显示全部楼层
回复【33楼】whut-showming:
---------------------------------
您明白了吗?我初学,也是这不明白如何将寄存器的原始值转换为加速度值,您能帮我解释一下吗?
Good good study , day day up...
回复 支持 反对

使用道具 举报

1

主题

43

帖子

0

精华

初级会员

Rank: 2

积分
131
金钱
131
注册时间
2015-8-26
在线时间
20 小时
发表于 2015-8-26 13:41:11 | 显示全部楼层
拜读!
多谢!
学以致用!
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

初级会员

Rank: 2

积分
141
金钱
141
注册时间
2015-11-6
在线时间
19 小时
发表于 2016-3-13 11:05:44 | 显示全部楼层
原子哥你这章ADXL345的实验有对应的视频吗?我没有找到,能不能给我个链接,麻烦你了
回复 支持 反对

使用道具 举报

3

主题

18

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2016-4-26
在线时间
12 小时
发表于 2016-4-26 21:18:29 | 显示全部楼层
有人知道那个PF11是做什么用的吗啊?我知道那个是中断 可是程序里没用到呀
回复 支持 反对

使用道具 举报

3

主题

18

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2016-4-26
在线时间
12 小时
发表于 2016-4-28 20:01:35 | 显示全部楼层
为什么我的初始化都过不了
回复 支持 反对

使用道具 举报

3

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2016-6-30
在线时间
16 小时
发表于 2016-7-21 12:05:00 | 显示全部楼层
aben 发表于 2013-7-10 16:14
回复【5楼】正点原子:
---------------------------------
原子哥啊,我想问,我如果用你这个程序,把ADXL3 ...

平放的话 z轴应该不会变
回复 支持 反对

使用道具 举报

2

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2016-7-21
在线时间
6 小时
发表于 2016-7-26 09:16:52 | 显示全部楼层
名侦探 发表于 2014-11-15 13:46
原子哥,我买了一个ADXL345的模块,代码用的战舰开发部的代码,可是输出的XYZ轴都偏大,静制的时候Z轴原始 ...

请问,你的问题解决了吗
回复 支持 反对

使用道具 举报

7

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2016-7-21
在线时间
8 小时
发表于 2016-8-2 11:39:51 | 显示全部楼层
若用中断方式读取,该怎么做呢,我的程序一直进不去中断,帮帮忙
回复 支持 反对

使用道具 举报

7

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2016-7-21
在线时间
8 小时
发表于 2016-8-2 11:40:42 | 显示全部楼层
nana 发表于 2016-8-2 11:39
若用中断方式读取,该怎么做呢,我的程序一直进不去中断,帮帮忙

拜托了
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-25 05:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表