2024年4月21日发(作者:)
范例三 电子罗盘
一.系统概述
本系统的目标是设计一个两轴数字罗盘系统。对其所指的方向进行测量。当系统工作时,
系统中的磁阻传感器(HMC1022)对所在地的地磁进行A/D采集,然后对采集量进行处理,将
所在的方向相对正北的角度通过串口发送给高端。本系统可工作在正常状态和标定状态。
1 正常状态
在该状态下,系统对地磁进行正常采集后进行校准,然后通过串口将计算的方向角发送
出来。
2 标定状态
在该状态下,系统对周围的磁场进行采集,以此为参考,推导出校准参数。退出该状态
时,将校准参数保存起来,以便用于对正常状态下采集的数据进行偏置校准。
二.系统输入/输出分析
两轴数字罗盘系统的系统框图如图6-27所示。
磁阻传感器
2
2
M
C
U
复位置位电路
PC机
磁阻传感器
图6-27 数字罗盘系统框图
从系统框图中可以看出,两轴数字罗盘系统大体可以分为模拟量输入、开关量输出以及
通信量 3 类。
模拟量输入分析如表6-5所示。
表6-5 数字罗盘系统模拟量输入
类型
模拟量
输入
编号
1
2
名称
A轴采集量
B轴采集量
命名
A_data
B_data
来源
磁阻传感器
磁阻传感器
备注
范围为-10mV~+10mV
范围为-10mV~+10mV
开关量输出分析如表6-6所示
表6-6 数字罗盘系统开关量输出
类型
开关量
输入
编号
1
名称
复位置位信号
命名
R/S
控制对象
磁阻传感器
备注
对HMC1022进行复位置位,0.5A~4A
通信量分析如表6-7所示。
表6-7 数字罗盘系统通信量
编号 名称 命名 备注
1
2
串口发送数据
串口接受数据
TxD
RxD
向PC端发送数据
接收PC端发来的数据
三.硬件设计
1 芯片选型
选取芯片时应该注意:不要将所有的I/O口用满,应当预留一定的输入输出端口,以便
扩展需要。通过分析数字罗盘系统的输入量和输出量,发现所需的I/O口较少,为5个。但考
虑到该系统对A/D采集精度要求较高并且要求有SCI模块以便于通信,故考虑该系统采用具
有10BitA/D采集和SCI模块的MR8。
2 设计框图
数字罗盘系统的硬件框图如图6-28所示,下面将分析A/D采集中的电压放大模块、
HMC1022(磁阻传感器)的置位/复位电路和SCI(RS-232)通信模块。
out+(A)
out-(A)
out+(B)
out-(B)
s/r+(A)
s/r+(B)
电压放大
电路
MR8
ATD0-1/PTA0-1
H
M
C
1
0
2
2
置位/复位
电路
PTB3/TCH0A
PTB1/TxD
SCI通信
PTB0/RxD
PC机
图6-28 基于MR8的数字罗盘系统框图
3 MCU引脚汇总列表
数字罗盘系统中MR8的I/O口具体分配情况如表6-8所示。
表6-8 MR8的I/O分配
分类
1
2
3
名称 编号
AD
模块
R/S
模块
SCI
模块
1
2
3
4
5
MCU引脚
ATD0/PTA0(25)
ATD1/PTA1(26)
PTB3/TCH0A(19)
PTB1/TxD(17)
PTB0/RxD(16)
目标对象
HMC1022放大后的信号输入(A)
HMC1022放大后的信号输入(B)
IRF7105.G1,G2
MAX3232.T1IN
MAX3232.R1OUT
使HMC1022获得较高
的灵敏度
利用MAX3232将TTL
电平转换为RS-232电平
说明
获得磁阻传感器的信号
4 模块硬件分析及设计
(1) A/D采集模块
在该模块中,使用MR8内部的A/D模块对HMC1022产生的两路电压采集。考虑到在地
球磁场下HMC1022输出的电压范围在-5mv~5mv之间,对于如此小的电压,模数转换器无
法准确转换,因此需要对其输出电压进行放大。在该放大电路中使用了AD公司的AMP04。
其输出公式为Vout=(Vin+ - Vin-)*Gain+Vref,其中Vout为放大后输出的电压,Vin+ 、Vin-为
HMC1022产生信号,Gain为放大倍数,Vref为3.3V。考虑到A/D采集信号最大为5V,决定将
放大倍数设为500。又有AMP04的放大倍数Gain=10K/R,所以在本系统中取R=200Ω。具
体的信号放大电路如图6-29所示。
(2) HMC1022复位/置位
磁阻传感器所处的磁场并非纯净磁场,不可避免的会收到来自外界磁场的影响。如果磁
阻传感器长时间受到外部磁场的影响,会导致其灵敏度下降。环境中的强磁场(大于5Gauss
时)会导致磁阻传感器输出信号变异,为了消除这种影响并使输出信号达到最佳,就需要利
用传感器中的用来置位或复位的两个合金带来消除剩余磁场。具体是对集成在芯片内部的置
位/复位合金带加以3~5安培的脉冲电流,这样就可以重新校准或反置传感器内的磁敏元件。
电路中采用MOS管IRF7105产生置位/复位电流。图6-30给出了IRF7105的引脚。
引脚含义简要说明如下:
S1(1脚):地(GND)
S1
D1
1 8
S2(3脚):正电源端,接+5V
D1
G1 2 7
G1(2脚):使能N-Channel
D2
S2 3 6
G2(4脚):使能P-Channel
D2
G2 4 5
D1(7、8脚):N-Channel,产生电流
D2(5、6脚):P-Channel,产生电流
图6-31是本系统所采用的一种置位/复位电路。
图6-30 IRF7105的管脚
图6-31 HMC的支撑及置位/复位电路
(3) SCI(RS-232)通信模块
由于MCU的SCI模块输出及接收电平为TTL电平,而RS-232总线规定的电平为RS-232电
平,两者不一致。因此要用RS-232总线进行串行通信,就需要外接电路实现电平转换。在
该系统中使用目前使用比较多的MAX232。该芯片使用单一+5V电源供
电实现电平转换。图6-32给出了MAX232的引脚。
引脚含义简要说明如下:
Vcc(16脚):正电源端,一般接+5V
GND(15脚):地
VS+(2脚):VS+=2Vcc-1.5V
VS-(6脚):VS-=-2Vcc-1.5V
C2+、C2-(4、5脚):一般接1μF的电容
C1+、C1-(1、3脚):一般接1μF的电容
输入输出引脚分两组,基本含义见表6-9所示。在实际使用时,若只要一路,可使用其
中任意一组。
在本系统中,使用了表6-9中的第一组来实现电平转换,具体电路图如图6-33所示。
表6-9 MAX232芯片输入输出引脚分类与基本接法
组别
1
2
TTL电平引脚
11
12
10
9
方向
输入
输出
输入
输出
典型接口
接MCU的TxD
接MCU的RxD
同上
232电平引脚
13
14
8
7
方向
输入
输出
输入
输出
典型接口
连接到接口与其它
设备通过232相接
同上
图6-33 SCI电平转换电路
四.软件设计
1 编写硬件驱动程序注意点
① 硬件驱动程序的文件数量(.h,.c)应该与划分的硬件模块个数一致,一个硬件模块对
应一个H文件和一个C文件。
② 一个C文件中可以包含若干个函数,所有对外函数必须在H文件中声明,仅在该文件
内部调用的函数就在该文件中声明与实现。
③ 一个与硬件相关的C文件,头部是说明该文件对外的函数,可以对外的函数按照头
部说明的顺序放在最前面,每个函数头的说明要有足够的使用信息。
④ 汇编中,原则上先用A,HX作为函数入口,不够用再考虑用HX指向内存地址。C中,
所有子程序不得用全局变量作为出口。
⑤ 当对划分好的模块编写硬件驱动程序时,要切记不能干预该模块未用到的引脚。
2 各模块头文件
#include "GP32C.H" //MCU头文件
#include "DataType.H" //数据类型头文件
#define COCOBit 7 //转换完成标志位
INT8U advalue(INT8U channel); //获取一路A/D转换
INT8U admid(INT8U channel); //获取中值滤波A/D转换
INT8U adave(INT8U n, INT8U channel); //获取均值滤波A/D转换
#include "GP32C.H" //MCU头文件
#define ReSendStatusR SCS1 //SCI状态寄存器
#define ReTestBit 5 //接收缓冲区满标志位
#define SendTestBit 7 //发送缓冲区空标志位
#define ReSendDataR SCDR //数据寄存器
//串行接收与发送函数声明
extern void SCIInit(void);
extern INT8U SCIRe1(INT8U *p); //接收1字节
extern INT8U SCIReN(INT8U n,INT8U ch[]); //接收n字节
extern void SCISend1(INT8U o); //发送1字节
extern void SCISendN(INT8U n,INT8U ch[]);//发送n字节
1 AD.h
2 SCI.h
3 误差补偿算法
在该系统的使用中,系统误差主要表现在两方面:一种是对传感器零位的影响;另一种
是其两轴灵敏度不一致的影响。
(1) 零位误差
零位误差是由于A/D采集到电压在放大时加上了Vref,同时,在实际环境中,软磁场的
影响使得A/D的输出并非关于原点对称,而是发生了坐标偏移,如图6-34所示。这样就需要
对采样值进行一定的补偿,使其恢复到理想状态,如图6-35所示。
对于该误差的消除,可以如下方法:
在水平状态下,将传感器旋转一圈,测出X、Y轴的最大和最小值,通过计算其新的原
点,从而使以后采集的值处于所计算新原点的坐标轴中。
(2) 灵敏度误差
当X轴和Y轴的灵敏度不一致时,这时理想的圆会变为一个椭圆。可以先求出K=(Xmax
-Xmin)/(Ymax-Ymin),假设以X为基准,那么:X = Xread ,Y=YreadK。
这样就取得比较理想的值,可以计数出方位了。
五.小结
通过一个具体的练习,可以了解到设计一个项目的流程:
首先,项目进行需求分析,分析出该系统的模拟量输入、开关量输入、模拟量输出、开
关量输出以及通信等方面的信息;
第二步、根据分析出的输入/输出量选择合适的芯片;
第三步、分析系统的各个模块,选择各个模块的芯片并画出对应的原理图;
第四步、写出各个模块的驱动程序及功能子程序,并测试;
最后,将各个功能子程序合成并测试。通过这些步骤,我们才有可能可以做好一个项目。

发布评论