零死角玩转stm中级篇重力感应三轴加速MMA资料下载.pdf

上传人:wj 文档编号:5983116 上传时间:2023-05-05 格式:PDF 页数:16 大小:1.16MB
下载 相关 举报
零死角玩转stm中级篇重力感应三轴加速MMA资料下载.pdf_第1页
第1页 / 共16页
零死角玩转stm中级篇重力感应三轴加速MMA资料下载.pdf_第2页
第2页 / 共16页
零死角玩转stm中级篇重力感应三轴加速MMA资料下载.pdf_第3页
第3页 / 共16页
零死角玩转stm中级篇重力感应三轴加速MMA资料下载.pdf_第4页
第4页 / 共16页
零死角玩转stm中级篇重力感应三轴加速MMA资料下载.pdf_第5页
第5页 / 共16页
零死角玩转stm中级篇重力感应三轴加速MMA资料下载.pdf_第6页
第6页 / 共16页
零死角玩转stm中级篇重力感应三轴加速MMA资料下载.pdf_第7页
第7页 / 共16页
零死角玩转stm中级篇重力感应三轴加速MMA资料下载.pdf_第8页
第8页 / 共16页
零死角玩转stm中级篇重力感应三轴加速MMA资料下载.pdf_第9页
第9页 / 共16页
零死角玩转stm中级篇重力感应三轴加速MMA资料下载.pdf_第10页
第10页 / 共16页
零死角玩转stm中级篇重力感应三轴加速MMA资料下载.pdf_第11页
第11页 / 共16页
零死角玩转stm中级篇重力感应三轴加速MMA资料下载.pdf_第12页
第12页 / 共16页
零死角玩转stm中级篇重力感应三轴加速MMA资料下载.pdf_第13页
第13页 / 共16页
零死角玩转stm中级篇重力感应三轴加速MMA资料下载.pdf_第14页
第14页 / 共16页
零死角玩转stm中级篇重力感应三轴加速MMA资料下载.pdf_第15页
第15页 / 共16页
零死角玩转stm中级篇重力感应三轴加速MMA资料下载.pdf_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

零死角玩转stm中级篇重力感应三轴加速MMA资料下载.pdf

《零死角玩转stm中级篇重力感应三轴加速MMA资料下载.pdf》由会员分享,可在线阅读,更多相关《零死角玩转stm中级篇重力感应三轴加速MMA资料下载.pdf(16页珍藏版)》请在冰点文库上搜索。

零死角玩转stm中级篇重力感应三轴加速MMA资料下载.pdf

1.*2.*函数名:

main3.*描述:

主函数4.*输入:

无-第5页-5.*输出:

无6.*返回:

无7.*/8.intmain(void)9.10./*配置系统时钟为72M*/11.SystemInit();

12.13./*串口1初始化*/14.USART1_Config();

15.16./*重力传感器初始化*/17.I2C_MMA_Init();

18.19./*重力传感器校准*/20.I2C_MMA_Cal();

21.22.printf(rn-这是一个重力传感器测试程序-rn);

23.24.25./*检测倾角*/26.I2C_MMA_Test(&

X_Value);

27.I2C_MMA_Test(&

Y_Value);

28.I2C_MMA_Test(&

Z_Value);

29.30.printf(rn-X方向的数据-rn);

31.I2C_MMA_Printf(&

32.33.printf(rn-Y方向的数据-rn);

34.I2C_MMA_Printf(&

35.36.printf(rn-Z方向的数据-rn);

37.I2C_MMA_Printf(&

38.39./*进入省电模式*/40.if(I2C_MMA_Standby()=SUCCESS)41.42.printf(rnAccelerationenterstandbymode!

rn);

43.else44.printf(rnStandbymodeERROR!

45.46.系统库函数SystemInit();

将系统时钟设置为72M,USART1_Config();

配置串口,关于这两个函数的具体讲解可以参考前面的教程,这里不再详述。

1./*2.*函数名:

I2C_MMA_Init3.*描述:

I2C外设(MMA7455)初始化4.*输入:

无5.*输出:

无6.*调用:

外部调用7.*/8.voidI2C_MMA_Init(void)9.10.I2C_GPIO_Config();

11.I2C_Mode_Config();

12.-第6页-I2C_MMA_Init();

是用户编写的函数,其中调用了I2C_GPIO_Config();

配置好I2C所用的I/O端口,调用I2C_Mode_Configu();

设置I2C的工作模式,并使能相关外设的时钟。

I2C_MMA_Cal()函数是用来校正传感器的,校正需要先测量原始数据,我们先看I2C_MMA_Test()函数1./*2.*函数名:

I2C_MMA_Test3.*描述:

测量倾角和加速度(量程0-2g)4.*输入:

数据结构体的指针5.*输出:

外部调用7.*/8.voidI2C_MMA_Test(MMA_Dat*MMA_Value)9.10.u8temp;

11.12./*MMA进入2g量程测试模式*/13.I2C_MMA_ByteWrite(0x05,MMA_MCTL_Addr);

14.15./*DRDY标置位,等待测试完毕*/16.while(!

(I2C_MMA_ByteRead(MMA_STATUS_Addr)&

0x01);

17.18./*读取测得的数据*/19.MMA_Value-Out=I2C_MMA_ByteRead(MMA_Value-Addr);

20.21.if(MMA_Value-Out&

0x80)=0x00)/*读出的原始值为正数*/22.23.temp=MMA_Value-Out;

24.25./*将原始值转换为加速度,乘以-1为方向处理*/26.MMA_Value-Acc=(float)(-1)*temp*ACC_Gravity/64;

27.28./*将原始值转换为角度*/29.if(temp=64)30./*加速度值大于1g*/31.MMA_Value-Angle=90.0;

32.33.else34./*加速度小于1g,Angle=asin(Acc/9.8)*57.32;

弧度制转换57.32=180/3.14*/35.MMA_Value-Angle=asin(float)temp/64)*57.32;

36.37.38./*读出的原始值为负数*/39.else40.41.temp=MMA_Value-Out;

42.43./*二补码转换*/44.temp-=1;

45.temp=temp;

46.47./*将原始值转换为加速度*/48.MMA_Value-Acc=(float)temp*ACC_Gravity/64;

49.50./*将原始值转换为角度,乘以-1为方向处理*/51.if(temp=64)52.MMA_Value-Angle=-90.0;

53.else54./*Angle=asin(Acc/9.8)*57.32*/55.MMA_Value-Angle=(-1)*asin(float)temp/64)*57.32;

-第7页-56.57.这个函数调用了I2C_MMA_ByteWrite(),以下是函数原型:

I2C_MMA_ByteWrite3.*描述:

写一个字节到I2CMMA寄存器中4.*输入:

-pBuffer缓冲区指针5.*-WriteAddr接收数据的MMA寄存器的地址6.*输出:

无7.*返回:

无8.*调用:

内部调用9.*/10.staticvoidI2C_MMA_ByteWrite(u8pBuffer,u8WriteAddr)11.12./*waituntilI2Cbusisnotbusy*/13.while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY);

14.15./*SendSTARTcondition*/16.I2C_GenerateSTART(I2C1,ENABLE);

17.18./*TestonEV5andclearit*/19.while(!

I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT);

20.21./*SendMMAaddressforwrite*/22.I2C_Send7bitAddress(I2C1,MMA_ADRESS,I2C_Direction_Transmitter);

23.24./*TestonEV6andclearit*/25.while(!

I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);

26.27./*SendtheMMAsRegisteraddresstowriteto*/28.I2C_SendData(I2C1,WriteAddr);

29.30./*TestonEV8andclearit*/31.while(!

I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED);

32.33./*Sendthebytetobewritten*/34.I2C_SendData(I2C1,pBuffer);

35.36./*TestonEV8andclearit*/37.while(!

38.39./*SendSTOPcondition*/40.I2C_GenerateSTOP(I2C1,ENABLE);

41.42.这与EEPROM的I2C_EE_PageWrite()函数很类似,第一个参数为要写入的数值,第二个参数为待写入寄存器的地址。

这些寄存器的地址在I2C_MMA.h文件中都有宏定义。

其中要强调的地方方是MMA7455的器件地址(分清器件地址与寄存器地址的区别哦!

),在MMA7455的DataSheet中查到的器件地址为0X1D,但这个地址是不正确的,与野火使用的这块芯片有区别,市面上的传感器一般这个器件地址也为0x3A。

-第8页-在用Jlink调试程序的时候,程序循环运行在第25行就可以知道是器件地址出了问题,其它通讯的错误也可以用这样的方式查找出来,省了示波器_。

I2C_MMA_ByteRead()类似,功能是读取寄存器的值,就不分析了。

回到I2C_MMA_Test()函数中,I2C_MMA_Test()的第13行代码是向MMA7455写入命令,开启2g转换模式,开启了检测模式后,通过查询MMA7455的DRDY位,等待MMA7455的加速度转化完成。

以下为DataSheet的说明,附上野火的注释:

截图来自MMA7455L转化完成后根据传入的参数,把相应的MMA7455数据寄存器中的数据读取出来,各个方向的原始数据储存在相应的结构体的.Out变量中:

1.typedefstruct2.3.uc8Addr;

/寄存器的地址4.uc8Name;

/数据的方向,X,Y或Z5.s8Out;

/寄存器的值6.floatAcc;

/加速度值7.floatAngle;

/角度值8.MMA_Dat;

在结构体初始化的时候把寄存器的地址和名称定义好了:

-第9页-1./*/2.MMA_DatX_Value=MMA_XOUT8_Addr,X;

3.MMA_DatY_Value=MMA_YOUT8_Addr,Y;

4.MMA_DatZ_Value=MMA_ZOUT8_Addr,Z;

要注意的是MMA7455中的数据以二补数的形式来储存:

截图来自MMA7455L把二补数转换为原码后就可以像处理ADC的数据一样了,我们选择的是2g量程,敏感度为:

64LSB/g。

至于角度的计算公式,把重力加速度按各方向的分解,可以推导出来。

计算出来的加速度或角度乘以-1是野火根据传感器上标注的箭头的方向,并以此为正方向进行调整的,不同的厂家生产的传感器稍有区别。

下图是以X方向输出的角度为例:

-第10页-输出的角度为各箭头方向的直线与水平面间的夹角,在水平面上方为正,下方为负。

接下来分析一下校准函数:

I2C_MMA_Cal3.*描述:

MMA7455校准4.*输入:

外部调用,在初始化后调用7.*/8.voidI2C_MMA_Cal(void)9.10.I2C_MMA_ByteWrite(0x00,MMA_YOFFL_Addr);

/*校正x值00*/11.I2C_MMA_ByteWrite(0x30,MMA_YOFFL_Addr);

/*校正y值48*/12.I2C_MMA_ByteWrite(0xE2,MMA_ZOFFL_Addr);

/*校正Z值-30的补码*/13.I2C_MMA_ByteWrite(0xFF,MMA_ZOFFH_Addr);

/*校正Z值,校正值为负数,要把高位写1;

*/14.I2C_MMA_Cal()函数是用来校正传感器的,称为0g校准。

这个函数在第一次测量前必须调用,而且每个传感器的校正值都有不同,其中的校正参数就要大家亲手去调试出来啦。

参照DataSheetAN3745按以下步骤校准:

1.把传感器按水平方式放置,读取各方向寄存器输出值。

这个情况下,Z轴方向标准输出应为1g,X轴和Y轴均为0。

对应到各个寄存器的原始数据就应是ZOUT8=64,XOUT8=0,YOUT8=0。

但是未校准前,各个寄存器的输出会有一定的偏差。

-第11页-以下为传感器水平放置,野火的例程中未校准得出的数据2.向相应的OffSet寄存器写入校准值:

要注意两个问题。

一是校准寄存器中的值为1/2LSB,所以我们写入的值要相应地乘以2倍:

XOUT8很标准,不用写入校准值,或向XOFFL写入0;

YOUT8输出为-19,所以应YOFFL写入38=2*19;

ZOUT8输出为75,所以应写入-22=2*(64-75);

-第12页-截图来自MMA7455L当校准值要写入负数时,要注意第二个问题:

就是在MMA7455寄存器中数值是以补码的形式储存的,所以实际写入的数据要经过转化:

-22的补码为0xEA。

但是,向ZOFFL写入0xEA还是未能校准,因为校准寄存器的还有高8位,高8位必须全写入1才是-22的补码,所以还要向ZOFFH写入0xff。

选取恰当的校准值往往要经过多次的检测,为了提高准确度,就辛苦一点吧。

最后讲解一下Standby模式,只要向MCTL寄存器写入0x04命令就可进入Standby模式,这时传感器不工作,功耗大大降低:

I2C_MMA_Standby3.*描述:

重力传感器进入Standby模式,省电4.*输入:

是否成功进入Standby模式7.*调用:

外部调用8.*/9.u8I2C_MMA_Standby(void)10.11.u8MMA_Test;

12.13./*MMAStandbyMode*/14.I2C_MMA_ByteWrite(0x04,MMA_MCTL_Addr);

15.16./*MMA_Test*/17.MMA_Test=I2C_MMA_ByteRead(MMA_MCTL_Addr);

18.19.if(MMA_Test=0x04)20.returnSUCCESS;

21.else22.returnERROR;

23.-第13页-10.4实验现象实验现象很多第一次使用加速度传感器的人都会被它的方向弄糊涂,以下为传感器分别按DataSheet的这图3,图4,图5,三个个方向来放置时没得的数据。

注释中的各个XYZ轴的方向为野火使用的传感器上标注的箭头方向,设为正方向。

将野火STM32开发板供电(DC5V),插上JLINK。

截图来自MMA7455L-第14页-按图2方向放置-第15页-按图3方向放置-第16页-

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2