范例三电子罗盘一.系统概述本系统的目标是设计一个两轴数字罗盘系统。对其所指的方向进行测量。当系统工作时,系统中的磁阻传感器(HMC1022)对所在地的地磁进行A/D采集,然后对采集量进行处理,将所在的方向相对正北的角度通过串口发送给高端。本系统可工作在正常状态和标定状态。1正常状态在该状态下,系统对地磁进行正常采集后进行校准,然后通过串口将计算的方向角发送出来。2标定状态在该状态下,系统对周围的磁场进行采集,以此为参考,推导出校准参数。退出该状态时,将校准参数保存起来,以便用于对正常状态下采集的数据进行偏置校准。二.系统输入/输出分析两轴数字罗盘系统的系统框图如图6-27所示。MCU2磁阻传感器2PC机磁阻传感器复位置位电路图6-27数字罗盘系统框图从系统框图中可以看出,两轴数字罗盘系统大体可以分为模拟量输入、开关量输出以及通信量3类。模拟量输入分析如表6-5所示。表6-5数字罗盘系统模拟量输入类型编号名称命名来源备注模拟量输入1A轴采集量A_data磁阻传感器范围为-10mV~+10mV2B轴采集量B_data磁阻传感器范围为-10mV~+10mV开关量输出分析如表6-6所示表6-6数字罗盘系统开关量输出类型编号名称命名控制对象备注开关量输入1复位置位信号R/S磁阻传感器对HMC1022进行复位置位,0.5A~4A通信量分析如表6-7所示。表6-7数字罗盘系统通信量编号名称命名备注1串口发送数据TxD向PC端发送数据2串口接受数据RxD接收PC端发来的数据三.硬件设计1芯片选型选取芯片时应该注意:不要将所有的I/O口用满,应当预留一定的输入输出端口,以便扩展需要。通过分析数字罗盘系统的输入量和输出量,发现所需的I/O口较少,为5个。但考虑到该系统对A/D采集精度要求较高并且要求有SCI模块以便于通信,故考虑该系统采用具有10BitA/D采集和SCI模块的MR8。2设计框图数字罗盘系统的硬件框图如图6-28所示,下面将分析A/D采集中的电压放大模块、HMC1022(磁阻传感器)的置位/复位电路和SCI(RS-232)通信模块。MR8ATD0-1/PTA0-1PTB3/TCH0APTB1/TxDPTB0/RxD电压放大电路置位/复位电路out+(A)out-(A)out+(B)out-(B)s/r+(A)s/r+(B)HMC1022PC机SCI通信图6-28基于MR8的数字罗盘系统框图3MCU引脚汇总列表数字罗盘系统中MR8的I/O口具体分配情况如表6-8所示。分类名称编号MCU引脚目标对象说明1AD模块1ATD0/PTA0(25)HMC1022放大后的信号输入(A)获得磁阻传感器的信号2ATD1/PTA1(26)HMC1022放大后的信号输入(B)2R/S模块3PTB3/TCH0A(19)IRF7105.G1,G2使HMC1022获得较高的灵敏度3SCI模块4PTB1/TxD(17)MAX3232.T1IN利用MAX3232将TTL电平转换为RS-232电平5PTB0/RxD(16)MAX3232.R1OUT4模块硬件分析及设计(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所示。表6-8MR8的I/O分配(2)HMC1022复位/置位磁阻传感器所处的磁场并非纯净磁场,不可避免的会收到来自外界磁场的影响。如果磁阻传感器长时间受到外部磁场的影响,会导致其灵敏度下降。环境中的强磁场(大于5Gauss时)会导致磁阻传感器输出信号变异,为了消除这种影响并使输出信号达到最佳,就需要利用传感器中的用来置位或复位的两个合金带来消除剩余磁场。具体是对集成在芯片内部的置位/复位合金带加以3~5安培的脉冲电流,这样就可以重新校准或反置传感器内的磁敏元件。电路中采用MOS管IRF7105产生置位/复位电流。图6-30给出了IRF7105的引脚。引脚含义简要说明如下:S1(1脚):地(GND)S2(3脚):正电源端,接+5VG1(2脚):使能N-ChannelG2(4脚):使能P-ChannelD1(7、8脚):N-Channel,产生电流D2(5、6脚):P-Channel,产生电流图6-31是本系统所采用的一种置位/复位电路。(3)SCI(RS-232)通信模块由于MCU的SCI模块输出及接收电平为TTL电平,而RS-232总线规定的电平为RS-232电平,两者不一致。因此要用RS-232总线进行串行通信,就需要外接电路实现电平转换。在该系统中使用目前使用比较多的MAX232。该芯片使用单一+5V电源供电实现电平转换。图6-32给出了MAX232的引脚。引脚含义简要说明如下:Vcc(16脚):正电源端,一般接+5VGND(15脚):地VS+(2脚):VS+=2Vcc-1.5VVS-(6脚):VS-=-2Vcc-1.5VC2+、C2-(4、5脚):一般接1μF的电容C1+、C1-(1、3脚):一般接1μF的电容输入输出引脚分两组,基本含义见表6-9所示。在实际使用时,若只要一路,可使用其中任意一组。在本系统中,使用了表6-9中的第一组来实现电平转换,具体电路图如图6-33所示。18273645S1G1S2G2D1D1D2D2图6-30IRF7105的管脚图6-31HMC的支撑及置位/复位电路表6-9MAX232芯片输入输出引脚分类与基本接法组别TTL电平引脚方向典型接口232电平引脚方向典型接口11112输入输出接MCU的TxD接MCU的RxD1314输入输出连接到接口与其它设备通过232相接2109输入输出同上87输入输出同上四.软件设计1编写硬件驱动程序注意点①硬件驱动程序的文件数量(.h,.c)应该与划分的硬件模块个数一致,一个硬件模块对应一个H文件和一个C文件。②一个C文件中可以包含若干个函数,所有对外函数必须在H文件中声明,仅在该文件内部调用的函数就在该文件中声明与实现。③一个与硬件相关的C文件,头部是说明该文件对外的函数,可以对外的函数按照头部说明的顺序放在最前面,每个函数头的说明要有足够的使用信息。④汇编中,原则上先用A,HX作为函数入口,不够用再考虑用HX指向内存地址。C中,所有子程序不得用全局变量作为出口。⑤当对划分好的模块编写硬件驱动程序时,要切记不能干预该模块未用到的引脚。2各模块头文件1AD.h#includeGP32C.H//MCU头文件#includeDataType.H//数据类型头文件#defineCOCOBit7//转换完成标志位INT8Uadvalue(INT8Uchannel);//获取一路A/D转换INT8Uadmid(INT8Uchannel);//获取中值滤波A/D转换INT8Uadave(INT8Un,INT8Uchannel);//获取均值滤波A/D转换图6-33SCI电平转换电路2SCI.h#includeGP32C.H//MCU头文件#defineReSendStatusRSCS1//SCI状态寄存器#defineReTestBit5//接收缓冲区满标志位#defineSendTestBit7//发送缓冲区空标志位#defineReSendDataRSCDR//数据寄存器//串行接收与发送函数声明externvoidSCIInit(void);externINT8USCIRe1(INT8U*p);//接收1字节externINT8USCIReN(INT8Un,INT8Uch[]);//接收n字节externvoidSCISend1(INT8Uo);//发送1字节externvoidSCISendN(INT8Un,INT8Uch[]);//发送n字节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。这样就取得比较理想的值,可以计数出方位了。五.小结通过一个具体的练习,可以了解到设计一个项目的流程:首先,项目进行需求分析,分析出该系统的模拟量输入、开关量输入、模拟量输出、开关量输出以及通信等方面的信息;第二步、根据分析出的输入/输出量选择合适的芯片;第三步、分析系统的各个模块,选择各个模块的芯片并画出对应的原理图;第四步、写出各个模块的驱动程序及功能子程序,并测试;最后,将各个功能子程序合成并测试。通过这些步骤,我们才有可能可以做好一个项目。