欢迎来到冰点文库! | 帮助中心 分享价值,成长自我!
冰点文库
全部分类
  • 临时分类>
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • ImageVerifierCode 换一换
    首页 冰点文库 > 资源分类 > PDF文档下载
    分享到微信 分享到微博 分享到QQ空间

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

    • 资源ID:5983116       资源大小:1.16MB        全文页数:16页
    • 资源格式: PDF        下载积分:10金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

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

    1、1.*2.*函数名:main 3.*描述 :主函数 4.*输入 :无 -第 5 页-5.*输出 :无 6.*返回 :无 7.*/8.int main(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);

    2、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(rn Acceleration enter standby mode!rn);43.else

    3、 44.printf(rn Standby mode ERROR!45.46.系统库函数 SystemInit();将系统时钟设置为72M,USART1_Config();配置串口,关于这两个函数的具体讲解可以参考前面的教程,这里不再详述。1./*2.*函数名:I2C_MMA_Init 3.*描述 :I2C 外设(MMA7455)初始化 4.*输入 :无 5.*输出 :无 6.*调用 :外部调用 7.*/8.void I2C_MMA_Init(void)9.10.I2C_GPIO_Config();11.I2C_Mode_Config();12.-第 6 页-I2C_MMA_Init();是用

    4、户编写的函数,其中调用了I2C_GPIO_Config();配置好 I2C所用的 I/O 端口,调用 I2C_Mode_Configu();设置 I2C 的工作模式,并使能相关外设的时钟。I2C_MMA_Cal()函数是用来校正传感器的,校正需要先测量原始数据,我们先看 I2C_MMA_Test()函数 1./*2.*函数名:I2C_MMA_Test 3.*描述 :测量倾角 和 加速度(量程 0-2g)4.*输入 :数据结构体的指针 5.*输出 :外部调用 7.*/8.void I2C_MMA_Test(MMA_Dat*MMA_Value)9.10.u8 temp;11.12./*MMA 进入

    5、 2g 量程测试模式*/13.I2C_MMA_ByteWrite(0 x05,MMA_MCTL_Addr);14.15./*DRDY 标置位,等待测试完毕*/16.while(!(I2C_MMA_ByteRead(MMA_STATUS_Addr)&0 x01);17.18./*读取测得的数据*/19.MMA_Value-Out=I2C_MMA_ByteRead(MMA_Value-Addr);20.21.if(MMA_Value-Out&0 x80)=0 x00)/*读出的原始值为正数 */22.23.temp=MMA_Value-Out;24.25./*将原始值转换为加速度,乘以-1 为方向

    6、处理*/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.else 34./*加速度小于 1 g,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.else 40.41.temp=MMA_Value-Out;4

    7、2.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.else 54./*Angle=asin(Acc/9.8)*57.32*/55.MMA_Value-Angle=(-1)*asin(float)temp/64)*57.32;-第 7 页-56.57.这个函数调用了I2C_MMA_ByteWrite()

    8、,以下是函数原型:I2C_MMA_ByteWrite 3.*描述 :写一个字节到 I2C MMA 寄存器中 4.*输入 :-pBuffer 缓冲区指针 5.*-WriteAddr 接收数据的 MMA 寄存器的地址 6.*输出 :无 7.*返回 :无 8.*调用 :内部调用 9.*/10.static void I2C_MMA_ByteWrite(u8 pBuffer,u8 WriteAddr)11.12./*wait until I2C bus is not busy*/13.while(I2C_GetFlagStatus(I2C1,I2C_FLAG_BUSY);14.15./*Send ST

    9、ART condition*/16.I2C_GenerateSTART(I2C1,ENABLE);17.18./*Test on EV5 and clear it*/19.while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_MODE_SELECT);20.21./*Send MMA address for write*/22.I2C_Send7bitAddress(I2C1,MMA_ADRESS,I2C_Direction_Transmitter);23.24./*Test on EV6 and clear it*/25.while(!I2C_CheckEv

    10、ent(I2C1,I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED);26.27./*Send the MMAs Register address to write to*/28.I2C_SendData(I2C1,WriteAddr);29.30./*Test on EV8 and clear it*/31.while(!I2C_CheckEvent(I2C1,I2C_EVENT_MASTER_BYTE_TRANSMITTED);32.33./*Send the byte to be written*/34.I2C_SendData(I2C1,pBuffe

    11、r);35.36./*Test on EV8 and clear it*/37.while(!38.39./*Send STOP condition*/40.I2C_GenerateSTOP(I2C1,ENABLE);41.42.这与 EEPROM 的I2C_EE_PageWrite()函数很类似,第一个参数为要写入的数值,第二个参数为待写入寄存器的地址。这些寄存器的地址在 I2C_MMA.h 文件中都有宏定义。其中要强调的地方方是 MMA7455 的器件地址(分清器件地址与寄存器地址的区别哦!),在 MMA7455 的 DataSheet 中查到的器件地址为 0X1D,但这个地址是不正确的,

    12、与野火使用的这块芯片有区别,市面上的传感器一般这个器件地址也为 0 x3A。-第 8 页-在用 Jlink 调试程序的时候,程序循环运行在第 25 行就可以知道是器件地址出了问题,其它通讯的错误也可以用这样的方式查找出来,省了示波器_。I2C_MMA_ByteRead()类似,功能是读取寄存器的值,就不分析了。回到I2C_MMA_Test()函数中,I2C_MMA_Test()的第 13 行代码是向 MMA7455 写入命令,开启 2g 转换模式,开启了检测模式后,通过查询 MMA7455 的 DRDY位,等待 MMA7455 的加速度转化完成。以下为 DataSheet 的说明,附上野火的注

    13、释:截图来自MMA7455L 转化完成后根据传入的参数,把相应的 MMA7455 数据寄存器中的数据读取出来,各个方向的原始数据储存在相应的结构体的.Out 变量中:1.typedef struct 2.3.uc8 Addr;/寄存器的地址 4.uc8 Name;/数据的方向,X,Y 或 Z 5.s8 Out;/寄存器的值 6.float Acc;/加速度值 7.float Angle;/角度值 8.MMA_Dat;在结构体初始化的时候把寄存器的地址和名称定义好了:-第 9 页-1./*/2.MMA_Dat X_Value=MMA_XOUT8_Addr,X;3.MMA_Dat Y_Value=

    14、MMA_YOUT8_Addr,Y;4.MMA_Dat Z_Value=MMA_ZOUT8_Addr,Z;要注意的是 MMA7455 中的数据以二补数的形式来储存:截图来自MMA7455L 把二补数转换为原码后就可以像处理 ADC 的数据一样了,我们选择的是2g 量程,敏感度为:64LSB/g。至于角度的计算公式,把重力加速度按各方向的分解,可以推导出来。计算出来的 加速度或角度 乘以-1 是野火根据传感器上标注的箭头的方向,并以此为正方向进行调整的,不同的厂家生产的传感器稍有区别。下图是以 X 方向输出的角度为例:-第 10 页-输出的角度为各箭头方向的直线与水平面间的夹角,在水平面上方为正,

    15、下方为负。接下来分析一下 校准函数:I2C_MMA_Cal 3.*描述 :MMA7455 校准 4.*输入 :外部调用,在初始化后调用 7.*/8.void I2C_MMA_Cal(void)9.10.I2C_MMA_ByteWrite(0 x00,MMA_YOFFL_Addr);/*校正 x 值 00*/11.I2C_MMA_ByteWrite(0 x30,MMA_YOFFL_Addr);/*校正 y 值 48*/12.I2C_MMA_ByteWrite(0 xE2,MMA_ZOFFL_Addr);/*校正 Z 值-30 的补码 */13.I2C_MMA_ByteWrite(0 xFF,MM

    16、A_ZOFFH_Addr);/*校正 Z 值,校正值为负数,要把高位写 1;*/14.I2C_MMA_Cal()函数是用来校正传感器的,称为 0g 校准。这个函数在第一次测量前必须调用,而且每个传感器的校正值都有不同,其中的校正参数就要大家亲手去调试出来啦。参照 DataSheetAN3745按以下步骤校准:1.把传感器按水平方式放置,读取各方向寄存器输出值。这个情况下,Z 轴方向标准输出应为 1g,X 轴和 Y 轴均为 0。对应到各个寄存器的原始数据就应是 ZOUT8=64,XOUT8=0,YOUT8=0。但是未校准前,各个寄存器的输出会有一定的偏差。-第 11 页-以下为传感器水平放置,野

    17、火的例程中未校准得出的数据 2.向相应的 OffSet 寄存器写入校准值:要注意两个问题。一是校准寄存器中的值为 1/2 LSB,所以我们写入的值要相应地乘以 2倍:XOUT8 很标准,不用写入校准值,或向 XOFFL 写入 0;YOUT8 输出为-19,所以应 YOFFL 写入 38=2*19;ZOUT8 输出为 75,所以应写入-22=2*(64-75);-第 12 页-截图来自MMA7455L 当校准值要写入负数时,要注意第二个问题:就是在 MMA7455 寄存器中数值是以补码的形式储存的,所以实际写入 的数据要经过转化:-22 的补码为 0 xEA。但是,向 ZOFFL 写入 0 xE

    18、A 还是未能校准,因为校准寄存器的还有高 8 位,高 8 位必须全写入 1 才是-22 的补码,所以还要向 ZOFFH 写入 0 xff。选取恰当的校准值往往要经过多次的检测,为了提高准确度,就辛苦一点吧。最后讲解一下 Standby 模式,只要向 MCTL 寄存器写入 0 x04 命令就可进入Standby 模式,这时传感器不工作,功耗大大降低:I2C_MMA_Standby 3.*描述 :重力传感器进入 Standby 模式,省电 4.*输入 :是否成功进入 Standby 模式 7.*调用 :外部调用 8.*/9.u8 I2C_MMA_Standby(void)10.11.u8 MMA_

    19、Test;12.13./*MMA Standby Mode*/14.I2C_MMA_ByteWrite(0 x04,MMA_MCTL_Addr);15.16./*MMA_Test*/17.MMA_Test=I2C_MMA_ByteRead(MMA_MCTL_Addr);18.19.if(MMA_Test=0 x04)20.return SUCCESS;21.else 22.return ERROR;23.-第 13 页-10.4 实验现象实验现象 很多第一次使用加速度传感器的人都会被它的方向弄糊涂,以下为传感器分别按 DataSheet 的这图 3,图 4,图 5,三个个方向来放置时没得的数据。注释中的各个 XYZ 轴的方向为野火使用的传感器上标注的箭头方向,设为正方向。将野火 STM32 开发板供电(DC5V),插上 JLINK。截图来自MMA7455L -第 14 页-按图 2 方向放置 -第 15 页-按图 3 方向放置 -第 16 页-


    注意事项

    本文(零死角玩转stm中级篇重力感应三轴加速MMA资料下载.pdf)为本站会员主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

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

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


    收起
    展开