零死角玩转stm中级篇重力感应三轴加速MMA.pdf
- 文档编号:3210709
- 上传时间:2022-11-20
- 格式:PDF
- 页数:16
- 大小:1.16MB
零死角玩转stm中级篇重力感应三轴加速MMA.pdf
《零死角玩转stm中级篇重力感应三轴加速MMA.pdf》由会员分享,可在线阅读,更多相关《零死角玩转stm中级篇重力感应三轴加速MMA.pdf(16页珍藏版)》请在冰豆网上搜索。
-第2页-00、友情提示、友情提示零死角玩转零死角玩转STM32系列教程由初级篇初级篇、中级篇中级篇、高级篇高级篇、系统篇、系统篇、四个部分组成,根据野火STM32开发板旧版教程升级而来,且经过重新深入编写,重新排版,更适合初学者,步步为营,从入门到精通,从裸奔到系统,让您零死角玩转STM32。
M3的世界,与野火同行,乐意惬无边。
另外,野火团队历时一年精心打造的STM32库开发实战指南库开发实战指南将于今年10月份由机械工业出版社机械工业出版社出版,该书的排版更适于纸质书本阅读以及更有利于查阅资料。
内容上会给你带来更多的惊喜。
是一本学习STM32必备的工具书。
敬请期待!
-第3页-1010、重力感应重力感应/三轴加速(三轴加速(MMA7455MMA7455)10.1实验描述及工程文件清单实验描述及工程文件清单实验描述实验描述控制倾角传感器(MMA7455)测量加速度和倾角,通过串口打印测量得的数据。
硬件连接硬件连接PB6-I2C1_SCLPB7-I2C1_SDA用到的库文件用到的库文件startup/start_stm32f10x_hd.cCMSIS/core_cm3.cCMSIS/system_stm32f10x.cFWlib/stm32f10x_gpio.cFWlib/stm32f10x_rcc.cFWlib/stm32f10x_usart.cFWlib/stm32f10x_i2c.c用户编写的文件用户编写的文件USER/main.cUSER/stm32f10x_it.cUSER/usart1.cUSER/I2C_MMA.c在这个加速度传感器例程中野火采用使用了集成模块,只需要把模块的电源线和SDA,SCL端口连接到开发板上的I2C总线即可。
EEPROM的也使用了I2C总线,所以可以参照EEPROM的件原理图。
-第4页-野火STM32开发板2.4G无线模块接口图:
10.2MMA7455简介简介MMA7455是一款数字三轴加速度传感器,可以利用测量出来的重力加速度在某方向上的分量来计算器件与水平面间的夹角,测量倾角是很多有趣应用的基础。
本实验采用I2C方式与传感器通讯,控制传感器用2g的量程。
在测量前对传感器进行校准。
10.3代码分析代码分析首先要添加用的库文件,在工程文件夹下Fwlib下我们需添加以下库文件:
1.stm32f10x_gpio.c2.stm32f10x_rcc.c3.stm32f10x_usart.c4.stm32f10x_i2c.c还要在stm32f10x_conf.h中把相应的头文件添加进来:
1.#includestm32f10x_gpio.h2.#includestm32f10x_i2c.h3.#includestm32f10x_rcc.h4.#includestm32f10x_usart.h配置好所需的库文件之后,我们就从main函数开始分析:
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(&X_Value);32.33.printf(rn-Y方向的数据-rn);34.I2C_MMA_Printf(&Y_Value);35.36.printf(rn-Z方向的数据-rn);37.I2C_MMA_Printf(&Z_Value);38.39./*进入省电模式*/40.if(I2C_MMA_Standby()=SUCCESS)41.42.printf(rnAccelerationenterstandbymode!
rn);43.else44.printf(rnStandbymodeERROR!
rn);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.*输出:
无6.*调用:
外部调用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(),以下是函数原型:
1./*2.*函数名:
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(!
I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED);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的说明,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 死角 stm 中级 重力 感应 加速 MMA