C代码 电子罗盘

合集下载

范例三 电子罗盘

范例三 电子罗盘

范例三 电子罗盘一.系统概述本系统的目标是设计一个两轴数字罗盘系统。

对其所指的方向进行测量。

当系统工作时,系统中的磁阻传感器(HMC022)对所在地的地磁进行A/D 采集,然后对采集量进行处理,将所在的方向相对正北的角度通过串口发送给高端。

本系统可工作在正常状态和标定状态。

正常状态在该状态下,系统对地磁进行正常采集后进行校准,然后通过串口将计算的方向角发送出来。

2 标定状态在该状态下,系统对周围的磁场进行采集,以此为参考,推导出校准参数。

退出该状态时,将校准参数保存起来,以便用于对正常状态下采集的数据进行偏置校准。

二.系统输入/输出分析两轴数字罗盘系统的系统框图如图627所示。

M C U2磁阻传感器2PC 机磁阻传感器复位置位电路图627 数字罗盘系统框图从系统框图中可以看出,两轴数字罗盘系统大体可以分为模拟量输入、开关量输出以及通信量 3 类。

模拟量输入分析如表65所示。

表65 数字罗盘系统模拟量输入类型 编号 名称 命名 备注模拟量输入A 轴采集量 A_data 磁阻传感器 范围为0mV ~+0mV 2B 轴采集量B_data磁阻传感器范围为0mV ~+0mV开关量输出分析如表66所示表66 数字罗盘系统开关量输出类型 编号 名称 命名 控制对象 备注开关量 输入复位置位信号R/S磁阻传感器对HMC022进行复位置位,0.5A ~4A表67 数字罗盘系统通信量编号名称命名备注串口发送数据 TxD 向PC 端发送数据 2串口接受数据RxD接收PC 端发来的数据三.硬件设计芯片选型选取芯片时应该注意:不要将所有的I/O 口用满,应当预留一定的输入输出端口,以便扩展需要。

通过分析数字罗盘系统的输入量和输出量,发现所需的I/O 口较少,为5个。

但考虑到该系统对A/D 采集精度要求较高并且要求有SCI 模块以便于通信,故考虑该系统采用具有0BitA/D 采集和SCI 模块的MR8。

2 设计框图数字罗盘系统的硬件框图如图628所示,下面将分析A/D 采集中的电压放大模块、HMC022(磁阻传感器)的置位/复位电路和SCI(RS232)通信模块。

STM32系列单片机原理及应用——C语言案例教程教学课件U6

STM32系列单片机原理及应用——C语言案例教程教学课件U6

广西大学电气工程学院
(接左栏) SDA_OUT(); //SDA 线输出 if(flg){
SDA_SET(); //输出1-NACK }else{
SDA_CLR(); //输出0-ACK } I2C_DELAY(); SCL_SET(); / /SCL置1 I2C_DELAY(); I2C_DELAY(); SCL_CLR(); I2C_DELAY(); SDA_OUT(); //SDA 线输出 //返回读取的数据 return (uint8_t)data; }
个字节传输用于最后一个接收字节的PEC错误校验。 • 兼容SMBus2.0:25ms时钟低超时延时、10ms主设备累积时钟低扩展时间、25ms
从设备累积时钟低扩展时间、带ACK控制的硬件PEC产生/效验、支持地址分辨协议
(ARP) • 兼容SMBus。
第6章 总线通信接口I2C
广西大学电气工程学院
第6章 总线通信接口I2C 6.1.2 I2C工作原理
广西大学电气工程学院
STM32微控制器的I2C模块连接微控制器和I2C总线,提供多主机功能,支持标准和 快速两种传输速率,控制所有I2C总线特定的时序、协议、仲裁和定时。STM32的I2C有 多种用途,包括CRC码的生成和校验、SMBus (系统管理总线)和PMBus(电源管理总 线)。根据特定设备的需要还可以使用DMA以减轻CPU的负担。
1.模式选择,接口可按下述4种模式中的一种运行:
• 从发送器模式。 • 从接收器模式。 • 主发送器模式。 • 主接收器模式。 模块默认工作于从模式:接口在生成起始条件后自动将从模式切换到主模式;当仲 裁丢失或产生停止信号时,则从主模式切换到从模式。允许多主机功能。
2.通信流 主模式时,I2C接口启动数据传输并产生时钟信号。串行数据传输总是以起始条件开始 并以停止条件结束。起始和停止条件都是在主模式下由软件控制产生。 从模式时,I2C 接口能识别它自己的地址(7位或10位)和广播呼叫地址。软件能控制

电子罗盘调研

电子罗盘调研

电子罗盘调研2014-02-211 电子罗盘功能介绍1.1 名字解释电子罗盘,也叫数字指南针,是利用地磁场来定北极的一种方法。

古代称为罗经,现代利用先进加工工艺生产的磁阻传感器为罗盘的数字化提供了有力的帮助。

现在一般有用磁阻传感器和磁通门加工而成的电子罗盘。

电子罗盘具有以下特点:●三轴磁阻效应传感器测量平面地磁场,双轴倾角补偿。

●高速高精度A/D转换。

●内置温度补偿,最大限度减少倾斜角和指向角的温度漂移。

●内置微处理器计算传感器与磁北夹角。

●具有简单有效的用户标校指令。

●具有指向零点修正功能。

1.2 电子罗盘作用1.2.1 GPS导航定位的缺陷1) 虽然GPS在导航、定位、测速、定向方面有着广泛的应用,但由于其信号常被地形、地物遮挡,导致精度大大降低, 其信号可用性仅为60% ,甚至不能使用。

产生不精确定位的原因包括:①多路径效应:建筑物对GPS信号的反射②阴影:城市中高楼与高楼之间形成的“峡谷”内、浓密的植被下,信号接收效果较差③在隧道、地下停车厂造成的信号失锁④在接收信号差的地区延长了初始化时间⑤一些动态影响,如汽车大幅度增速与减速等。

以上原因都会导致GPS无法提供任何位置或者定位精度陡然下降。

2) 在静止的情况下,GPS也无法给出航向信息。

高精度电子罗盘可以对GPS信号进行有效补偿,保证导航定向信息100%有效,即使是在GPS信号失锁后也能正常工作,做到“丢星不丢向”。

3) 安全及可靠性风险。

美国出于自身利益上的考虑,从不承诺不实施SA干扰和区域关闭,这更给GPS用户带来很大疑惑和担心。

因此,将GPS与电子罗盘相结合,二者相互补充,组合使用是导航领域的理想选择。

例如:美国虽然其完全独立掌握GPS 的卫星资源,但为了使系统更加可靠,使导航信息100%有效,其M1坦克及其它一些重要装备上仍加装了C100电子罗盘。

1.2.2 电子罗盘主要用途电子罗盘主要用于辅助GPS导航及在静止状态获取航向,具体包括加速度和方向的定位、倾角测量等功能。

基于51单片机的电子罗盘系统的设计与实现解读

基于51单片机的电子罗盘系统的设计与实现解读

本科生毕业设计(论文)论文题目:基于51系列单片机数字电子罗盘设计与实现姓名:学号:班级:年级:专业:学院:指导教师:完成时间:2013年5 月28日作者声明本人以信誉郑重声明:所呈交的学位毕业设计(论文),是本人在指导教师指导下由本人独立撰写完成的,没有剽窃、抄袭、造假等违反道德、学术规范和其他侵权行为。

文中引用他人的文献、数据、图件、资料均已明确标注出,不包含他人成果及为获得东华理工大学或其他教育机构的学位或证书而使用过的材料。

对本设计(论文)的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。

本毕业设计(论文)引起的法律结果完全由本人承担。

本毕业设计(论文)成果归东华理工大学所有。

特此声明。

毕业设计(论文)作者(签字):签字日期:年月日本人声明:该学位论文是本人指导学生完成的研究成果,已经审阅过论文的全部内容,并能够保证题目、关键词、摘要部分中英文内容的一致性和准确性。

学位论文指导教师签名:年月日基于51系列单片机数字电子罗盘设计与实现黄飞Based on 51 single-chip digital electronic compass system design and implementationHuangFeiI摘要当今社会交通越来越发达,导航系统也随之普遍。

在以前人们大多数使用地图,看路况。

但是由于经济发展,交通路线也变化好大。

现在虽然有GPS,但是在山区有覆盖遮蔽的地方,GPS也失去作用。

汽车出巡不方便,为解决这个的问题,本文主要研究使用在汽车导航设备的能够精确定向的电子罗盘系统。

本文主要介绍磁阻式电子罗盘的工作原理,并详细介绍了磁阻传感器HMC5883、双轴加速度传感器ADXL202、AD7705转换芯片以及AT89C52单片机的磁阻式电子罗盘的硬件设计;根据传感器信号输出特点,经过AD7705模数转换后,利用AT89C52单片机处理信息功能经过分析后,经显示屏显示行驶方向。

电子罗盘模块使用手册 CMPS04-I2C.

电子罗盘模块使用手册 CMPS04-I2C.
新动力电子
CMPS04-I2C 电子罗盘模块
电子罗盘模块使用手册 CMPS04-I2C
/
概述:CMPS04-I2C 是一款高性能平面数字罗盘模块,其工作原理是通过磁阻传感器感应地球磁场的磁分 量,从而得出方位角度。该罗盘以 I2C 方式与上位进行通信。CMPS04 模块相当于一个 AT24C02 的存储器
校准的方法:
当罗盘周围磁场改变后,罗盘计算输出的角度信息将不准确,这时要对罗盘进行校准,以此对罗盘周 围磁场改变所产生的影响进行校正。方法:将罗盘水平放置发送 0x51 到命令寄存器之后均匀缓慢的旋转两 周,不可以太快,旋转一周时间应该不小于 1 分钟,一般 1 分钟旋转一周,(可以绕自身的中轴旋转,也可 以绕平面内一点作圆周运动),然后发送 0x52 到命令寄存器结束校准。
(2)电子罗盘的干扰信号 电子罗盘在稳定的磁环境下补偿适中的偏差,但是它不能补偿改变的磁干扰。比如,带直流电的电线产 生磁场,如果直流电改变,磁场大小也将改变。电源也一个变化的干扰源。 电子罗盘是消除不了变化的磁 环境干扰。
(3)电子罗盘的测量精度 国外号称是世界上精度最高的电子罗盘(C100),价格是大概 795 美元,它的航向精度能达到 0.5 度
改变目前 0xE0 设备地址( 默认出厂地址)到 0xE8,请按正确的顺序写入命令字符( 0xA0,0xAA,0xA5,0xE8 )。
这些命令必须发送正确的顺序才改变 I2C 地址,写入这个命令之间不能有其它的操作命令字符。 该命令字
符序列必须发送到命令寄存器的位置。操作完成后,你应该标签 IIC 地址,如果你忘了修改后的 IIC 地址,
你可以看发光二极管的闪烁状态。IIC 地址会在 LED 输出显示。 LED 长闪烁后就是一个 IIC 地址指示,较

基于51单片机的电子罗盘系统的设计与实现

基于51单片机的电子罗盘系统的设计与实现

本科生毕业设计(论文)论文题目:基于51系列单片机数字电子罗盘设计与实现姓名:学号:班级:年级:专业:学院:指导教师:完成时间:2013年5 月28日作者声明本人以信誉郑重声明:所呈交的学位毕业设计(论文),是本人在指导教师指导下由本人独立撰写完成的,没有剽窃、抄袭、造假等违反道德、学术规范和其他侵权行为。

文中引用他人的文献、数据、图件、资料均已明确标注出,不包含他人成果及为获得东华理工大学或其他教育机构的学位或证书而使用过的材料。

对本设计(论文)的研究做出重要贡献的个人和集体,均已在文中以明确方式标明。

本毕业设计(论文)引起的法律结果完全由本人承担。

本毕业设计(论文)成果归东华理工大学所有。

特此声明。

毕业设计(论文)作者(签字):签字日期:年月日本人声明:该学位论文是本人指导学生完成的研究成果,已经审阅过论文的全部内容,并能够保证题目、关键词、摘要部分中英文内容的一致性和准确性。

学位论文指导教师签名:年月日基于51系列单片机数字电子罗盘设计与实现黄飞Based on 51 single-chip digital electronic compass system design and implementationHuangFeiI摘要当今社会交通越来越发达,导航系统也随之普遍。

在以前人们大多数使用地图,看路况。

但是由于经济发展,交通路线也变化好大。

现在虽然有GPS,但是在山区有覆盖遮蔽的地方,GPS也失去作用。

汽车出巡不方便,为解决这个的问题,本文主要研究使用在汽车导航设备的能够精确定向的电子罗盘系统。

本文主要介绍磁阻式电子罗盘的工作原理,并详细介绍了磁阻传感器HMC5883、双轴加速度传感器ADXL202、AD7705转换芯片以及AT89C52单片机的磁阻式电子罗盘的硬件设计;根据传感器信号输出特点,经过AD7705模数转换后,利用AT89C52单片机处理信息功能经过分析后,经显示屏显示行驶方向。

诺宝RC编程软件使用说明

诺宝RC编程软件使用说明

电子罗盘 精确测量角度,输出变量为 0-359,单位为度。
时间检测 记录系统时间,单位为 0.01 秒。
变量赋值 赋予变量数值。
变量赋值在程序语言中是相当重要的工具。除了赋予各个传感器返回值以 外,变量赋值还能赋予通用变量、时间等数值,这种通用变量可以用来帮助纪录、 计算等。
双击图形
变量值赋对话框
13
(既可以选择一个图形,也可以选择多个图形的逻辑框图),用鼠标左键点住所 选图形程序直接拖动到编程者所要移动到的图形程序位置,这时这个图形程序上 面就会显示向上添加或向下添加,当松开鼠标左键时,所选移动程序就会自动移 到指定位置。如下图所示:
8
1.选定要移动的图形
2. 左键点住所选图形拖动
3. 松开鼠标左键
分构成:0.01 秒延时、0.1 秒延时和秒级延时。
模块名称
模块功能
0.01 秒延时 可以将动作执行时间定时为 0.01 秒。
0.1 秒延时 可以将动作执行时间定时为 0.1 秒。
秒级延时 可以设置动作执行时间,最大不超过 50S。
16
(6)流程控制模块 流程控制模块主要包括:条件判断模块、条件循环模块、do 条件循环模块、多
2
机器人设计步骤
第一步:设计构思、选择模块及搭建机器人 明确设计机器人所要完成什么任务,选择相应的使用模块,创造、搭建自己
的机器人,让它运动、做动作,并为机器人赋予思想(机器人控制程序),通过 输入(传感器)与输出(电机与灯等)对周围环境做出相对应回应。 第二步:编写诺宝 RC 程序
编写控制程序是设计机器人中最重要的一个步骤,因为控制程序就是机器人 的思想,也就是“人工智能”。一个人的思想决定了这个人的行为,控制程序则 决定了机器人的行为,编写控制程序即将人类思想赋予机器人。 第三步:使用仿真界面检测程序

基于C8051F321单片机的平面数字电子罗盘的研制

基于C8051F321单片机的平面数字电子罗盘的研制
及显示 程序 。 主程序 流程 图如 图4 示。 所
图2硬件 电路原理图
引言
近 年 来 ,数 字式 电 子 罗盘 正 向 深 度 智 能 化和 三维 方 向发展 。在 地 质探测 中 ,特 别 是 海底 地 形探测 ,要 保证 方位 角测 量 的高精 度 ,靠 人 工 完 成 是 很 困难 的 ,在 这 项 工 作 中 ,电子 罗盘所 起的作用 非常重 要 。 本 文采 用模块 化 设计 思想 ,设计 并 制作 个高 精 度 ,高 稳定 性的 方位 角数 据采 集模 块 ,为 数 字 电子 罗盘 系统 提供 数据 采集 ,为 确 保倾 角数 据采 集 的稳定 性和 准确性 ,采用 L M3 3 L S 0 D H传感 器集成 芯片 ,并通 过I 接 I C 口后 , 由单 片机进 行 控制 和分 析 ,实现倾 角 数 据采集 ,倾 角数据数 字化 的显示等功 能 。 系统采 用3 7 锂 电池 供电 ,整个数 据采 .V 集 模块 采 用集成 了测 量倾 角传 感器 以及 磁场 传 感器 的L M3 3 L S 0 D H芯片 , 制处 理 的单片 控 机 采用 的是 C 0 1 3 1 片 机 ,此单 片机 速 8 5F 2单 度快 , 稳定性 好 ,对 于本设计 方案 已能 满足要 求 。整 个 系统 的抗干 扰性 好 、设计 灵活 、方 便 ,而 且成 本不 高 ,也适 合于 在比较 恶 劣的 环 境下 进行 现场数 据 测量 。制 作出 的成 品能 够 进行 当地 的方位 角 ,倾 角 、环 境温 度 以及 供 电电池 电量的 数字化显 示 。 本 设计 的整 个过 程分 为以 下几 个主要 的 步骤: 1 )基于 Alim Dein r 电子 罗盘 的 tu sg e 的 电路 原理 图及 电路板的绘制 ; 2 )基于 C 0 1 3 1 8 5 F 2 的单 片机软件 编程 ; 3 )系统 软 硬件 联 合 调试 和 整 机性 能 优 化。

电子罗盘设计方案

电子罗盘设计方案

电子罗盘设计方案.doc电子罗盘设计方案 1 引言V2XE 是一种以集成微处理器作为控制和接口新型2轴罗盘和大磁场传感器[1,U2XE 使用新型系统常用3V 工作电源,具有功耗低、尺寸小、各种条件下抗噪声能力强、较大测量灵敏感应区等优点。

V2XE 结合了PNI 公司专利磁场感应传感器和测量电路技术,不受补偿漂移影响,不同温度下测量结果很稳定。

V2XE 简单易行标准SPI 接口输入/输出数据。

2 性能特点V2XE 典型特性如下功率低(3V DC,2mA 输出); 封装尺寸小(25.4mm5.4mm11.5mm); 高磁感应(0.01°); 高磁精度(2.0°); 数字接口输出(3V 标准SPI 接口); 具有高磁场感应(0.00015Gauss); 具有大磁场量程(±11Gauss)。

V2XE 引脚功能如表1所列。

将V2XE 应用于GPS 系统,用AT89C2051读取V2XE 测量数据,串口将数据传送到GPS 处理器,图1示出V2XE 连接到单片机原理图。

AT89C2051没有标准SPI 口输出[2,故分别用P1.7、P1.6和P1.5 来模拟SCLK、MISO 及MOSI 端。

V2XE 复位引脚SYNC 由P3.7脚控制,SSNOT 接,V2XE 工作从机模式。

3 数据格式和命令字V2XE 有Big Endian 和Little Endian 两种数据格式。

Big Endian 类型数据是从高位到低位存放,Little Editan 数据是倒序存放,即最高8位依次放最低8位数据,最低8位依次放最高8位数据。

如图2所示。

带有数据命令格式由开始标志(Sync Flay)、指令类别(Frame Type)和结束标志(Terminator)组成,图3所示是一个带有参数Heading(0X02)和Magnitude(0X05)SetDataComponents(0X03)命令构成。

基于磁阻芯片和MSP430单片机的电子罗盘设计_郭检柟

基于磁阻芯片和MSP430单片机的电子罗盘设计_郭检柟

第8卷 第1期信 息 与 电 子 工 程Vo1.8,No.12010年2月 INFORMATION AND ELECTRONIC ENGINEERING Feb.,2010 文章编号:1672-2892(2010)01-0012-04基于磁阻芯片和MSP430单片机的电子罗盘设计郭检柟(东南大学 IC 学院,江苏 南京 210096)摘 要:电子罗盘是一种获取载体姿态航向的设备。

介绍磁电子罗盘的工作原理及其具体实现,利用Honeywell 的HMC1022双轴磁阻传感器设计了一种小型化的电子罗盘,利用AD623高精密度放大器作信道调理电路,利用低功耗的MSP430微处理器完成A /D 转换、方位角计算以及数字化输出等工作。

采用置位/复位电路配合微处理器有效解决了传感器失调和漂移的影响。

实验表明该系统具有良好的获取航向能力,且运行稳定,功耗低,误差小于1°。

关键词:地磁场;电子罗盘;磁阻芯片;MSP430微处理器 中图分类号:TN911.72 文献标识码:ADesign of digital compass with magneto resistive chip and the MCU of MSP430GUO Jian -nan(School of IC,Southeast University,Nanjing Jiangsu 210096,China)Abstract:Digital compass is a kind of device which can acquire the carrier ’s attitude. This study introduced the principle of an electronic compass. By using magneto resistive sensor chip HMC1022 made by Honeywell,a 2-axis electronic compass was developed. The amplifier AD623 was used as the signal conditioning circuit. The MPU MSP430 was in charge of A/D converting, azimuth computing and digital outputting. And the Set/Reset(S/R) circuit was adopted so that the error due to null and drift could be minimized. Experiment results showed that the system had good ability to acquire the carrier ’s attitude with stable operation and low power consumption. The error was below 1°.Key words:geomagnetic field;digital compass;magneto resistive sensor chip;MSP4301 电子罗盘的测量原理地球的磁感应强度大约为50 μT~60 μT ,相当于沿着地球中心的一个磁棒,磁棒的两极相对于地理的两极有大约11.5°的夹角。

电子罗盘—搜狗百科

电子罗盘—搜狗百科

电子罗盘—搜狗百科电子罗盘随着科学技术的飞速发展,人类的活动范围不断扩大,从深达数千米的地层、海底到外大气层都有人类活动的痕迹。

伴随着人类活动领域的不断扩展,卫星、飞机、导弹、运动平台的稳定、微波通信天线的自动跟踪、勘探和探测等研究活动都需要定向导航技术。

因此,定向导航技术的研究在科学研究、工程领域中具有重要的意义。

电子罗盘,又称数字罗盘,在现代技术条件中电子罗盘作为导航仪器或姿态传感器已被广泛应用。

电子罗盘与传统指针式和平衡架结构罗盘相比能耗低、体积小、重量轻、精度高、可微型化,其输出信号通过处理可以实现数码显示,不仅可以用来指向,其数字信号可直接送到自动舵,控制船舶的操纵。

目前,广为使用的是三轴捷联磁阻式数字磁罗盘,这种罗盘具有抗摇动和抗振性、航向精度较高、对干扰场有电子补偿、可以集成到控制回路中进行数据链接等优点,因而广泛应用于航空、航天、机器人、航海、车辆自主导航等领域。

虽然GPS在导航、定位、测速、定向方面有着广泛的应用,但由于其信号常被地形、地物遮挡,导致精度大大降低,甚至不能使用。

尤其在高楼林立城区和植被茂密的林区,GPS信号的有效性仅为60%。

并且在静止的情况下,GPS也无法给出航向信息。

为弥补这一不足,可以采用组合导航定向的方法。

电子罗盘产品正是为满足用户的此类需求而设计的。

它可以对GPS信号进行有效补偿,保证导航定向信息100%有效,即使是在GPS信号失锁后也能正常工作,做到“丢星不丢向”。

当然,随着GPS技术的发展,采用双GPS接收机作为卫星信号传感器,利用载波测量技术和快速求解模糊度技术,精确计算出运动载体的方位角,同时可以输出俯仰角、位置、速度以及UTC等信息也可以实现静止状态给出航向信息。

目前市场典型XW-SC3600/3660定位定向系统,克服陀螺寻北的成本高、动态差和磁罗盘精度低、响应慢等缺点。

电子罗盘-218418915.doc

电子罗盘-218418915.doc

范例三电子罗盘一.系统概述本系统的目标是设计一个两轴数字罗盘系统。

对其所指的方向进行测量。

当系统工作时,系统中的磁阻传感器(HMC1022)对所在地的地磁进行A/D采集,然后对采集量进行处理,将所在的方向相对正北的角度通过串口发送给高端。

本系统可工作在正常状态和标定状态。

1 正常状态在该状态下,系统对地磁进行正常采集后进行校准,然后通过串口将计算的方向角发送出来。

2 标定状态在该状态下,系统对周围的磁场进行采集,以此为参考,推导出校准参数。

退出该状态时,将校准参数保存起来,以便用于对正常状态下采集的数据进行偏置校准。

二.系统输入/输出分析两轴数字罗盘系统的系统框图如图6-27所示。

图6-27 数字罗盘系统框图从系统框图中可以看出,两轴数字罗盘系统大体可以分为模拟量输入、开关量输出以及通信量3 类。

模拟量输入分析如表6-5所示。

表6-5 数字罗盘系统模拟量输入开关量输出分析如表6-6所示表6-6 数字罗盘系统开关量输出表6-7 数字罗盘系统通信量三.硬件设计1 芯片选型选取芯片时应该注意:不要将所有的I/O口用满,应当预留一定的输入输出端口,以便扩展需要。

通过分析数字罗盘系统的输入量和输出量,发现所需的I/O口较少,为5个。

但考虑到该系统对A/D采集精度要求较高并且要求有SCI模块以便于通信,故考虑该系统采用具有10BitA/D采集和SCI模块的MR8。

2 设计框图数字罗盘系统的硬件框图如图6-28所示,下面将分析A/D采集中的电压放大模块、HMC1022(磁阻传感器)的置位/复位电路和SCI(RS-232)通信模块。

图6-28 基于MR8的数字罗盘系统框图3 MCU引脚汇总列表数字罗盘系统中MR8的I/O口具体分配情况如表6-8所示。

表6-8 MR8的I/O分配4 模块硬件分析及设计(1) A/D采集模块在该模块中,使用MR8内部的A/D模块对HMC1022产生的两路电压采集。

考虑到在地球磁场下HMC1022输出的电压范围在-5mv~5mv之间,对于如此小的电压,模数转换器无法准确转换,因此需要对其输出电压进行放大。

电子罗盘模块

电子罗盘模块

电子罗盘模块1、概述电子罗盘模块可以检测周围的磁场强度,可应用于使运动的装置或设备转动到指定的方向等,比如安装在小车上,可以控制小车转动到指定方向或沿着指定方向行走。

模块上具有用于校准的按键和指示灯,当模块周围的机械结构或模块的安装位置(方向)发生改变时,用户可以通过下载Makeblock提供的程序并操作按键来进行校准,以使得模块在新的环境下能准确测量出角度值。

这也是本模块相比于其他商家同类型产品的优势之一。

该本模块接口是白色色标,说明是I2C通信模式,需要连接到主板上带有白色标识接口。

2、技术规格●工作电压:5V DC●分辨率:5 mil gauss●磁场动态范围:±1到±8 gauss●电子罗盘精度:可精确到1°到2°●信号模式:I2C通信●工作温度:-30到85℃●模块尺寸:52 x 24 x 18 mm (长x宽x高)3、功能特性●模块的白色区域是与金属梁接触的参考区域;●模块有两种工作模式:测量模式→蓝灯常亮,校准模式→蓝灯闪烁;●在通电后第一次使用模块时需要校准模块;●具有反接保护,电源反接不会损坏IC。

●支持Arduino IDE编程, 并且提供运行库来简化编程;●支持mBlock图形化编程,适合全年龄用户;●使用RJ25接口连线方便;●模块化安装,兼容乐高系列;●配有接头支持绝大多数Arduino系列主控板。

4、引脚定义电子罗盘模块有六个针脚的接头,每个针脚的功能如下表序号引脚功能1 GND 地线2 VCC 电源线3 SDA I2C数据接口4 SCL I2C时钟接口5 RDY 检测数据是否已采集6 KEY 检测校准按钮是否按下表 1 6-Pin 接口功能5、接线方式●RJ25连接由于电子罗盘模块接口是白色色标,当使用RJ25接口时,需要连接到主控板上带有白色色标的接口。

以Makeblock Orion为例,可以连接到3,4,6,7,8 号接口,如图图 1 电子罗盘模块与 Makeblock Orion连接●杜邦线连接当使用杜邦线连接到Arduino Uno主板时,模块SCL、SDA引脚需要连接到 I2C接口,即连接到A5、A4接口如下图所示:图 2 电子罗盘模块与 Arduino UNO 连接图注:接杜邦线时,模块上需要焊接排针。

3轴电子罗盘HM5883应用

3轴电子罗盘HM5883应用

1.原理图2.程序[1] 头文件1/****************************************Copyright (c)************************************************** **** ****--------------File Info-------------------------------------------------------------------------------** File name: 24C02.h** Descriptions: 24C02 操作函数库****------------------------------------------------------------------------------------------------------** Created by: A VRman** Created date: 2010-10-29** V ersion: 1.0** Descriptions: The original version****------------------------------------------------------------------------------------------------------** Modified by:** Modified date:** V ersion:** Descriptions:********************************************************************************************************/ #ifndef __HMC5883L_H#define __HMC5883L_H/* Includes ------------------------------------------------------------------*/#include "stm32f10x_lib.h"#include "GrobalV ariable.h"/* Private define ------------------------------------------------------------*/#define A T24C01A /* 24C01A,I2C时序和往后的24C02一样*///#define A T24C01 /* 24C01,I2C的时序和普通的有点不同*/#define ADDR_24LC02 0xA0#define I2C_P AGESIZE 4 /* 24C01/01A页缓冲是4个*//* Private function prototypes -----------------------------------------------*/void I2C_Configuration(void);u8 I2C_Read(I2C_TypeDef *I2Cx,u8 I2C_Addr,u8 addr,u8 *buf,u16 num);u8 I2C_Write(I2C_TypeDef *I2Cx,u8 I2C_Addr,u8 addr,u8 *buf,u16 num);///void HMC5883L_test(void);void Axia3AngInit(void) ;void Detect3AxiaAng(void);#endif/********************************************************************************************************* END FILE*********************************************************************************************************/ [2] 头文件2/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************* File Name : stm32f10x_i2c.h* Author : MCD Application T eam* V ersion : V2.0.1* Date : 06/13/2008* Description : This file contains all the functions prototypes for the* I2C firmware library.********************************************************************************* THE PRESENT FIRMW ARE WHICH IS FOR GUIDANCE ONL Y AIMS A T PROVIDING CUSTOMERS* WITH CODING INFORMA TION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SA VE TIME.* AS A RESUL T, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE* CONTENT OF SUCH FIRMW ARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING* INFORMA TION CONT AINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.*******************************************************************************//* Define to prevent recursive inclusion -------------------------------------*/#ifndef __STM32F10x_I2C_H#define __STM32F10x_I2C_H/* Includes ------------------------------------------------------------------*/#include "stm32f10x_map.h"/* Exported types ------------------------------------------------------------*//* I2C Init structure definition */typedef struct{u16 I2C_Mode;u16 I2C_DutyCycle;u16 I2C_OwnAddress1;u16 I2C_Ack;u16 I2C_AcknowledgedAddress;u32 I2C_ClockSpeed;}I2C_InitTypeDef;/* Exported constants --------------------------------------------------------*/#define IS_I2C_ALL_PERIPH(PERIPH) (((*(u32*)&(PERIPH)) == I2C1_BASE) || \((*(u32*)&(PERIPH)) == I2C2_BASE))/* I2C modes */#define I2C_Mode_I2C ((u16)0x0000)#define I2C_Mode_SMBusDevice ((u16)0x0002)#define I2C_Mode_SMBusHost ((u16)0x000A)#define IS_I2C_MODE(MODE) (((MODE) == I2C_Mode_I2C) || \((MODE) == I2C_Mode_SMBusDevice) || \((MODE) == I2C_Mode_SMBusHost))/* I2C duty cycle in fast mode */#define I2C_DutyCycle_16_9 ((u16)0x4000)#define I2C_DutyCycle_2 ((u16)0xBFFF)#define IS_I2C_DUTY_CYCLE(CYCLE) (((CYCLE) == I2C_DutyCycle_16_9) || \((CYCLE) == I2C_DutyCycle_2))/* I2C cknowledgementy */#define I2C_Ack_Enable ((u16)0x0400)#define I2C_Ack_Disable ((u16)0x0000)#define IS_I2C_ACK_ST A TE(ST A TE) (((ST A TE) == I2C_Ack_Enable) || \((ST A TE) == I2C_Ack_Disable))/* I2C transfer direction */#define I2C_Direction_Transmitter ((u8)0x00)#define I2C_Direction_Receiver ((u8)0x01)#define IS_I2C_DIRECTION(DIRECTION) (((DIRECTION) == I2C_Direction_Transmitter) || \((DIRECTION) == I2C_Direction_Receiver))/* I2C acknowledged address defines */#define I2C_AcknowledgedAddress_7bit ((u16)0x4000)#define I2C_AcknowledgedAddress_10bit ((u16)0xC000)#define IS_I2C_ACKNOWLEDGE_ADDRESS(ADDRESS) (((ADDRESS) == I2C_AcknowledgedAddress_7bit) || \((ADDRESS) == I2C_AcknowledgedAddress_10bit))/* I2C registers */#define I2C_Register_CR1 ((u8)0x00)#define I2C_Register_CR2 ((u8)0x04)#define I2C_Register_OAR1 ((u8)0x08)#define I2C_Register_OAR2 ((u8)0x0C)#define I2C_Register_DR ((u8)0x10)#define I2C_Register_SR1 ((u8)0x14)#define I2C_Register_SR2 ((u8)0x18)#define I2C_Register_CCR ((u8)0x1C)#define I2C_Register_TRISE ((u8)0x20)#define IS_I2C_REGISTER(REGISTER) (((REGISTER) == I2C_Register_CR1) || \((REGISTER) == I2C_Register_CR2) || \((REGISTER) == I2C_Register_OAR1) || \((REGISTER) == I2C_Register_OAR2) || \((REGISTER) == I2C_Register_DR) || \((REGISTER) == I2C_Register_SR1) || \((REGISTER) == I2C_Register_SR2) || \((REGISTER) == I2C_Register_CCR) || \((REGISTER) == I2C_Register_TRISE))/* I2C SMBus alert pin level */#define I2C_SMBusAlert_Low ((u16)0x2000)#define I2C_SMBusAlert_High ((u16)0xDFFF)#define IS_I2C_SMBUS_ALERT(ALERT) (((ALERT) == I2C_SMBusAlert_Low) || \((ALERT) == I2C_SMBusAlert_High))/* I2C PEC position */#define I2C_PECPosition_Next ((u16)0x0800)#define I2C_PECPosition_Current ((u16)0xF7FF)#define IS_I2C_PEC_POSITION(POSITION) (((POSITION) == I2C_PECPosition_Next) || \((POSITION) == I2C_PECPosition_Current))/* I2C interrupts definition */#define I2C_IT_BUF ((u16)0x0400)#define I2C_IT_EVT ((u16)0x0200)#define I2C_IT_ERR ((u16)0x0100)#define IS_I2C_CONFIG_IT(IT) ((((IT) & (u16)0xF8FF) == 0x00) && ((IT) != 0x00))/* I2C interrupts definition */#define I2C_IT_SMBALERT ((u32)0x10008000)#define I2C_IT_TIMEOUT ((u32)0x10004000)#define I2C_IT_PECERR ((u32)0x10001000)#define I2C_IT_OVR ((u32)0x10000800)#define I2C_IT_AF ((u32)0x10000400)#define I2C_IT_ARLO ((u32)0x10000200)#define I2C_IT_BERR ((u32)0x10000100)#define I2C_IT_TXE ((u32)0x00000080)#define I2C_IT_RXNE ((u32)0x00000040)#define I2C_IT_STOPF ((u32)0x60000010)#define I2C_IT_ADD10 ((u32)0x20000008)#define I2C_IT_BTF ((u32)0x60000004)#define I2C_IT_ADDR ((u32)0xA0000002)#define I2C_IT_SB ((u32)0x20000001)#define IS_I2C_CLEAR_IT(IT) (((IT) == I2C_IT_SMBALERT) || ((IT) == I2C_IT_TIMEOUT) || \((IT) == I2C_IT_PECERR) || ((IT) == I2C_IT_OVR) || \((IT) == I2C_IT_AF) || ((IT) == I2C_IT_ARLO) || \((IT) == I2C_IT_BERR) || ((IT) == I2C_IT_STOPF) || \((IT) == I2C_IT_ADD10) || ((IT) == I2C_IT_BTF) || \((IT) == I2C_IT_ADDR) || ((IT) == I2C_IT_SB))#define IS_I2C_GET_IT(IT) (((IT) == I2C_IT_SMBALERT) || ((IT) == I2C_IT_TIMEOUT) || \((IT) == I2C_IT_PECERR) || ((IT) == I2C_IT_OVR) || \((IT) == I2C_IT_AF) || ((IT) == I2C_IT_ARLO) || \((IT) == I2C_IT_BERR) || ((IT) == I2C_IT_TXE) || \((IT) == I2C_IT_RXNE) || ((IT) == I2C_IT_STOPF) || \((IT) == I2C_IT_ADD10) || ((IT) == I2C_IT_BTF) || \((IT) == I2C_IT_ADDR) || ((IT) == I2C_IT_SB))/* I2C flags definition */#define I2C_FLAG_DUALF ((u32)0x00800000)#define I2C_FLAG_SMBHOST ((u32)0x00400000)#define I2C_FLAG_SMBDEF AUL T ((u32)0x00200000)#define I2C_FLAG_GENCALL ((u32)0x00100000)#define I2C_FLAG_TRA ((u32)0x00040000)#define I2C_FLAG_BUSY ((u32)0x00020000)#define I2C_FLAG_MSL ((u32)0x00010000)#define I2C_FLAG_SMBALERT ((u32)0x10008000)#define I2C_FLAG_TIMEOUT ((u32)0x10004000)#define I2C_FLAG_PECERR ((u32)0x10001000)#define I2C_FLAG_OVR ((u32)0x10000800)#define I2C_FLAG_AF ((u32)0x10000400)#define I2C_FLAG_ARLO ((u32)0x10000200)#define I2C_FLAG_BERR ((u32)0x10000100)#define I2C_FLAG_TXE ((u32)0x00000080)#define I2C_FLAG_RXNE ((u32)0x00000040)#define I2C_FLAG_STOPF ((u32)0x60000010)#define I2C_FLAG_ADD10 ((u32)0x20000008)#define I2C_FLAG_BTF ((u32)0x60000004)#define I2C_FLAG_ADDR ((u32)0xA0000002)#define I2C_FLAG_SB ((u32)0x20000001)#define IS_I2C_CLEAR_FLAG(FLAG) (((FLAG) == I2C_FLAG_SMBALERT) || ((FLAG) == I2C_FLAG_TIMEOUT) || \((FLAG) == I2C_FLAG_PECERR) || ((FLAG) == I2C_FLAG_OVR) || \((FLAG) == I2C_FLAG_AF) || ((FLAG) == I2C_FLAG_ARLO) || \((FLAG) == I2C_FLAG_BERR) || ((FLAG) == I2C_FLAG_STOPF) || \((FLAG) == I2C_FLAG_ADD10) || ((FLAG) == I2C_FLAG_BTF) || \((FLAG) == I2C_FLAG_ADDR) || ((FLAG) == I2C_FLAG_SB))#define IS_I2C_GET_FLAG(FLAG) (((FLAG) == I2C_FLAG_DUALF) || ((FLAG) == I2C_FLAG_SMBHOST) || \((FLAG) == I2C_FLAG_SMBDEF AUL T) || ((FLAG) == I2C_FLAG_GENCALL) || \((FLAG) == I2C_FLAG_TRA) || ((FLAG) == I2C_FLAG_BUSY) || \((FLAG) == I2C_FLAG_MSL) || ((FLAG) == I2C_FLAG_SMBALERT) || \((FLAG) == I2C_FLAG_TIMEOUT) || ((FLAG) == I2C_FLAG_PECERR) || \((FLAG) == I2C_FLAG_OVR) || ((FLAG) == I2C_FLAG_AF) || \((FLAG) == I2C_FLAG_ARLO) || ((FLAG) == I2C_FLAG_BERR) || \((FLAG) == I2C_FLAG_TXE) || ((FLAG) == I2C_FLAG_RXNE) || \((FLAG) == I2C_FLAG_STOPF) || ((FLAG) == I2C_FLAG_ADD10) || \((FLAG) == I2C_FLAG_BTF) || ((FLAG) == I2C_FLAG_ADDR) || \((FLAG) == I2C_FLAG_SB))/* I2C Events *//* EV1 */#define I2C_EVENT_SLA VE_TRANSMITTER_ADDRESS_MA TCHED ((u32)0x00060082) /* TRA, BUSY, TXE and ADDR flags */#define I2C_EVENT_SLA VE_RECEIVER_ADDRESS_MA TCHED ((u32)0x00020002) /* BUSY and ADDR flags */#define I2C_EVENT_SLA VE_TRANSMITTER_SECONDADDRESS_MA TCHED ((u32)0x00860080) /* DUALF, TRA, BUSY and TXE flags */#define I2C_EVENT_SLA VE_RECEIVER_SECONDADDRESS_MA TCHED ((u32)0x00820000) /* DUALF and BUSY flags */#define I2C_EVENT_SLA VE_GENERALCALLADDRESS_MA TCHED ((u32)0x00120000) /* GENCALL and BUSY flags *//* EV2 */#define I2C_EVENT_SLA VE_BYTE_RECEIVED ((u32)0x00020040) /* BUSY and RXNE flags *//* EV3 */#define I2C_EVENT_SLA VE_BYTE_TRANSMITTED ((u32)0x00060084) /* TRA, BUSY, TXE and BTF flags *//* EV4 */#define I2C_EVENT_SLA VE_STOP_DETECTED ((u32)0x00000010) /* STOPF flag *//* EV5 */#define I2C_EVENT_MASTER_MODE_SELECT ((u32)0x00030001) /* BUSY, MSL and SB flag *//* EV6 */#define I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED ((u32)0x00070082) /* BUSY, MSL, ADDR, TXE and TRA flags */#define I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED ((u32)0x00030002) /* BUSY, MSL and ADDR flags *//* EV7 */#define I2C_EVENT_MASTER_BYTE_RECEIVED ((u32)0x00030040) /* BUSY, MSL and RXNE flags *//* EV8 */#define I2C_EVENT_MASTER_BYTE_TRANSMITTED ((u32)0x00070084) /* TRA, BUSY, MSL, TXE and BTF flags *//* EV9 */#define I2C_EVENT_MASTER_MODE_ADDRESS10 ((u32)0x00030008) /* BUSY, MSL and ADD10 flags *//* EV3_2 */#define I2C_EVENT_SLA VE_ACK_F AILURE ((u32)0x00000400) /* AF flag */#define IS_I2C_EVENT(EVENT) (((EVENT) == I2C_EVENT_SLA VE_TRANSMITTER_ADDRESS_MA TCHED) || \((EVENT) == I2C_EVENT_SLA VE_RECEIVER_ADDRESS_MA TCHED) || \((EVENT) == I2C_EVENT_SLA VE_TRANSMITTER_SECONDADDRESS_MA TCHED) || \((EVENT) == I2C_EVENT_SLA VE_RECEIVER_SECONDADDRESS_MA TCHED) || \((EVENT) == I2C_EVENT_SLA VE_GENERALCALLADDRESS_MA TCHED) || \((EVENT) == I2C_EVENT_SLA VE_BYTE_RECEIVED) || \((EVENT) == (I2C_EVENT_SLA VE_BYTE_RECEIVED | I2C_FLAG_DUALF)) || \((EVENT) == (I2C_EVENT_SLA VE_BYTE_RECEIVED | I2C_FLAG_GENCALL)) || \((EVENT) == I2C_EVENT_SLA VE_BYTE_TRANSMITTED) || \((EVENT) == (I2C_EVENT_SLA VE_BYTE_TRANSMITTED | I2C_FLAG_DUALF)) || \((EVENT) == (I2C_EVENT_SLA VE_BYTE_TRANSMITTED | I2C_FLAG_GENCALL)) || \((EVENT) == I2C_EVENT_SLA VE_STOP_DETECTED) || \((EVENT) == I2C_EVENT_MASTER_MODE_SELECT) || \((EVENT) == I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED) || \((EVENT) == I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED) || \((EVENT) == I2C_EVENT_MASTER_BYTE_RECEIVED) || \((EVENT) == I2C_EVENT_MASTER_BYTE_TRANSMITTED) || \((EVENT) == I2C_EVENT_MASTER_MODE_ADDRESS10) || \((EVENT) == I2C_EVENT_SLA VE_ACK_F AILURE))/* I2C own address1 -----------------------------------------------------------*/#define IS_I2C_OWN_ADDRESS1(ADDRESS1) ((ADDRESS1) <= 0x3FF)/* I2C clock speed ------------------------------------------------------------*/#define IS_I2C_CLOCK_SPEED(SPEED) (((SPEED) >= 0x1) && ((SPEED) <= 400000))/* Exported macro ------------------------------------------------------------*//* Exported functions ------------------------------------------------------- */void I2C_DeInit(I2C_TypeDef* I2Cx);void I2C_Init(I2C_TypeDef* I2Cx, I2C_InitTypeDef* I2C_InitStruct);void I2C_StructInit(I2C_InitTypeDef* I2C_InitStruct);void I2C_Cmd(I2C_TypeDef* I2Cx, FunctionalState NewState);void I2C_DMACmd(I2C_TypeDef* I2Cx, FunctionalState NewState);void I2C_DMALastTransferCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);void I2C_GenerateST ART(I2C_TypeDef* I2Cx, FunctionalState NewState);void I2C_GenerateSTOP(I2C_T ypeDef* I2Cx, FunctionalState NewState);void I2C_AcknowledgeConfig(I2C_TypeDef* I2Cx, FunctionalState NewState);void I2C_OwnAddress2Config(I2C_TypeDef* I2Cx, u8 Address);void I2C_DualAddressCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);void I2C_GeneralCallCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);void I2C_ITConfig(I2C_TypeDef* I2Cx, u16 I2C_IT, FunctionalState NewState);void I2C_SendData(I2C_TypeDef* I2Cx, u8 Data);u8 I2C_ReceiveData(I2C_TypeDef* I2Cx);void I2C_Send7bitAddress(I2C_TypeDef* I2Cx, u8 Address, u8 I2C_Direction);u16 I2C_ReadRegister(I2C_TypeDef* I2Cx, u8 I2C_Register);void I2C_SoftwareResetCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);void I2C_SMBusAlertConfig(I2C_TypeDef* I2Cx, u16 I2C_SMBusAlert);void I2C_TransmitPEC(I2C_TypeDef* I2Cx, FunctionalState NewState);void I2C_PECPositionConfig(I2C_TypeDef* I2Cx, u16 I2C_PECPosition);void I2C_CalculatePEC(I2C_TypeDef* I2Cx, FunctionalState NewState);u8 I2C_GetPEC(I2C_TypeDef* I2Cx);void I2C_ARPCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);void I2C_StretchClockCmd(I2C_TypeDef* I2Cx, FunctionalState NewState);void I2C_FastModeDutyCycleConfig(I2C_TypeDef* I2Cx, u16 I2C_DutyCycle);u32 I2C_GetLastEvent(I2C_TypeDef* I2Cx);ErrorStatus I2C_CheckEvent(I2C_TypeDef* I2Cx, u32 I2C_EVENT);FlagStatus I2C_GetFlagStatus(I2C_TypeDef* I2Cx, u32 I2C_FLAG);void I2C_ClearFlag(I2C_TypeDef* I2Cx, u32 I2C_FLAG);ITStatus I2C_GetITStatus(I2C_TypeDef* I2Cx, u32 I2C_IT);void I2C_ClearITPendingBit(I2C_TypeDef* I2Cx, u32 I2C_IT);#endif /*__STM32F10x_I2C_H *//******************* (C) COPYRIGHT 2008 STMicroelectronics *****END OF FILE****/[3] 源文件1/****************************************Copyright (c)****************************************************** ****--------------File Info-------------------------------------------------------------------------------** File name: 24C02.c** Descriptions: 24C02 操作函数库****------------------------------------------------------------------------------------------------------** Created by: A VRman** Created date: 2010-10-29** V ersion: 1.0** Descriptions: The original version****------------------------------------------------------------------------------------------------------** Modified by:** Modified date:** V ersion:** Descriptions:********************************************************************************************************//* Includes ------------------------------------------------------------------*/#include "HMC5883L.h"#include "Grobalfunction.h"/******************************************************************************** Function Name : I2C_Configuration* Description : EEPROM管脚配置* Input : None* Output : None* Return : None* Attention : None*******************************************************************************/void I2C_Configuration(void){I2C_InitTypeDef I2C_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO , ENABLE);/* Configure I2C1 pins: PB6->SCL and PB7->SDA */GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9;///6,7->8,9GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD;GPIO_Init(GPIOB, &GPIO_InitStructure);I2C_DeInit(I2C1);I2C_InitStructure.I2C_Mode = I2C_Mode_I2C;I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2;I2C_InitStructure.I2C_OwnAddress1 = 0x30;I2C_InitStructure.I2C_Ack = I2C_Ack_Enable;I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit;I2C_InitStructure.I2C_ClockSpeed = 100000; /* 100K速度*/I2C_Cmd(I2C1, ENABLE);I2C_Init(I2C1, &I2C_InitStructure);/*允许1字节1应答模式*/I2C_AcknowledgeConfig(I2C1, ENABLE);}/******************************************************************************* * Function Name : I2C_delay* Description : 延迟时间* Input : None* Output : None* Return : None* Attention : None*******************************************************************************/ static void I2C_delay(u16 cnt){while(cnt--);}/******************************************************************************* * Function Name : I2C_AcknowledgePolling* Description : 等待获取I2C总线控制权判断忙状态* Input : - I2Cx:I2C寄存器基址* - I2C_Addr:从器件地址* Output : None* Return : None* Attention : None*******************************************************************************/ static void I2C_AcknowledgePolling(I2C_TypeDef *I2Cx,u8 I2C_Addr){vu16 SR1_Tmp;do{I2C_GenerateST ART(I2Cx, ENABLE); /*起始位*//*读SR1*/SR1_Tmp = I2C_ReadRegister(I2Cx, I2C_Register_SR1);/*器件地址(写)*/#ifdef A T24C01AI2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Transmitter);#elseI2C_Send7bitAddress(I2Cx, 0, I2C_Direction_Transmitter);#endif}while(!(I2C_ReadRegister(I2Cx, I2C_Register_SR1) & 0x0002));I2C_ClearFlag(I2Cx, I2C_FLAG_AF);I2C_GenerateSTOP(I2Cx, ENABLE); /*停止位*/}/******************************************************************************** Function Name : I2C_Read* Description : 通过指定I2C接口读取多个字节数据* Input : - I2Cx:I2C寄存器基址* - I2C_Addr:从器件地址* - addr:预读取字节存储位置* - *buf:读取数据的存储位置* - num:读取字节数* Output : None* Return : 成功返回0* Attention : None*******************************************************************************/u8 I2C_Read(I2C_TypeDef *I2Cx,u8 I2C_Addr,u8 addr,u8 *buf,u16 num){///u16 angle;if(num==0)return 1;while(I2C_GetFlagStatus(I2Cx, I2C_FLAG_BUSY));/*允许1字节1应答模式*/I2C_AcknowledgeConfig(I2Cx, ENABLE);/* 发送起始位*/I2C_GenerateST ART(I2Cx, ENABLE);while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));/*EV5,主模式*////#ifdef A T24C01A/*发送器件地址(写)*/I2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Transmitter);while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));/*发送地址*/I2C_SendData(I2Cx, addr);while (!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED));/*数据已发送*/ /*起始位*/I2C_GenerateST ART(I2Cx, ENABLE);while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));/*器件读*/I2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Receiver);/// while(1);while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));///#else/*发送器件地址(读)24C01*//// I2C_Send7bitAddress(I2Cx, addr<<1, I2C_Direction_Receiver);/// while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));///#endifwhile (num){if(num==1){I2C_AcknowledgeConfig(I2Cx, DISABLE); /* 最后一位后要关闭应答的*/ I2C_GenerateSTOP(I2Cx, ENABLE); /* 发送停止位*/return 0;}/*器件读*//// I2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Receiver);while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_RECEIVED)); /* EV7 */*buf = I2C_ReceiveData(I2Cx);buf++;/* Decrement the read bytes counter */num--;/// I2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Receiver);/// while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED));}/* 再次允许应答模式*/I2C_AcknowledgeConfig(I2Cx, ENABLE);return 0;}/******************************************************************************** Function Name : I2C_WriteOneByte* Description : 通过指定I2C接口写入一个字节数据* Input : - I2Cx:I2C寄存器基址* - I2C_Addr:从器件地址* - addr:预写入字节地址* - value:写入数据* Output : None* Return : 成功返回0* Attention : None*******************************************************************************/u8 I2C_WriteOneByte(I2C_TypeDef *I2Cx,u8 I2C_Addr,u8 addr,u8 value){/* 起始位*/I2C_GenerateST ART(I2Cx, ENABLE);while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_MODE_SELECT));///#ifdef A T24C01A/* 发送器件地址(写)*/I2C_Send7bitAddress(I2Cx, I2C_Addr, I2C_Direction_Transmitter);while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED));/*发送地址*/I2C_SendData(I2Cx, addr);while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED));///#else/// I2C_Send7bitAddress(I2Cx, addr<<1, I2C_Direction_Transmitter);/// while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); ///#endif/* 写一个字节*/I2C_SendData(I2Cx, value);while(!I2C_CheckEvent(I2Cx, I2C_EVENT_MASTER_BYTE_TRANSMITTED));/* 停止位*/I2C_GenerateSTOP(I2Cx, ENABLE);I2C_AcknowledgePolling(I2Cx,I2C_Addr);I2C_delay(1000);return 0;}/******************************************************************************** Function Name : I2C_Write* Description : 通过指定I2C接口写入多个字节数据* Input : - I2Cx:I2C寄存器基址* - I2C_Addr:从器件地址* - addr:预写入字节地址* - *buf:预写入数据存储位置* - num:写入字节数* Output : None* Return : 成功返回0* Attention : None*******************************************************************************/u8 I2C_Write(I2C_TypeDef *I2Cx,u8 I2C_Addr,u8 addr,u8 *buf,u16 num){u8 err=0;while(num--){if(I2C_WriteOneByte(I2Cx, I2C_Addr,addr++,*buf++)){err++;}}if(err)return 1;elsereturn 0;}//初始化HMC5883,根据需要请参考pdf进行修改****void Init_HMC5883(){///Single_Write_HMC5883(0x02,0x00); //I2C_WriteOneByte(I2C1,0x3c,0x02,0);}/************************************************************************************************************/ /******************************************************************************** Function Name : void Axia3AngInit(void).* Description : Read 3 axia angle data from HMC5883 then process the data.* Input : - I2Cx:I2C寄存器基址* - I2C_Addr:从器件地址* - addr:预写入字节地址* - value:写入数据* Output : None* Return : 成功返回0* Attention : None*******************************************************************************/void Axia3AngInit(void){I2C_Configuration();Init_HMC5883();}/************************************************************************************************************//************************************************************************************************************/ /******************************************************************************** Function Name : Detect3AxiaAng();* Description : Read 3 axia angle data from HMC5883 then process the data.* Input : - I2Cx:I2C寄存器基址* - I2C_Addr:从器件地址* - addr:预写入字节地址* - value:写入数据* Output : None* Return : 成功返回0* Attention : None*******************************************************************************/void Detect3AxiaAng(void){I2C_Read(I2C1,0x3C,0x03,BUF,7);//Axia3Ang_x=BUF[0] << 8 | BUF[1]; //Combine MSB and LSB of X Data output registerAxia3Ang_z=BUF[2] << 8 | BUF[3]; //Combine MSB and LSB of Z Data output registerAxia3Ang_y=BUF[4] << 8 | BUF[5]; //Combine MSB and LSB of Y Data output register/*//Get float dataAxia3Ang_xF=Axia3Ang_x*0.0 BUF[0] << 8 | BUF[1]; //Combine MSB and LSB of X Data output registerAxia3Ang_zF=Axia3Ang_x* BUF[2] << 8 | BUF[3]; //Combine MSB and LSB of Z Data output registerAxia3Ang_yF=Axia3Ang_x* BUF[4] << 8 | BUF[5]; //Combine MSB and LSB of Y Data output register// delay_ms(500);*/}//*********************************************************//主程序********//*********************************************************void HMC5883L_test(void ){ // bit sign_bit;///unsigned int i;///int x,y,z;///double angle;I2C_Configuration();Init_HMC5883();while(1) //循环{///// Multiple_Read_HMC5883(); //连续读出数据,存储在BUF中///loop1:I2C_Read(I2C1,0x3C,0x03,BUF,7);////---------显示X轴delay_ms(10);/// goto loop1;/// while(1);Axia3Ang_x=BUF[0] << 8 | BUF[1]; //Combine MSB and LSB of X Data output registerAxia3Ang_z=BUF[2] << 8 | BUF[3]; //Combine MSB and LSB of Z Data output registerAxia3Ang_y=BUF[4] << 8 | BUF[5]; //Combine MSB and LSB of Y Data output registerdelay_ms(500);/// angle= atan2((double)y,(double)x) * (180 / 3.14159265) + 180; // angle in degrees/// angle*=10;///conversion(angle); //计算数据和显示///for (i=0;i<10000;i++); //延时}}/********************************************************************************************************* END FILE*********************************************************************************************************/[4] 源文件4/******************** (C) COPYRIGHT 2008 STMicroelectronics ********************* File Name : stm32f10x_i2c.c* Author : MCD Application T eam* V ersion : V2.0.1* Date : 06/13/2008* Description : This file provides all the I2C firmware functions.********************************************************************************* THE PRESENT FIRMW ARE WHICH IS FOR GUIDANCE ONL Y AIMS A T PROVIDING CUSTOMERS* WITH CODING INFORMA TION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SA VE TIME. * AS A RESUL T, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE * CONTENT OF SUCH FIRMW ARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING* INFORMA TION CONT AINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.*******************************************************************************//* Includes ------------------------------------------------------------------*/#include "stm32f10x_i2c.h"#include "stm32f10x_rcc.h"/* Private typedef -----------------------------------------------------------*//* Private define ------------------------------------------------------------*//* I2C SPE mask */#define CR1_PE_Set ((u16)0x0001)#define CR1_PE_Reset ((u16)0xFFFE)/* I2C ST ART mask */#define CR1_ST ART_Set ((u16)0x0100)#define CR1_ST ART_Reset ((u16)0xFEFF)/* I2C STOP mask */#define CR1_STOP_Set ((u16)0x0200)#define CR1_STOP_Reset ((u16)0xFDFF)/* I2C ACK mask */#define CR1_ACK_Set ((u16)0x0400)#define CR1_ACK_Reset ((u16)0xFBFF)/* I2C ENGC mask */#define CR1_ENGC_Set ((u16)0x0040)#define CR1_ENGC_Reset ((u16)0xFFBF)/* I2C SWRST mask */#define CR1_SWRST_Set ((u16)0x8000)#define CR1_SWRST_Reset ((u16)0x7FFF)/* I2C PEC mask */#define CR1_PEC_Set ((u16)0x1000)#define CR1_PEC_Reset ((u16)0xEFFF)/* I2C ENPEC mask */#define CR1_ENPEC_Set ((u16)0x0020)#define CR1_ENPEC_Reset ((u16)0xFFDF)/* I2C ENARP mask */#define CR1_ENARP_Set ((u16)0x0010)#define CR1_ENARP_Reset ((u16)0xFFEF)/* I2C NOSTRETCH mask */#define CR1_NOSTRETCH_Set ((u16)0x0080)。

数字电子罗盘HMR3000的特性及应用

数字电子罗盘HMR3000的特性及应用
HMR3000 有四个工作模式:连续工作模式、选通 工作模式、睡眠工作模式和校准模式。HMR3000 可在 连续模式和选通模式下工作。连续模式下,以可组态 的速率输出罗盘主动提供的 NMEA 标准信息。选通模 式下则根据用户控制电路的申请输出。 2.2 控制特性
使用前面叙述的串口协议,外部的主机可以用下 面的指令直接操作 HMR3000。现把一些较重要输入指 令列在表 1 中。
char stop[]={'#','F','A','0','.','3','=','0','*','2','7','\15','\12','\0'};
char acq[]={'#','B','A','4','H','?','*','4','0','\15','\12','\0'};
len=strlen(acq);
LE=strlen(stop); outport(0x3fb,0x80);
/*串口初始化:波特率
19200,1位起始位*/
outport(0x3f9,0); outport(0x3f8,0x06); /*8位数据位,1位停
止位,无奇偶校验*/
outport(0x3fb,7);
outport(0x3f9,0); for(i=0;i<LE;i++)

GY电子罗盘51单片机IIC程序

GY电子罗盘51单片机IIC程序

// GY-26 IIC测试程序// 使用单片机STC89C51// 晶振:11.0592M// 显示:LCD1602// 编译环境Keil uVision2// 程序中把模块当24c04进行通信#include <REG51.H>#include <math.h> //Keil library#include <stdio.h> //Keil library#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define DataPort P0 //LCD1602数据端口#define WriteDeviceAddress 0xe0 //定义器件在IIC总线中的地址#define ReadDeviceAddress 0xe1 //器件在IIC总线中地址+1 typedef unsigned char BYTE;typedef unsigned short WORD;BYTE BUF[8]; //数据缓存区BYTE code res[6] _at_ 0x23;sbit SCL=P1^0; //iic时钟引脚定义sbit SDA=P1^1; //iic数据引脚定义sbit LCM_RS=P2^0; //LCD1602命令端口sbit LCM_RW=P2^1; //LCD1602命令端口sbit LCM_EN=P2^2; //LCD1602命令端口sbit KEY_1 =P2^6; //按键1sbit KEY_2 =P2^5; //按键2sbit KEY_3 =P2^4; //按键3sbit KEY_4 =P2^3; //按键4uchar templ,temph,cnt;uchar ge,shi,bai,qian;uint dis_data,dis_data1;void delay(unsigned int k);void InitLcd();void WriteDataLCM(uchar dataW);void WriteCommandLCM(uchar CMD,uchar Attribc);void DisplayOneChar(uchar X,uchar Y,uchar DData);uchar HEX_TO_ASCII(uchar HEX_data);void conversion(uint temp_data);//------------------------------------void Delay5us();void Delay5ms();void AT24C04_Start();void AT24C04_Stop();void AT24C04_SendACK(bit ack);bit AT24C04_RecvACK();void AT24C04_SendByte(BYTE dat);BYTE AT24C04_RecvByte();void AT24C04_ReadPage();void AT24C04_WritePage();void read_cmp(void);//-----------------------------------void cal_on();void cal_off();void recovery_factory();void CMP_OFFS();void IIC_ADDR_Change();void delay_10ms();//********************************************************* uchar HEX_TO_ASCII(uchar HEX_data){uchar ASCII_data;switch(HEX_data){case 0x00:ASCII_data=0x30;break;case 0x01:ASCII_data=0x31;break;case 0x02:ASCII_data=0x32;break;case 0x03:ASCII_data=0x33;break;case 0x04:ASCII_data=0x34;break;case 0x05:ASCII_data=0x35;break;case 0x06:ASCII_data=0x36;break;case 0x07:ASCII_data=0x37;break;case 0x08:ASCII_data=0x38;break;case 0x09:ASCII_data=0x39;break;case 0x0a:ASCII_data=0x41;break;case 0x0b:ASCII_data=0x42;break;case 0x0c:ASCII_data=0x43;break;case 0x0d:ASCII_data=0x44;break;case 0x0e:ASCII_data=0x45;break;case 0x0f:ASCII_data=0x46;break;}return(ASCII_data);}//********************************************************* void conversion(uint temp_data){uchar ge_data,shi_data,bai_data ,qian_data;qian_data=temp_data/1000 ;temp_data=temp_data%1000; //取余运算bai_data=temp_data/100 ;temp_data=temp_data%100; //取余运算shi_data=temp_data/10 ;temp_data=temp_data%10; //取余运算ge_data=temp_data;qian= qian_data;bai = bai_data;shi = shi_data;ge = ge_data ;}//********************************************************* void main(){unsigned int i;delay(500);InitLcd();EA=0;cnt=0;while(1) //循环{read_cmp(); //读出数据//---------显示角度dis_data=0;dis_data=BUF[1];dis_data<<=8;dis_data|=BUF[2];conversion(dis_data);ge=HEX_TO_ASCII(ge);shi=HEX_TO_ASCII(shi);bai=HEX_TO_ASCII(bai);qian=HEX_TO_ASCII(qian);DisplayOneChar(0,0,qian);DisplayOneChar(1,0,bai);DisplayOneChar(3,0,'.');DisplayOneChar(4,0,ge);//---------显示温度dis_data=0;dis_data=BUF[5];dis_data<<=8;dis_data|=BUF[6];if(dis_data>4095){ //如果bit-12为1,即符号位为负DisplayOneChar(0,1,'-'); //显示负号dis_data&=0xefff; //清符号位}else DisplayOneChar(0,1,' ');//如果bit-12为0,空格,清空conversion(dis_data);ge=HEX_TO_ASCII(ge);shi=HEX_TO_ASCII(shi);bai=HEX_TO_ASCII(bai);qian=HEX_TO_ASCII(qian);DisplayOneChar(1,1,qian);DisplayOneChar(2,1,bai);DisplayOneChar(3,1,shi);DisplayOneChar(4,1,'.');DisplayOneChar(5,1,ge);DisplayOneChar(6,1,0XDF); //温度单位DisplayOneChar(7,1,'C'); //温度单位//-------显示磁偏量dis_data1=0;dis_data1=BUF[3];dis_data1<<=8;dis_data1|=BUF[4];conversion(dis_data1);ge=HEX_TO_ASCII(ge);shi=HEX_TO_ASCII(shi);bai=HEX_TO_ASCII(bai);qian=HEX_TO_ASCII(qian);DisplayOneChar(7,0,qian);DisplayOneChar(8,0,bai);DisplayOneChar(10,0,'.');DisplayOneChar(11,0,ge);//-------显示校准等级conversion(BUF[7]);ge=HEX_TO_ASCII(ge);shi=HEX_TO_ASCII(shi);bai=HEX_TO_ASCII(bai);qian=HEX_TO_ASCII(qian);DisplayOneChar(10,1,bai);DisplayOneChar(11,1,shi);DisplayOneChar(12,1,ge);//----------按键检测if(KEY_1==0){delay_10ms();if(KEY_1==0){cal_on();while(KEY_1==0)delay_10ms();}}if(KEY_2==0){delay_10ms();if(KEY_2==0){cal_off();while(KEY_2==0)delay_10ms();}}if(KEY_3==0){delay_10ms();if(KEY_3==0){recovery_factory();while(KEY_3==0)delay_10ms();}}if(KEY_4==0){delay_10ms();if(KEY_4==0){// CMP_OFFS();IIC_ADDR_Change();while(KEY_4==0)delay_10ms();}}for (i=0;i<4000;i++);}}/*******************************/void delay(unsigned int k){unsigned int i,j;for(i=0;i<k;i++){for(j=0;j<121;j++){;}}}/*******************************/void WaitForEnable(void){DataPort=0xff;LCM_RS=0;LCM_RW=1;_nop_();LCM_EN=1;_nop_();_nop_();while(DataPort&0x80);LCM_EN=0;}/*******************************/void WriteCommandLCM(uchar CMD,uchar Attribc) {if(Attribc)WaitForEnable();LCM_RS=0;LCM_RW=0;_nop_();DataPort=CMD;_nop_();LCM_EN=1;_nop_();_nop_();LCM_EN=0;}/*******************************/void WriteDataLCM(uchar dataW){WaitForEnable();LCM_RS=1;LCM_RW=0;_nop_();DataPort=dataW;_nop_();LCM_EN=1;_nop_();_nop_();LCM_EN=0;}/***********************************/void InitLcd(){WriteCommandLCM(0x38,1);WriteCommandLCM(0x08,1);WriteCommandLCM(0x01,1);WriteCommandLCM(0x06,1);WriteCommandLCM(0x0c,1);}/***********************************/void DisplayOneChar(uchar X,uchar Y,uchar DData){Y&=1;X&=15;if(Y)X|=0x40;X|=0x80;WriteCommandLCM(X,0);WriteDataLCM(DData);}/***********************************//*void DisplayListChar(uchar X,uchar Y,uchar code *DData){uchar ListLength=0;Y&=0x1;X&=0xF;while(X<=15){DisplayOneChar(X,Y,DData[ListLength]);ListLength++;X++;}}*//***********************************///*********************************************************void read_cmp(void){uchar i;AT24C04_Start(); //起始信号AT24C04_SendByte(WriteDeviceAddress); //发送设备地址+写信号AT24C04_SendByte(0x00); //0表示命令AT24C04_SendByte(0x31); //发送一次测量角度AT24C04_Stop(); //停止信号Delay5ms();Delay5ms();Delay5ms();Delay5ms();Delay5ms();Delay5ms();Delay5ms();Delay5ms(); //延时,实际应用中可以执行其他程序Delay5ms();Delay5ms();Delay5ms();AT24C04_Start(); //起始信号AT24C04_SendByte(WriteDeviceAddress); //发送设备地址+写信号AT24C04_SendByte(0x00); //0表示命令AT24C04_SendByte(0x35); //发送一次测量温度AT24C04_Stop(); //停止信号Delay5ms();Delay5ms();Delay5ms();Delay5ms();Delay5ms();Delay5ms(); //延时,实际应用中可以执行其他程序AT24C04_Start(); //起始信号AT24C04_SendByte(WriteDeviceAddress); //发送设备地址+写信号AT24C04_SendByte(0x00); //发送存储单元地址,从0开始AT24C04_Start(); //起始信号AT24C04_SendByte(WriteDeviceAddress+1); //发送设备地址+读信号for (i=0; i<8; i++){BUF[i] = AT24C04_RecvByte();if (i == 7){AT24C04_SendACK(1); //最后一个数据需要回NOACK}else{AT24C04_SendACK(0); //回应ACK}}AT24C04_Stop(); //停止信号}//--------------------------------------------------/**************************************延时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_();}/**************************************延时5毫秒(STC90C52RC@12M)不同的工作环境,需要调整此函数当改用1T的MCU时,请调整此延时函数**************************************/void Delay5ms(){WORD n = 560;while (n--);}/**************************************起始信号**************************************/void AT24C04_Start(){SDA = 1; //拉高数据线SCL = 1; //拉高时钟线Delay5us(); //延时SDA = 0; //产生下降沿Delay5us(); //延时SCL = 0; //拉低时钟线}/**************************************停止信号**************************************/ void AT24C04_Stop(){SDA = 0; //拉低数据线SCL = 1; //拉高时钟线Delay5us(); //延时SDA = 1; //产生上升沿Delay5us(); //延时}/**************************************发送应答信号入口参数:ack (0:ACK 1:NAK)**************************************/ void AT24C04_SendACK(bit ack){SDA = ack; //写应答信号SCL = 1; //拉高时钟线Delay5us(); //延时SCL = 0; //拉低时钟线Delay5us(); //延时}/**************************************接收应答信号**************************************/bit AT24C04_RecvACK(){SCL = 1; //拉高时钟线Delay5us(); //延时CY = SDA; //读应答信号SCL = 0; //拉低时钟线Delay5us(); //延时return CY;}/**************************************向IIC总线发送一个字节数据**************************************/void AT24C04_SendByte(BYTE dat){BYTE i;for (i=0; i<8; i++) //8位计数器{dat <<= 1; //移出数据的最高位SDA = CY; //送数据口SCL = 1; //拉高时钟线Delay5us(); //延时SCL = 0; //拉低时钟线Delay5us(); //延时}AT24C04_RecvACK();}/**************************************从IIC总线接收一个字节数据**************************************/BYTE AT24C04_RecvByte(){BYTE i;BYTE dat = 0;SDA = 1; //使能内部上拉,准备读取数据,for (i=0; i<8; i++) //8位计数器{dat <<= 1;SCL = 1; //拉高时钟线Delay5us(); //延时dat |= SDA; //读数据SCL = 0; //拉低时钟线Delay5us(); //延时}return dat;}//*********************************************************void cal_on(void){ //校准AT24C04_Start(); //起始信号AT24C04_SendByte(WriteDeviceAddress); //发送设备地址+写信号AT24C04_SendByte(0x00); //0表示命令AT24C04_SendByte(0xC0); //发送校准命令AT24C04_Stop(); //发送停止信号}//*********************************************************void cal_off(void) //关闭校准{AT24C04_Start(); //起始信号AT24C04_SendByte(WriteDeviceAddress); //发送设备地址+写信号AT24C04_SendByte(0x00); //0表示命令AT24C04_SendByte(0xC1); //发送停止校准命令AT24C04_Stop(); //发送停止信号}//*********************************************************void recovery_factory(void) //恢复出厂设置{AT24C04_Start(); //起始信号AT24C04_SendByte(WriteDeviceAddress); //发送设备地址+写信号AT24C04_SendByte(0x00); //0表示命令AT24C04_SendByte(0xA0); //发送数据0xA0AT24C04_Stop(); //发送停止信号AT24C04_Start(); //起始信号AT24C04_SendByte(WriteDeviceAddress); //发送设备地址+写信号AT24C04_SendByte(0x00); //0表示命令AT24C04_SendByte(0xAA); //发送数据0xAAAT24C04_Stop(); //发送停止信号AT24C04_Start(); //起始信号AT24C04_SendByte(WriteDeviceAddress); //发送设备地址+写信号AT24C04_SendByte(0x00); //0表示命令AT24C04_SendByte(0xA5); //发送数据0xA5AT24C04_Stop(); //发送停止信号AT24C04_Start(); //起始信号AT24C04_SendByte(WriteDeviceAddress); //发送设备地址+写信号AT24C04_SendByte(0x00); //0表示命令AT24C04_SendByte(0xC5); //发送0xC5,恢复出厂命令AT24C04_Stop(); //发送停止信号}//*********************************************************void IIC_ADDR_Change(void) //iic地址更改{AT24C04_Start(); //起始信号AT24C04_SendByte(WriteDeviceAddress); //发送设备地址+写信号AT24C04_SendByte(0x00); //0表示命令AT24C04_SendByte(0xA0); //发送数据0xA0AT24C04_Stop(); //发送停止信号AT24C04_Start(); //起始信号AT24C04_SendByte(WriteDeviceAddress); //发送设备地址+写信号AT24C04_SendByte(0x00); //0表示命令AT24C04_SendByte(0xAA); //发送数据0xAAAT24C04_Stop(); //发送停止信号AT24C04_Start(); //起始信号AT24C04_SendByte(WriteDeviceAddress); //发送设备地址+写信号AT24C04_SendByte(0x00); //0表示命令AT24C04_SendByte(0xA5); //发送数据0xA5AT24C04_Stop(); //发送停止信号AT24C04_Start(); //起始信号AT24C04_SendByte(WriteDeviceAddress); //发送设备地址+写信号AT24C04_SendByte(0x00); //0表示命令AT24C04_SendByte(0xE8); //新的IIC地址E0-FE中偶数(参考PDF文档)AT24C04_Stop(); //发送停止信号}//*********************************************************void CMP_OFFS(void) //磁偏角{AT24C04_Start(); //起始信号AT24C04_SendByte(WriteDeviceAddress); //发送设备地址+写信号AT24C04_SendByte(0x03); //0表示命令AT24C04_SendByte(0x00); //磁偏角高8位,写入0AT24C04_Stop(); //发送停止信号AT24C04_Start(); //起始信号AT24C04_SendByte(WriteDeviceAddress); //发送设备地址+写信号AT24C04_SendByte(0x04); //0表示命令AT24C04_SendByte(0x64); //磁偏角低8位,写入100(实际是10.0度)AT24C04_Stop(); //发送停止信号}//*********************************************************void Delay_10ms(void){int n=560;while (n--);}//参考宏晶网站24c04通信程序。

陕西航天长城 C100电子罗盘 使用说明

陕西航天长城 C100电子罗盘 使用说明

C100电子罗盘使用说明C100电子罗盘是一种创新的独立产品,具有体积小、价格低、系统灵活性强、寻北精度高、启动速度快的特点,可满足全天候工作应用需求,可在-40º和+85º工作环境下应用,国外号称是世界上精度最高的电子罗盘。

它的航向精度能达到0.5度的范围内。

如何安装测试C100?尽管C100能够缓和补偿磁干扰,但是选择一个有最小磁干扰的位置是至关重要的。

尽可能的远离铁、钢、磁铁、发动机和其他磁物质的地方放置C100。

即使周围有这些磁介质,至少需要维持12英寸远的距离。

每个C100电子罗盘都提供六英寸的电缆线,KVH公司可选的电缆线可以为48英寸。

在传感器电缆尽可能短可以获得最小的噪音。

尽管C100能够在稳定的磁环境下补偿适中的偏差,但是它不能补偿改变的磁干扰。

记住带直流电的电线产生磁场,如果直流电改变,磁场大小也将改变!电池是另一个变化的干扰源。

每个安装都是不同的并且用户必须评估在所有可能的操作环境下的安装可行性。

C100的航向精度能达到0.5度,这是经过严格验证不容置疑的,最科学的测试方法同样至关重要。

我们建议的测试方法是:将C100电子罗盘安装在垂直竖起的铝(无磁性的其他材料)制杆上,进行航向精度测量(当然转动杆垂直于转动平台,尽量做到避免大的外界磁场干扰)。

这样做可以减小罗盘转动的半径,科学的提高测量精度。

这只是提供实验室的安装,对于具体情况必须灵活处理,例如:安装在车上时,C100应该做到将其安装在垂直于运动方向。

安装尺寸图连接C100引脚定义下面详细定义了封装的C100电子罗盘的电源和数据接口连接功能 信号 线色 串口 RXD,RS232 或者0到+5V数字输入 红黑TXD,RS232 或者0到+5V数字输出 蓝黑地,通用地 黑白 数字口 时钟,10KHz 0 到+5V时钟输出 蓝色数字,0到+5V 数字输出 橙黑滤波,0到+5V 滤波输入 绿黑 模拟输出 SIN,SINE 或者 模拟输出 橙色COS,COSINE 或者模拟输出 绿色REF,参考或者模拟输出 白黑 电压输入 +8到+18VDC 白色+18到+28VDC 红色地,通用地 黑色 空闲 绿白 空闲 红白 电缆保护连接到了铝制外壳如何校准C100?C100提供了三种校准方法:八点校准法、三点校准法和旋转校准法。

电子罗盘的工作原理及校准 电子罗盘,电子指南针,android

电子罗盘的工作原理及校准 电子罗盘,电子指南针,android

AndroidST集成传感器方案实现电子罗盘功能电子罗盘是一种重要的导航工具,能实时提供移动物体的航向和姿态。

随着半导体工艺的进步和手机操作系统的发展,集成了越来越多传感器的智能手机变得功能强大,很多手机上都实现了电子罗盘的功能。

而基于电子罗盘的应用(如Android的Skymap)在各个软件平台上也流行起来。

要实现电子罗盘功能,需要一个检测磁场的三轴磁力传感器和一个三轴加速度传感器。

随着微机械工艺的成熟,意法半导体推出将三轴磁力计和三轴加速计集成在一个封装里的二合一传感器模块LSM303DLH,方便用户在短时间内设计出成本低、性能高的电子罗盘。

本文以LSM303DLH为例讨论该器件的工作原理、技术参数和电子罗盘的实现方法。

1. 地磁场和航向角的背景知识如图1所示,地球的磁场象一个条形磁体一样由磁南极指向磁北极。

在磁极点处磁场和当地的水平面垂直,在赤道磁场和当地的水平面平行,所以在北半球磁场方向倾斜指向地面。

用来衡量磁感应强度大小的单位是Tesla或者Gauss(1Tesla=10000Gauss)。

随着地理位置的不同,通常地磁场的强度是0.4-0.6 Gauss。

需要注意的是,磁北极和地理上的北极并不重合,通常他们之间有11度左右的夹角。

图1 地磁场分布图地磁场是一个矢量,对于一个固定的地点来说,这个矢量可以被分解为两个与当地水平面平行的分量和一个与当地水平面垂直的分量。

如果保持电子罗盘和当地的水平面平行,那么罗盘中磁力计的三个轴就和这三个分量对应起来,如图2所示。

图2 地磁场矢量分解示意图实际上对水平方向的两个分量来说,他们的矢量和总是指向磁北的。

罗盘中的航向角(Azimuth)就是当前方向和磁北的夹角。

由于罗盘保持水平,只需要用磁力计水平方向两轴(通常为X轴和Y轴)的检测数据就可以用式1计算出航向角。

当罗盘水平旋转的时候,航向角在0?- 360?之间变化。

2.ST集成磁力计和加速计的传感器模块LSM303DLH2.1 磁力计工作原理在LSM303DLH中磁力计采用各向异性磁致电阻(Anisotropic Magneto-Resistance)材料来检测空间中磁感应强度的大小。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档