单片机型号选择错误大神来看看 出现这错误怎么回事?这是个加速度传感器的程序。

基于加速度传感器MMA7260QT的自动摇篮的设计-传感技术-与非网
  照顾小宝宝是非常劳累的事情,因为他们醒来和睡觉都比较频繁,加之喂食换衣服等活动,会占用大人大量的时间和精力。摇篮的诞生在很大程度上减轻了大人的负担,但仍有很多不尽如人意的地方。利用动作(加速度)传感器和功能丰富的单片机,则可以设计出一种相对智能化的摇篮。
  现在市面上的电动摇篮仅有简单的定时功能,因此不能针对婴儿的活动发生动作,若摇篮一直摇动,对婴儿的安抚作用就会降低。采用声音触发的自动摇篮,缺点是婴儿先是活动,得不到安抚则会哭闹,摇篮才会启动进行安抚;另外如果因为别的原因哭闹,摇篮则不能起到安抚作用。所以根据婴儿的活动来启动摇篮是比较妥当的控制方式。飞思卡尔的性能优秀,成本较低,适合这样的应用。
  自动摇篮的原理
  本系统采用飞思卡尔MC9S08QG8单片机作为控制器,使用飞思卡尔加速度传感器判断婴儿的活动情况,同时用麦克风检测婴儿哭闹的声音作为辅助判断,然后根据设置启动摇篮摇动。人机界面由键盘和点阵液晶显示器组成。
  测量运动的方法
  加速度传感器测量运动和动作有很多算法,本系统中由于摇篮的活动方向是二维的,而且主要是其中的一维(所以采用一维加速度传感器也可以),运动情况单一,场合也不复杂,所以采用简单的阈值判断的方法即可实现。阈值代表着灵敏度,可由用户根据实际情况选择。
  触摸按键的实现
  触摸按键是近年比较流行的技术,由于MC9S08QG8单片机有很低的端口漏电流和强大的键盘中断功能,所以不需增加其它有源器件即可实现。而且本系统使用两个端口即可提供三个按键的功能。
  使用PCB焊盘作为触摸按键,和地之间构成一个小电容C1(没有手指触摸时),按键通过大阻值电阻R1接地。单片机端口平时输出高电平,检测按键时则为键盘中断,随着C1上的电荷通过R1流失,电平逐渐降低直至引起键盘中断,从开始检测到引起键盘中断的时间为T1,当有手指触摸时相当于在C1上并了一个电容,因此电容值变成C2,则从开始检测到引起键盘中断的时间为T2,通过检测T1、T2的差别即可判断按键按下,如图1。
  假设按键1的电容为C1,按键2的电容为C2,则如果C1增加C2不变,则按键1按下,如果C2增加C1不变,则按键2按下,如果C1、C2都增加相似的数值,则可判断为按键3按下。PCB上按键3位于按键1和按键2之间。这样就实现了两个端口判断三个按键的功能。
  PWM脉宽调制驱动电机
  使用脉宽调制(PWM)的方式驱动电机来实现调速,可以给用户选择3档摇动速度,也可以实现软启动和软停止。
  液晶显示
  使用3V串口液晶显示模块,用单片机SPI口驱动,实现简洁高效的显示界面。
  系统特性
  A.使用飞思卡尔MC9S08QG8单片机作为控制器,集成度高,性价比好。
  B.使用飞思卡尔MMA7260QT加速度传感器感知动作,性能先进,稳定。
  C.良好的人机界面包括了点阵液晶显示器和简洁的菜单系统。
  D.使用单片机端口低漏电流的特性和键盘中断功能实现流行的触摸按键技术。
  E.使用单片机PWM功能实现摇篮速度可调,软启动和软停止。
  F.可控音量的音乐播放功能。
  系统概述
  基于MMA7260QT加速度传感器的自动摇篮控制系统结构如图2。
  婴儿睡着时,摇篮不动,加速度传感器的输出稳定,单片机采样得到的数值作为零值。当婴儿有动作引起摇篮晃动,单片机采样得到的数值发生变化,变化大于设定的阈值时,PWM引脚输出驱动电机动作。
  麦克风作为可选的辅助判断依据也输入单片机。
  音乐播放作为可选的辅助安抚手段。
  系统硬件
  电路框图如图3所示。
  飞思卡尔MC9S08QG8单片机
  本系统使用MC9S08QG8作为核心控制器,其高度集成的功能和灵活的端口控制大大简化了系统设计和成本,本系统主要用到了以下功能:
  高速CPU和大容量的Flash和RAM存储器
  内置的精确时钟
  2通道10位AD转换器
  2个键盘中断输入端口
  PWM输出功能
  高速SPI接口
  飞思卡尔MMA7260QT三轴加速度传感器
  系统使用新的MMA7260QT三轴加速度传感器作为主要传感器,内部信号调理,内置滤波,量程可选,性能稳定可靠,设计起来相当简洁方便。
  加速度测量部分
  传感器设置为最小的量程,输出经过电阻电容滤波然后进入单片机AD输入,如图4。
  键盘电路
  键盘电路十分简单,端口到地接2M电阻即可,触摸键盘的PCB设计要兼顾三键判断,故采用如图5设计。
  电机驱动
  单片机输出PWM脉宽调制信号,然后通过驱动电路驱动电机。
  麦克风输入
  麦克风输入经放大后通过二极管整流到电容上,此电压进入单片机AD转换器。
  音乐播放
  音乐源使用专用音乐IC,功率放大器使用国家半导体的LM4874芯片,具有4级电子音量调节功能,本系统只需单声道即可。
  液晶显示
  采用3.3V串行液晶显示模块,128X64点阵,单片机通过SPI端口直接相连。
  外围其他电路
  电源经220V转为5V然后经LM稳压成3.3V输出给系统电路使用,5V电压还用来驱动电机。
  系统软件
  系统软件完成以下功能:
  根据设置参数定期检测摇篮状态。
  定期对键盘中断引脚检测充放电时间。
  驱动液晶显示器显示相关参数、菜单。
  根据参数驱动摇篮播放音乐。
  检测摇篮状态
  以10Hz的频率检测加速度传感器,定时器中断程序启动AD转换器,主程序中检测到AD转换完成则把结果保存起来,通过和零值比较,如果大于阈值,则认为婴儿活动,根据设置参数启动电机、音乐。
  键盘检测
  以20Hz的频率扫描键盘,定时器中断程序把相应引脚置为输入,允许键盘中断。引脚放电引起键盘中断,保存中断时的定  时器数值,然后退出。主程序等两个按键引脚都扫描完毕保存了放电时间后,调用键盘处理程序分析,得到按键结果。
  液晶显示器驱动
  液晶显示器使用SPI口送数据,根据按键结果相应调整液晶显示的内容。
  摇篮驱动和音乐播放
  驱动摇篮时,根据设置参数启动PWM输出,同时记录时间,到参数规定的时间后缓慢停止摇篮(减少PWM占空比)。
  功放音量根据参数设置,触发音乐IC播放音乐。
  其他辅助程序
  根据软件需要,设置定时器中断和变量time_to_1s,当变量中数值达到1S后重置变量。
  程序结构
  主程序流程如图6
关注与非网微信 ( ee-focus )
限量版产业观察、行业动态、技术大餐每日推荐
享受快时代的精品慢阅读
据了解,智能平衡车的工作原理被称为动态平衡原理。该原理采用运动补偿算法,利用其内部的陀螺仪和加速度传感器,来精确检测车体姿态的微小变化,并利用精密的伺服控制系统,灵敏地驱动电机,进行相应调整,以保持整个车体的稳定和平衡。
发表于: 10:52:02
日,美新公司(MEMSIC INC)宣布其MEMS传感器出货量已超过10亿颗。这标志着美新公司的产品获得客户的认可,并广泛地应用到消费电子、工业控制、汽车电子等各个领域。
发表于: 16:56:10
大家熟知的微信“摇一摇”,背后实现这一功能的是加速度计或者陀螺仪传感器芯片。但去年我国出货的5亿部手机中这两种传感器的国产化率仅为10%和0。
发表于: 14:09:17
近日,mCube宣布其加速度传感器出货量已超过1亿颗。作为全球最小尺寸的MEMS运动传感器供应商,mCube提供业界领先的加速度传感器产品。这类运动传感器运用mCube的单芯片MEMS工艺,从而使新一代的单芯片传感器具有极小尺寸,极低功耗和很高的性价比。
发表于: 13:56:00
根据IC Insights 2015年新版光电-传感-分立元件报告,由于物联网、可穿戴等应用市场成长迅速,以及用于自动控制系统的嵌入式测量功能的普及,传感器的出货量将急剧攀升。不过销售额的成长率将被单价下滑拖累而被拉低。
发表于: 11:15:04
10月19日电 高举“All in AI”大旗的百度已经在中国燃起AI的熊熊之火,现在它希望把火烧得更大,更彻底。
发表于: 17:12:42
生物识别(biometrics)是指为了进行身份识别而采用自动技术对个体生理特征或个人行为特点进行提取,并将这些特征或特点同数据库中已有的模板数据进行比对,从而完成身份认证识别的过程。
发表于: 14:04:11
柔性压力传感器是一种用于感知物体表面作用力大小的柔性电子器件,能贴附于各种不规则物体表面,在医疗健康、机器人、生物力学等领域有着广泛的应用前景。
发表于: 10:51:50
10月18日,中国共产党第十九次全国代表大会在人民大会堂开幕,习近平总书记代表第十八届中央委员会在大会上作报告。近两年来,“人工智能”热潮的呼声不断,习近平总书记也在报告中提到“人工智能”这一概念。
发表于: 10:21:01
长久以来,AI(人工智能)都还只是概念,但最近的科技突破已经可以使之深入渗透到生活之中。当下,AI技术的发展已经到了行业广泛应用的时间点,当前世界主要经济体的政府部门都已经开始行动,中国亦不例外。
发表于: 13:38:30
又到一年招聘季,考研or工作让你实现了怎样的逆袭?……
与非门科技(北京)有限公司 All Rights Reserved.
京ICP证:070212号
北京市公安局备案编号: 京ICP备:号模拟三轴加速度传感器模块MMA7361使用程序 - 单片机/MCU论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
模拟三轴加速度传感器模块MMA7361使用程序
15:19:04  
先说一下这个芯片MMA7361L,其中这个芯片的X-OUT,Y-OUT,Z-OUT是三轴数据的模拟输出,因此AD应该采集的就是这三个管脚的电压值,除了这三个模拟输出以及电源和地之外还有SL、OG、ST、GS这四个管脚,其中SL用来切换睡眠模式和正常模式,这个管脚置一为正常模式,ST为Self-test,把ST这个管脚置一用来初始化芯片,GS这个管脚是模式选择位,这个位置0为1.5g的模式,置1为6g的模式,OG这个管脚是输出,当每个轴都是0g的时候这个管脚会输出1,一般用这个管脚来判断自由落体运动。
001.jpg (46.03 KB, 下载次数: 1)
15:17 上传
002.jpg (53.73 KB, 下载次数: 4)
15:17 上传
这个模块的功能很简单,就是讲AD采集到的电压通过串口显示到PC上,我的硬件电路有一些噪声,所以采集的电压稍微有一点抖动,这个还是软件滤波之后的结果,顺便说一下,我只检测了X轴和Y轴两路,剩下的一路大家可以帮我完成,以下是采集的效果,
003.jpg (34.22 KB, 下载次数: 0)
15:17 上传
& &程序源码请去原帖附件中下载:
/9mcubbs/forum.php?mod=viewthread&tid=1010389
资源分享达人,加分鼓励!
15:30:25  
谢谢楼主分享!!
00:31:47  
PCB在线计价下单
板子大小:
板子数量:
PCB 在线计价
好好好 好东西
等待验证会员
21:37:16  
谢谢楼主,看起来不错的样子,让我看看先!
等待验证会员
19:28:50  
谢谢楼主,看起来不错的样子,让我看看先!
。。。楼主发的网进不去了 你下了吗?
18:12:31  
20:12:42  
10:43:15  
16:33:51  
。。。楼主发的网进不去了 你下了吗?
Powered by
供应链服务
商务及广告合作
Jeffery Guo
关注我们的微信
供应链服务 PCB/IC/PCBA
下载发烧友APP
版权所有 (C) 深圳华强聚丰电子科技有限公司MMA8451三轴加速度传感器程序及测试数据
三轴加速度是飞思卡尔旗下一款高性能简单操作的芯片,本资料直接使用模块(TB上11元左右),测试水平静止条件下以及水平放置桌面后敲击桌面的数据波动图。适合四轴飞行器等高精度姿态检测或者震动检测的要求。本设计使用串口在电脑上显示,每秒送出800组数据,提供售后技术支持和进一步设计需求的交流。测试代码:
电路项目的主要芯片及数据手册
电路相关文件(请在PC端查看下载)
电路城电路折扣劵获取途径:
电路城7~10折折扣劵(全场通用):对本电路进行评分获取;
电路城6折折扣劵(限购≤100元电路):申请成为卖家,上传电路,审核成功后获取。
版权声明:电路城所有电路均源于网友上传或网上搜集,供学习和研究使用,其版权归原作者所有,对可以提供充分证据的侵权信息,本站将在确认后24小时内删除。对本电路进行投诉建议,点击反馈给电路城。
使用说明:直接使用附件资料或需要对资料PCB板进行打样的买家,请先核对资料的完整性,如果出现问题,电路城不承担任何经济损失!
大家都在看:
自从学会使用18B20,一直感觉这货非常好用,主要是不用电压基准源,不用补偿和校正,直接读出数值再转换就是了。跟着计划着做一个双温度显示,主要目的是测室内和室外的温度。终于成功了。下面开源程序和电路图,电路图是手工画的,他人看可能有一定难度,只有抱歉了。程序是汇编语言编写,附在附件里。PS:本人对18B20的使用只会一个端口接一只传感器,那些会一只端口接多只传感器的高手就不要见笑了。18B20操作:1、
复位,单片机发出大于480us的低电平;2、
存在信号,复位结束15~60us后,18B20回复一个60~240us的低电平信号;3、
发送跳过ROM命令#0CCH4、
发送转换命令#044H5、
等待0.8秒6、
第二次复位,第二次收存在信号7、
发出跳过ROM命令#0CCH8、
发出读温度数命令#0BEH9、
读温度数低字节TPL10、
读温度数高字节TPH【转载自数码之家】
来自:时间:
该NRF24L01的6路无线温度采集系统采用一个接收机,六个发射机,分别采集NTC热敏电阻传感器温度,接收机接收六路发射机传输的温度数据,将温度数据显示到接收机板上1.4寸TFT液晶屏上,测温范围为0度到99度,无线传输距离空旷处50米。温度传感器采用高精度NTC热敏电阻防水型。无线传输模式发射机采用六个不同的数据通道,可同时传输。1路接收,NRF24L01-6路无线温度采集系统实物截图:说明:该NRF24L01-6路无线温度采集系统扩展功能(需用户自行添加编程),接收机板载有3个独立按键、7路可控12V电源输出,可直接控制DC12V继电器。
1路接收,NRF24L01-6路无线温度采集系统各项参数:
电路板工艺:蓝/绿色覆铜板(工厂加工);单片机型号:发射机采用STM8S103F3P6;接收机采用STC15F2K60S2;无线传输模块:NRF24L01;接收机液晶显示模块:1.4寸TFT;接收机供电电压:DC12V;发射机供电电压:DC5V;温度传感器:高精度NTC热敏电阻10K防水型;测温范围:0度到99度,分辨率为1度;接受发射无线传输距离:空旷地50米;连接状态指示:显示“断开”或“连接”;
实物购买链接:/item.htm?spm=a1z10.3-c.w40...技术QQ:(咨询可发邮件);全部附件资料截图:
1路接收,6路NRF24L01无线温度采集系统视频演示:
来自:时间:
作为一个资深的骑行爱好者,给自己的“宝马”增添各种炫酷的装备那是乐此不疲啊,安全转向灯这种利器更是少不了,于是有了自己做一个炫酷的极光转向灯的想法,可以看看我最终做的效果啊,反正我是很满意!Ps:自行车转向灯是安装在自行车后部或者骑手背部,在转向时开启以提示后面车辆及行人注意的重要指示灯。“极光"效果预览:控制方式:骑手骑车转弯时身体会有朝向圆心的倾斜动作,转向灯通过采集左右倾斜角度控制灯带做相应显示灯光效果:1.灯带交错相对放置,中间放置柔光材料,让光带效果更加均匀2.模拟水流效果配合光带形状设计,当倾角超过某个阈值后自然形成指向箭头3.转向灯处于静态时有多种动画效果随机切换,起安全醒目作用其他功能:当转向灯长时间处于非水平位置时,软件会进行相应判断并对倾角进行补偿硬件列表:Arduino bluno nanoADXL345加速度传感器WS2812灯带洞洞板一字线激光头*210K电阻*2导线、插针插排若干教程、程序烧写,代码分享在附件里各种适用于自行车、滑板、独轮车、赛格威,更多应用亲发挥你的想象力~
来自:时间:
1. 设计和材料准备所需物料清单:RGB LED模块 5050
DFRduino Nano 3.0(兼容Arduino Nano)LR44纽扣电池盒
高品质 micro USB数据线
DS18B20 防水温度传感器套件
some PMMA, and some wire我们需要两个功能:I.
一个定时器II. 温度传感器解决方案:I.
我用Arduino IDE做了一个计时器,并用LED来提醒你时间。II.
我将防水DS18B20传感器作为“猫尾”来测量温度,并用通过用LED在猫脸显示“腮红‘’来告知使用者水温是否合适。另外我们还需要一个盒子来装这些传感器 结构设计:我希望解构尽可能简洁。因此,我模仿树莓派等MCU保护壳的做法,用激光切割亚克力制作了一个外壳。正面:侧面:整体嵌入组装:最后完成效果图:
来自:时间:
该PAJ7260u2手势识别传感器是将手势识别功能与通用I2C接口集成到单个芯片中的PAJ7620U2。它可以识别13种手势,包括向上移动,向下移动,向左移动,向右移动,向前移动,向后移动,顺时针方向,圆周 - 逆时针方向,向下,向下,从左到右,从左到右。这些手势信息可以通过I2C总线简单访问。该PAJ7260u2手势识别传感器模块设计核心芯片为 PAJ7260u2,是一个支持与I2C协议通信的身体红外识别IC。PAJ7260u2手势识别传感器特点:
13手势识别手势速度在正常模式下为60°/ s至600°/ s,游戏模式为60°/ s至1200°/ s环境光免疫力:&100k Lux内置接近检测I2C接口高达400 kbit / s兼容Xadow界面PAJ7260u2手势识别传感器实物截图:
PAJ7260u2手势识别传感器规格参数:
传感器:PAJ7620U2电源:2.8V至3.3V,I / O电压为1.8V?3.3V兼容:Xadow界面接口:IIC工作温度:-40°C至+ 85°C尺寸:25 * 20
PAJ7260u2手势识别传感器接口功能
P1:短路,则中断信号将与PF0 / A5引脚连接。U1:PAJ7620U2;集成手势识别传感器。J1,J2:FPC接口。!注意:将Xadow - Gesture连接到Xadow主板时,连接方向应谨慎。连接方法是一个xadow模块的未填充的角连接到另一个模块的直角(请参见每个xadow模块的四个角)。PAJ7260u2手势识别传感器引脚说明:
来自:时间:
猜你喜欢(实时推荐最适合你的电路)
ECG 是将离子极化 / 去极化从心脏肌肉活动转换为一个可测量的电信号,可检测此电信号并可被用来确定正常与有问题心脏波标志之间的关系。 为此,测量必须是精确且稳定耐用的。该心脏电活动 ECG 测量系统采用一个模块化设计来优化 ECG 所需要的高精度的模拟前端、后置增益滤波器、输入驱动、基准和模数转换调节电路中的高精度组件。 还将包括在内的是建议的其它低功耗、高精度替代方法以及推荐的功率器件,以使其更加容易地根据特殊设计需求进行定制。心脏电活动 ECG 测量,心电图数据采集系统板实物截图:心电图数据采集电路板设计特有实现 LEAD I ECG 测量系统的方法,此系统的设计源自离散模拟组件。 通过使用OPA2333 设计为离散的仪表放大器,然后用 18位 ADS8881 SAR ADC 将信号数字化,从而实现低功耗。这个 ECG 数据采集的设计要求是:o 总功耗 & 1mWo 分辨率: 18 位o 输入范围: 0 – 3V 直流o 吞吐采样速率: 10kspso 模拟/数字电源: 3.3V 直流o 输入带宽: 200Hz(ECG 信号)设计目标、模拟和测得的ECG性能的比较心脏电活动 ECG 测量,心电图数据采集系统板 PCB 截图:心脏电活动 ECG 测量,心电图数据采集
来自:时间:
电流输出压力传感器变送器工作原理:
当压力信号作用于传感器时,压力传感器将压力信号转换成电信号,经差分放大和输出放大器放大,最后经V/A电压电流转换成与被测介质(液体)的液位压力成线性对应关系的4-20mA标准电流输出信号。PGA300 电流输出压力传感器变送器功能概述:
该设计的压力传感器主要应用于一体式片上系统 (SoC) 解决方案。可驱动 4 至 20 mA 电流回路,并为电阻式电桥传感器提供激励电压。它利用 3 阶压力和温度补偿算法进行线性化。此 TI 设计在不影响精度和性能的情况下,最大限度地减小了压力传感器发送器的典型元件数目和板尺寸。并已进行 IEC61000-4 EMC 和 EMI 测试,支持2.5V 电阻式电桥激励。PGA300 电流输出压力传感器变送器实物截图:PGA300 电流输出压力传感器变送器电路 PCB截图:附件内容截图:
来自:时间:
【课程设计】基于labview的数据采集FFT变换上位机概述:
本课程主要基于虚拟仪器完成数据采集的上位机显示功能。采用labview开发平台,设计通信协议,实现上位机和下位机之间的USB和以太网通信。将下位机采集的数据实时以数据和图形显示,并保存。同时,上位机才可以对数据进行信号处理,实现显示其频谱。【课程设计】编写labview的数据采集FFT变换上位机,其要求如下:1.主要是能实现和FPGA板的USB通信通信方式,保证在FPGA板上发送信号;2.能在labview上显示出波形并且对波形进行处理(采样,编码等);3.能实时的显示出数据,图形以及信号的频谱;4.并完成对数据的处理和显示等;5.同时又能保证labview上发送一个波形或信号能在板子上读出数据。labview的数据采集FFT变换上位机截图:
来自:时间:
24位、4通道模数转换、数据采集系统概述:
在过程控制和工业自动化应用中,±10 V满量程信号非常常见;然而,有些情况下,信号可能小到只有几mV。用现代低压ADC处理±10 V信号时,必须进行衰减和电平转换。但是,对小信号而言,需要放大才能利用ADC的动态范围。因此,在输入信号的变化范围较大时,需要使用带可编程增益功能的电路。
该电路设计是一种灵活的信号调理电路,用于处理宽动态范围(从几mV p-p到20 V p-p)的信号。该电路利用高分辨率模数转换器(ADC)的内部可编程增益放大器(PGA)来提供必要的调理和电平转换并实现动态范围。
该电路包含一个ADG1409多路复用器、一个AD8226仪表放大器、一个AD8475差动放大器、一个AD7192 Σ-Δ型ADC(使用ADR444基准电压源)以及 ADP1720稳压器。只需少量外部元件来提供保护、滤波和去耦,使得该电路具有高集成度,而且所需的电路板(印刷电路板[PCB])面积较小适合宽工业范围信号调理的灵活模拟前端电路:
如上所示电路解决了所有这些难题,并提供了可编程增益、高CMR和高输入阻抗。输入信号经过4通道ADG1409 多路复用器进入 AD8226低成本、宽输入范围仪表放大器。AD8226低成本、宽输入范围仪表放大器。AD8226提供高达80dB的高共模抑制(CMR)和非常高的输入阻抗(差模800ΩM和共模400ΩM)。宽输入范围和轨到轨输出使得AD8226可以充分利用供电轨。24位、4通道模数转换、数据采集系统附件内容截图:
来自:时间:
单片机型号: STC89C52功能:系统供电5V,采用51单片机作为主控芯片,并采用AD,DA芯片作为数据采集(DAC0832 ,ADC0809)两位数码管显示数据,电位器可调整电压,电压范围在0~15伏可调。采用单片机的数字稳压电源是将数字电路和单片机很好地结合在一起,不但能够达到数字电路的效果,而且能够大大地简化复杂的纯数字电路。采用单片机后,还可以用软件实现保护功能,要扩展其他的功能也非常容易。通过多方面考虑和实用性,精确度,单片机进行处理,具有低功耗、高性能、抗干扰能力强等优点。
来自:时间:基于mpu6050加速度传感器和51单片机的无线鼠标设计,有关加速度传感器的数据处理 - 【51单片机】 - 电子工程世界-论坛
后使用快捷导航没有帐号?
请完成以下验证码
查看: 4381|回复: 11
基于mpu6050加速度传感器和51单片机的无线鼠标设计,有关加速度传感器的数据处理
在线时间3 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
& && &各位大牛,有关于基于mpu6050加速度传感器和51单片机的无线鼠标设计,有关加速度传感器的数据处理部分,就是mpu6050输出的部分是3个轴的加速度和三个角加速度,现在不管角加速度嘛,就是如何将程序中的三个加速度进行数据处理,最后使其输出是从当前时刻到某时刻总共走的位移?求指导!加速度传感器的程序如下。
//**************************************** // Update to MPU6050 by shinetop // MCU: STC89C52 //
// 功能: 显示加速度计和陀螺仪的10位原始数据 //**************************************** // GY-52 MPU3050 IIC测试程序 // 使用单片机STC89C51
// 晶振:11.0592M // 显示:LCD1602 // 编译环境 Keil uVision2 // 参考宏晶网站24c04通信程序 // 时间:日 // QQ: //**************************************** #include &reg52.H&& & & &
& &//Keil library&& #include &stdio.h&& &//Keil library& & & &
#include &INTRINS.H& typedef unsigned char&& typedef u typedef unsigned int& & //**************************************** // 定义51单片机端口 //**************************************** #define DataPort P0& & & & & & & & //LCD1602数据端口 sbit& & SCL=P1^0;& & & & & & & & & & & & //IIC时钟引脚定义 sbit& & SDA=P1^1;& & & & & & & & & & & & //IIC数据引脚定义 sbit& & LCM_RS=P3^5;& & & & & & & & //LCD1602命令端口& & & & & & & &
//sbit& & LCM_RW=P3^6;& & & & & & & & //LCD1602命令端口& & & & & & & &
sbit& & LCM_EN=P3^4;& & & & & & & & //LCD1602命令端口 sbit& & WELA=P2^7; sbit& & dula=P2^6; //**************************************** // 定义MPU6050内部地址 //**************************************** #define& & & & SMPLRT_DIV& & & & & & & & 0x19& & & & //陀螺仪采样率,典型值:0x07(125Hz) #define& & & & CONFIG& & & & & & & & & & & & 0x1A& & & & //低通滤波频率,典型值:0x06(5Hz) #define& & & & GYRO_CONFIG& & & & & & & & 0x1B& & & & //陀螺仪自检及测量范围,典型值:0x18(不自检,2000deg/s) #define& & & & ACCEL_CONFIG& & & & 0x1C& & & & //加速计自检、测量范围及高通滤波频率,典型值:0x01(不自检,2G,5Hz) #define& & & & ACCEL_XOUT_H& & & & 0x3B #define& & & & ACCEL_XOUT_L& & & & 0x3C #define& & & & ACCEL_YOUT_H& & & & 0x3D #define& & & & ACCEL_YOUT_L& & & & 0x3E #define& & & & ACCEL_ZOUT_H& & & & 0x3F #define& & & & ACCEL_ZOUT_L& & & & 0x40 #define& & & & TEMP_OUT_H& & & & & & & & 0x41 #define& & & & TEMP_OUT_L& & & & & & & & 0x42 #define& & & & GYRO_XOUT_H& & & & & & & & 0x43 #define& & & & GYRO_XOUT_L& & & & & & & & 0x44& & & &
#define& & & & GYRO_YOUT_H& & & & & & & & 0x45 #define& & & & GYRO_YOUT_L& & & & & & & & 0x46 #define& & & & GYRO_ZOUT_H& & & & & & & & 0x47 #define& & & & GYRO_ZOUT_L& & & & & & & & 0x48 #define& & & & PWR_MGMT_1& & & & & & & & 0x6B& & & & //电源管理,典型值:0x00(正常启用) #define& & & & WHO_AM_I& & & & & & & & & & & & 0x75& & & & //IIC地址寄存器(默认数值0x68,只读) #define& & & & SlaveAddress& & & & 0xD0& & & & //IIC写入时的地址字节数据,+1为读取 //**************************************** //定义类型及变量 //**************************************** uchar dis[4];& & & & & & & & & & & & & & & & & & & & & & & & & & & & //显示数字(-511至512)的字符数组 int& & & & dis_& & & & & & & & & & & & & & & & & & & & & & & & //变量 //int& & & & Temperature,Temp_h,Temp_l;& & & & //温度及高低位数据 //**************************************** //函数声明 //**************************************** void&&delay(unsigned int k);& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //延时 //LCD相关函数 void&&InitLcd();& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //初始化lcd1602 void&&lcd_printf(uchar *s,int temp_data); void&&WriteDataLCM(uchar dataW);& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //LCD数据 void&&WriteCommandLCM(uchar CMD);& & & & & & & & & & & & & & & & //LCD指令 void&&DisplayOneChar(uchar X,uchar Y,uchar DData);& & & & & & & & & & & & //显示一个字符 void&&DisplayListChar(uchar X,uchar Y,uchar *DData,L);& & & & //显示字符串 //MPU6050操作函数 void&&InitMPU6050();& & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & & //初始化MPU6050 void&&Delay5us(); void&&I2C_Start(); void&&I2C_Stop(); void&&I2C_SendACK(bit ack); bit& &I2C_RecvACK(); void&&I2C_SendByte(uchar dat); uchar I2C_RecvByte(); void&&I2C_ReadPage(); void&&I2C_WritePage(); void&&display_ACCEL_x(); void&&display_ACCEL_y(); void&&display_ACCEL_z(); uchar Single_ReadI2C(uchar REG_Address);& & & & & & & & & & & & & & & & & & & & & & & & //读取I2C数据 void&&Single_WriteI2C(uchar REG_Address,uchar REG_data);& & & & //向I2C写入数据 //**************************************** //整数转字符串 //**************************************** void lcd_printf(uchar *s,int temp_data) { & & & & if(temp_data&0) & & & & { & & & & & & & & temp_data=-temp_ & & & & & & & & *s='-'; & & & & } & & & & else *s=' '; & & & & *++s =temp_data/100+0x30; & & & & temp_data=temp_data%100;& &&&//取余运算 & & & & *++s =temp_data/10+0x30; & & & & temp_data=temp_data%10;& && &//取余运算 & & & & *++s =temp_data+0x30; & & & &
} //**************************************** //延时 //**************************************** void delay(unsigned int k)& & & &
{& & & & & & & & & & & & & & & & & & & & & & & &
& & & & unsigned int i,j;& & & & & & & & & & & & & & & &
& & & & for(i=0;i&k;i++) & & & & {& & & & & & & & & & & &
& & & & & & & & for(j=0;j&121;j++); & & & & }& & & & & & & & & & & & & & & & & & & & & & & &
} //**************************************** //LCD1602初始化 //**************************************** void InitLcd()& & & & & & & & & & & & & & & &
& & WELA=0; & & dula=0; & & LCM_EN=0;& & & & & & & &
& & & & WriteCommandLCM(0x38);& & & &
& & & & WriteCommandLCM(0x08);& & & &
& & & & WriteCommandLCM(0x01);& & & &
& & & & WriteCommandLCM(0x06);& & & &
& & & & WriteCommandLCM(0x0c); & & & & DisplayOneChar(0,0,'A'); & & & & DisplayOneChar(0,1,'G'); }& & & & & & & & & & & &
//**************************************** //LCD1602写允许 //**************************************** /*void WaitForEnable(void)& & & &
{& & & & & & & & & & & & & & & & & & & &
& & & & DataPort=0& & & & & & & &
& & & & LCM_RS=0;LCM_RW=1;_nop_(); & & & & LCM_EN=1;_nop_();_nop_(); & & & & while(DataPort&0x80);& & & &
& & & & LCM_EN=0;& & & & & & & & & & & & & & & &
}*/& & & & & & & & & & & & & & & & & & & &
//**************************************** //LCD1602写入命令 //**************************************** void WriteCommandLCM(uchar CMD) {& & & & & & & & & & & & & & & & & & & &
& & & & //if(Attribc)WaitForEnable();& & & &
& & & & LCM_RS=0;//LCM_RW=0; & & & & DataPort=CMD; & & delay(5);& & & &
& & & & LCM_EN=1; & & delay(5); & & LCM_EN=0; }& & & & & & & & & & & & & & & & & & & &
//**************************************** //LCD1602写入数据 //**************************************** void WriteDataLCM(uchar dataW) {& & & & & & & & & & & & & & & & & & & &
& & & & //WaitForEnable();& & & & & & & &
& & & & LCM_RS=1; & & & & DataPort=dataW; & & delay(5);& & & &
& & & & LCM_EN=1; & & delay(5);& & & & LCM_EN=0; }& & & & & & & &
//**************************************** //LCD1602写入一个字符 //**************************************** void DisplayOneChar(uchar X,uchar Y,uchar DData) {& & & & & & & & & & & & & & & & & & & & & & & &
& & & & Y&=1;& & & & & & & & & & & & & & & & & & & & & & & &
& & & & X&=15;& & & & & & & & & & & & & & & & & & & & & & & &
& & & & if(Y)X|=0x40;& & & & & & & & & & & & & & & & & & & &
& & & & X|=0x80;& & & & & & & & & & & &
& & & & WriteCommandLCM(X);& & & & & & & &
& & & & WriteDataLCM(DData);& & & & & & & &
}& & & & & & & & & & & & & & & & & & & & & & & &
//**************************************** //LCD1602显示字符串 //**************************************** void DisplayListChar(uchar X,uchar Y,uchar *DData,L) { & & & & uchar ListLength=0;
& & & & Y&=0x1;& && && && && &
& & & & X&=0xF;& && && && && &
& & & & while(L--)& && && && &
& & & & {& && && && && && && &&& & & & & & & & & DisplayOneChar(X,Y,DData[ListLength]); & & & & & & & & ListLength++;&& & & & & & & & & X++;& && && && && && && && & & & & & }& &
} //************************************** //延时5微秒(STC90C52RC@12M) //不同的工作环境,需要调整此函数 //当改用1T的MCU时,请调整此延时函数 //************************************** void Delay5us() { & & & & _nop_();_nop_();_nop_();_nop_(); & & & & _nop_();_nop_();_nop_();_nop_(); & & & & _nop_();_nop_();_nop_();_nop_(); & & & & _nop_();_nop_();_nop_();_nop_(); & & & & _nop_();_nop_();_nop_();_nop_(); & & & & _nop_();_nop_();_nop_();_nop_(); } //************************************** //I2C起始信号 //************************************** void I2C_Start() { & & SDA = 1;& && && && && && &&&//拉高数据线 & & SCL = 1;& && && && && && &&&//拉高时钟线 & & Delay5us();& && && && && &&&//延时 & & SDA = 0;& && && && && && &&&//产生下降沿 & & Delay5us();& && && && && &&&//延时 & & SCL = 0;& && && && && && &&&//拉低时钟线 } //************************************** //I2C停止信号 //************************************** void I2C_Stop() { & & SDA = 0;& && && && && && &&&//拉低数据线 & & SCL = 1;& && && && && && &&&//拉高时钟线 & & Delay5us();& && && && && &&&//延时 & & SDA = 1;& && && && && && &&&//产生上升沿 & & Delay5us();& && && && && &&&//延时 } //************************************** //I2C发送应答信号 //入口参数:ack (0:ACK 1:NAK) //************************************** void I2C_SendACK(bit ack) { & & SDA =& && && && && && &//写应答信号 & & SCL = 1;& && && && && && &&&//拉高时钟线 & & Delay5us();& && && && && &&&//延时 & & SCL = 0;& && && && && && &&&//拉低时钟线 & & Delay5us();& && && && && &&&//延时 } //************************************** //I2C接收应答信号 //************************************** bit I2C_RecvACK() { & & SCL = 1;& && && && && && &&&//拉高时钟线 & & Delay5us();& && && && && &&&//延时 & & CY = SDA;& && && && && && & //读应答信号 & & SCL = 0;& && && && && && &&&//拉低时钟线 & & Delay5us();& && && && && &&&//延时 & & return CY; } //************************************** //向I2C总线发送一个字节数据 //************************************** void I2C_SendByte(uchar dat) { & & & & for (i=0; i&8; i++)& && && &//8位计数器 & & { & && &&&dat &&= 1;& && && && &&&//移出数据的最高位 & && &&&SDA = CY;& && && && && &//送数据口 & && &&&SCL = 1;& && && && && & //拉高时钟线 & && &&&Delay5us();& && && && & //延时 & && &&&SCL = 0;& && && && && & //拉低时钟线 & && &&&Delay5us();& && && && & //延时 & & } & & I2C_RecvACK(); } //************************************** //从I2C总线接收一个字节数据 //************************************** uchar I2C_RecvByte() { & & & & uchar dat = 0; & & SDA = 1;& && && && && && &&&//使能内部上拉,准备读取数据, & & for (i=0; i&8; i++)& && && &//8位计数器 & & { & && &&&dat &&= 1; & && &&&SCL = 1;& && && && && & //拉高时钟线 & && &&&Delay5us();& && && && & //延时 & && &&&dat |= SDA;& && && && & //读数据& && && && && & & && &&&SCL = 0;& && && && && & //拉低时钟线 & && &&&Delay5us();& && && && & //延时 & & } & & } //************************************** //向I2C设备写入一个字节数据 //************************************** void Single_WriteI2C(uchar REG_Address,uchar REG_data) { & & I2C_Start();& && && && && && &//起始信号 & & I2C_SendByte(SlaveAddress);& &//发送设备地址+写信号 & & I2C_SendByte(REG_Address);& & //内部寄存器地址, & & I2C_SendByte(REG_data);& && & //内部寄存器数据, & & I2C_Stop();& && && && && && & //发送停止信号 } //************************************** //从I2C设备读取一个字节数据 //************************************** uchar Single_ReadI2C(uchar REG_Address) { & & & & uchar REG_ & & & & I2C_Start();& && && && && && & //起始信号 & & & & I2C_SendByte(SlaveAddress);& & //发送设备地址+写信号 & & & & I2C_SendByte(REG_Address);& &&&//发送存储单元地址,从0开始& & & &
& & & & I2C_Start();& && && && && && & //起始信号 & & & & I2C_SendByte(SlaveAddress+1);&&//发送设备地址+读信号 & & & & REG_data=I2C_RecvByte();& && & //读出寄存器数据 & & & & I2C_SendACK(1);& && && && && & //接收应答信号 & & & & I2C_Stop();& && && && && && &&&//停止信号 & & & & return REG_ } //************************************** //初始化MPU6050 //************************************** void InitMPU6050() { & & & & Single_WriteI2C(PWR_MGMT_1, 0x00);& & & & //解除休眠状态 & & & & Single_WriteI2C(SMPLRT_DIV, 0x07); & & & & Single_WriteI2C(CONFIG, 0x06); & & & & Single_WriteI2C(GYRO_CONFIG, 0x18); & & & & Single_WriteI2C(ACCEL_CONFIG, 0x01); } //************************************** //合成数据 //************************************** int GetData(uchar REG_Address) { & & & & char H,L; & & & & H=Single_ReadI2C(REG_Address); & & & & L=Single_ReadI2C(REG_Address+1); & & & & return (H&&8)+L;& &//合成数据 } //************************************** //在1602上显示10位数据 //************************************** void Display10BitData(int value,uchar x,uchar y) { & & & & value/=64;& & & & & & & & & & & & & & & & & & & & & & & & & & & & //转换为10位数据 & & & & lcd_printf(dis, value);& & & & & & & & & & & & //转换数据显示 & & & & DisplayListChar(x,y,dis,4);& & & & //启始列,行,显示数组,显示长度 } //************************************** //显示温度 //************************************** //void display_temp() //{
//& & & & Temp_h=Single_ReadI2C(TEMP_OUT_H); //读取温度 //& & & & Temp_l=Single_ReadI2C(TEMP_OUT_L); //读取温度 //& & & & Temperature=Temp_h&&8|Temp_l;& &&&//合成温度 //& & & & Temperature = 35+ ((double) (Temperature + 13200)) / 280; // 计算出温度 //& & & & lcd_printf(dis,Temperature);& &&&//转换数据显示 //& & & & DisplayListChar(11,1,dis,4);& &&&//启始列,行,显示数组,显示位数 //} //********************************************************* //主程序 //********************************************************* void main() {
& & & & delay(500);& & & & & & & & //上电延时& & & & & & & &
& & & & InitLcd();& & & & & & & & //液晶初始化 & & & & InitMPU6050();& & & & //初始化MPU6050 & & & & delay(150); & & P0=0XFF; & & & & delay(50); & & & & WELA=1; & & & & delay(50); & & & & WELA=0;
& & & & while(1) & & & & { & & & & & & & & Display10BitData(GetData(ACCEL_XOUT_H),2,0);& & & & //显示X轴加速度 & & & & & & & & Display10BitData(GetData(ACCEL_YOUT_H),7,0);& & & & //显示Y轴加速度 & & & & & & & & Display10BitData(GetData(ACCEL_ZOUT_H),12,0);& & & & //显示Z轴加速度 & & & & & & & & Display10BitData(GetData(GYRO_XOUT_H),2,1);& & & & //显示X轴角速度 & & & & & & & & Display10BitData(GetData(GYRO_YOUT_H),7,1);& & & & //显示Y轴角速度 & & & & & & & & Display10BitData(GetData(GYRO_ZOUT_H),12,1);& & & & //显示Z轴角速度 & & & & & & & & delay(500); & & & & } }复制代码
12:39 上传
点击文件名下载附件
11.5 KB, 下载次数: 80
加速度传感器的程序
在线时间1988 小时
威望3330分
芯币4847枚
E金币381枚
TA的帖子TA的资源
这是一个比较复杂的算法,可以参考
等盲导系统
在线时间1690 小时
威望1538分
芯币12407枚
E金币517枚
TA的帖子TA的资源
纯净的硅(高级), 积分 1538, 距离下一级还需 462 积分
纯净的硅(高级), 积分 1538, 距离下一级还需 462 积分
51去滤波融合解算,是不是太摩托骡拉了
So what......
在线时间1690 小时
威望1538分
芯币12407枚
E金币517枚
TA的帖子TA的资源
纯净的硅(高级), 积分 1538, 距离下一级还需 462 积分
纯净的硅(高级), 积分 1538, 距离下一级还需 462 积分
1、原始数据虑个波
2、把极限时间内的两个数据融合一下
3、用xx法,谈论得比较多的是四元数,把姿态算出来
So what......
在线时间409 小时
芯币3824枚
E金币1423枚
TA的帖子TA的资源
感觉mpu6050不太适合做惯性导航,精度太低,给你看看我用mpu6050做的惯性导航视频
在线时间3 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
但是用作鼠标控制的话,认为控制光标位置的话,对精度要求并不是很高,就是后续算法不知道怎么办,求指导。你这个做惯性导航的视频里面只有速度信息,没得位移的嘛 ,速度是靠积分来的还是怎么来的?
速度是靠加速度积分来的&
在线时间3 小时
TA的帖子TA的资源
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
一粒金砂(中级), 积分 10, 距离下一级还需 190 积分
但是用作鼠标控制的话,认为控制光标位置的话,对精度要求并不是很高,就是后续算法不知道怎么办,求指导。你这个做惯性导航的视频里面只有速度信息,没得位移的嘛 ,速度是靠积分来的还是怎么来的?
在线时间409 小时
芯币3824枚
E金币1423枚
TA的帖子TA的资源
但是用作鼠标控制的话,认为控制光标位置的话,对精度要求并不是很高,就是后续算法不知道怎么办,求指导。你这个做惯性导航的视频里面只有速度信息,没得位移的嘛 ,速度是靠积分来的还是怎么来的?
速度是靠加速度积分来的
在线时间3 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
速度是靠加速度积分来的
能不能看看你的代码 我的QQ
在线时间1 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
一粒金砂(初级), 积分 2, 距离下一级还需 3 积分
速度是靠加速度积分来的
能贴出相关代码吗?我目前也在做一个利用加速度传感器数据控制鼠标的小项目&&我也看了你发的视频 感觉还是有点不稳定&&鼠标存在反向问题
代码现在找不到了,不过我用的代码相当的简单,就是用的加速度减去重力加速度的值然后积分,然后弄很大的死区,所以代码并没有什么价值,如果可以建议去研究下Pixhawk这种飞控中的惯性导航代码。&
在线时间409 小时
芯币3824枚
E金币1423枚
TA的帖子TA的资源
能贴出相关代码吗?我目前也在做一个利用加速度传感器数据控制鼠标的小项目&&我也看了你发的视频 感觉还 ...
代码现在找不到了,不过我用的代码相当的简单,就是用的加速度减去重力加速度的值然后积分,然后弄很大的死区,所以代码并没有什么价值,如果可以建议去研究下Pixhawk这种飞控中的惯性导航代码。
在线时间1 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
加速度积分与计时器计算位移啊
EEWORLD 官方微信
EE福利 唾手可得
Powered by

我要回帖

更多关于 ui发生错误怎么回事 的文章

 

随机推荐