在计算具体倾斜角之前,首先要得到各个轴的加速度信息,即需要对加速度芯片传来的电压信号的处理。
在ADC处理方面,通过单片机的ADC通道将电压信号转换为数字信号。STM32单片机的ADC通道是12位分辨率的逐次比较型ADC。单片机有18个ADC通道,可以对16个外部信号源以及2个内部信号源进行测量,其结果可以以左对齐或者右对齐的方式储存在16位数据寄存器中。[10]
在进行ADC转换时,我们可以利用u16 Get_ADC_Value(u8 ch,u8 times)函数对指定通道的电压值进行读取。在此函数中,ch代表所指定的采样通道,在本设计中,选用的是PC1,PC2和PC3三个通道来分别对三个轴的加速度值进行读取。times代表采样次数,一般来说采样次数越多,所得结果越精确,但所用时间也会越长,影响系统性能,因此需要权衡两者的关系,本次设计中选用的是20次采样,再对其取平均值。
由于ADC通道为12位,因此,满量程3.3V对应的数字信号为212=4096,故采样出的数字信号与原先的电压值之间的关系为:
U=ADC4096*3.3 (3-1)
其中,U为调理电路对传感器输出电压处理之后的电压值,ADC为采样通道对电压进行模数转换之后的数字量。通过式(3-1),就可以将采样所得的数字信号准确的还原成为电压值。于是,传感器的输出电压值为:
Ua=U2 (3-2)
其中,Ua为传感器输出电压值,U为调理电路输出电压值。
得到电压值之后,根据表1所示的加速度与电压关系,就可以很容易的得到三个轴的加速度值,如式(3-3)所示:
a=Ua-0.7720.229*g (3-3)
其中,a为各个轴的加速度,Ua为传感器输出电压值,g为当地重力加速度,通常取9.8m/s2。
另外,需要注意的是,此加速度可正可负,取决于芯片各轴正方向与重力加速度方向的关系。所以在计算最终夹角的时候,不仅可以得到被测平面的倾斜角,还可以根据各轴加速度的正负对被测平面的具体形态加以分析。
本设计中,我们选用的是加速度计作为测量倾斜角的传感器,故理所当然的涉及到如何将各个轴的加速度转换为倾斜角的问题。关于这种转换方式,首先有较为简单的单轴加速度测量方法。[2]其原理图如图3-1所示:
图3-1 单轴倾斜角测量示意图
在图19的单轴倾斜角测量示意图中,我们可以很容易的得出Z轴的倾斜角θ与Z轴加速度之间的关系为:
cosθ=AZg (3-4)
即:
θ=arccosAZg (3-5)
在(3-4)式和(3-5)式中,θ为Z轴与重力加速度方向的夹角,即被测平面与水平面之间的夹角;AZ为Z轴的加速度;g为当地的重力加速度,通常取9.8m/s2。
此测量方式看起来简单明了,只需要Z轴一个轴的加速度即可得出平面的倾斜角。但实际上,根据现有的研究经验和实验结果来看,由于单片机ADC的进度限制,此种测量方式只有在平面倾斜角度较小时才能具有较高的精准度。当平面的倾斜角度增大时,用这种方式测量得出的倾斜角度会失去精准度,同时其灵敏度和分辨率都会有显著的下降。当倾斜角接近90度时,此方法测出的倾斜角完全偏离正确值。
基于上述考虑,单轴倾斜角测量的方式并不能胜任本设计的倾角测量方法,我们在本设计中需要抛弃这种看上去较为简单的测量方式,另寻它法。
由于3.1.1中单轴倾斜角测量方式存在明显的缺陷,我们在本设计中对其进行了改善:充分利用此次选用的三轴加速度计,结合三个轴的加速度,综合分析,得出被测平面的加速度。其原理图如图3-2所示:
图3-2 三轴倾斜角测量示意图
在图20所示三轴倾斜角测量示意图中,XYZ三个轴是以被测平面为基准进行建立的坐标轴,θ为被测平面与水平面之间的夹角。由加速度与夹角的关系可以很容易得到:
cosθ=AZg (3-6)
sinθ=AXYg (3-7)
在上式中,θ为被测平面与水平面之间的夹角;AZ为Z轴的加速度;AXY为X-Y平面的加速度;g为当地的重力加速度,通常取9.8m/s2。
其中AXY可以由下式得到:
AXY=AX2+AY2 (3-8)
联立(3-6)、(3-7)和(3-8)式可以得到θ与各个轴加速度之间的关系为:
tanθ=AX2+AY2AZ (3-9)
即:
θ=arctanAX2+AY2AZ (3-10)
在本设计中,将式(3-10)作为计算倾斜角的最终公式。应用此算法进行倾斜角的计算,充分利用了三轴加速度。由于X-Y平面和Z轴相互垂直,AXY与倾斜角的正弦值成正比关系,AZ与倾斜角的余弦值成正比关系。当倾斜角较小时,AXY的灵敏度和精确度较高,AZ的灵敏度和精确度较低;当倾斜角较大时,AZ的灵敏度和精确度较高,AXY的灵敏度和精确度较低。所以无论是被测平面处于什么位置,都不会出现精确度很低的情况,即精确度基本恒定。采用此方法进行倾斜角的计算有利于提高本设计的稳定性。
结合3.1和3.2内容,本设计对角度读取及计算流程图如图3-3所示:
图3-3 角度计算流程图
得出倾斜角度之后,系统会对倾角加以判断,如果倾角大于阈值,会进行报警操作。阈值已在程序中初始化,也可以接收上位机的信息对阈值进行修改。
在本系统通信过程中,需要一定的通信协议来进行数据的传递,规定产品在接收到固定指令时返回相应的数据,因此在进行通信程序编写之前,首先要对通信协议进行一定的设计。在此次开发中,参照了市面上的倾斜仪通信协议进行设计,[13]其数据帧格式如表3-1所示;
表3-1 数据帧格式
标识符 (1位) |
数据长度 (1位) |
地址码 (1位) |
命令字 (1位) |
数据域 (X位) |
校验和 (1位) |
77 |
XX |
XX |
XX |
根据数据而定 |
XX |
其中,所有数据均为16进制数,标识符固定为0x77。数据长度定义为从数据长度为到校验和位的字节个数。命令字储存着本协议规定的功能码,产品接收到不同的命令字会进行对应的操作。数据域储存着这一帧数据所携带的数据信息,比如返回角度值时会将角度数据储存在数据域中。校验和的设计是用来检验所接收数据的正确性的,其值为数据长度、地址码、命令字、和数据域按照十六进制数的累加和。
根据此数据帧格式,本设计规定的读取角度的命令帧如表3-2所示:
表3-2 读取角度的命令帧格式
标识符 (1位) |
数据长度 (1位) |
地址码 (1位) |
命令字 (1位) |
校验和 (1位) |
77 |
04 |
00 |
04 |
08 |
在产品接收到上位机发送的读取角度值的命令帧之后,返回被测平面的角度值,其返回数据规定格式如表3-3所示:
表3-3 返回角度值数据格式
标识符 (1位) |
数据长度 (1位) |
地址码 (1位) |
命令字 (1位) |
数据域 (9位) |
校验和 (1位) |
77 |
0D |
00 |
84 |
X轴角度(3位) Y轴角度(3位) 被测平面角度 (3位) |
XX |
其中,每个角度值均由三位数据组成,分别表示:角度的正负,0表示正,1表示负;角度的整数值;角度的小数值。
除读取被测平面的角度之外,上位机还会通过改变阈值的命令来对产品的角度阈值进行更改,其命令帧格式如表3-4所示:
表3-4 更改阈值的命令帧格式
标识符 (1位) |
数据长度 (1位) |
地址码 (1位) |
命令字 (1位) |
数据域 (2位) |
校验和 (1位) |
|
77 |
06 |
00 |
20 |
角度值 |
XX |
|
其中,角度值为两位数据,分别为阈值的整数部分和小数部分。在产品正确接收到更改阈值的命令之后,会对此命令进行应答,向上位机确认已经对阈值进行了更改,此时返回的数据如表3-5所示:
表3-5 更改阈值时的应答数据格式
标识符 (1位) |
数据长度 (1位) |
地址码 (1位) |
命令字 (1位) |
数据域 (1位) |
校验和 (1位) |
|
77 |
05 |
00 |
A0 |
00 |
A5 |
|
由于在进行数据传输时都是将数据转换为16进制之后再进行传输,如32°的角度值在进行传输时的数据为0x20,所以显示在串口助手中的角度值为20,在读数时需要再将其转换为10进制数。同样的,在进行阈值设定时,也需要将10进制的阈值转换为16进制数再进行输入。
鉴于上述数据传输和读数方式会引起人机交互极大的不便利,所以本产品的软件设计中,在数据输出和接收数据之前,对数据进行特殊处理,使得他们在串口助手上显示时均为10进制数,极大的增强了用户体验。
其中对输出的角度数据的处理方式如式(3-11)所示:
A2=intA1/10*16+[A1-intA1/10*10] (3-11)
其中,A1为处理前的角度数据,A2为处理之后的数据。例如,若角度值为A1=20,处理之后的角度值为A2=32,在进行数据传输时的数据为0x20,即显示出的角度数据为20,与原角度值相等,显示方式更为直观。
对输入的阈值数据的处理方式如式(3-12)所示:
Y2=intY1/16*10+[Y1-intY1/16*16] (3-12)
同样的,Y1为处理前的阈值数据,Y2为处理之后的阈值数据。例如,若输入的阈值为Y1=0x20,处理之后的阈值即为Y2=20,对我们阈值设定的操作过程非常友好。
在本次设计中根据3.3.1中的通信协议以及本产品的设计需求,将通信流程设计如图3-3所示:
图3-3 产品通信流程图
由于本设计采用的SP3485芯片只能实现半双工通信,因此在切换接收和发送模式时需要注意对使能引脚的处理。
在正常工作状态下,系统处于等待接收上位机命令的模式下,使能引脚PA6置为低电平。如果上位机发送指令,单片机进入接收中断,将数据帧接收至缓存区中。待接收完毕之后,将使能引脚PA6置为高电平,进入发送模式,并对此数据帧进行分析,根据数据帧中的命令字做出相应的应答:如果命令字为04,则按照表6的应答数据帧格式向上位机发送角度数据;如果命令字为20,则读取阈值数据并对预设阈值进行更改,再向上位机发送如表8所示的确认信息。完成信息应答之后,结束信息发送过程,再将使能引脚PA6置为低电平,进入接收模式,并将接收缓存区清空,等待接收下一个命令。
其中,所使用的接收中断函数为USART2_IRQHandler(),当单片机检测到上位机有信息发送过来时,就会进入此中断函数,其函数内容如图3-4所示:
图3-4 接收中断函数
其中,Rx[]为接收缓存数组,用于储存上位机发送的数据,在一次应答结束之后清空;Rxcounter为数组提供计数,可以用来表示数据存放的位置。
从接收中断可以看出,本系统还加入了出错处理机制,对每一个上位机传来的命令都会进行检验,如果数据帧格式不符合通信协议,系统将不对命令进行任何应答。这种纠错机制可以防止系统接收到无意义信息时进行应答,保持系统的稳定性。其具体检验方式为:
与此同时,系统主函数循环读取角度数据,并在OLED显示出来以供直观显示。另外将被测平面的倾斜角与阈值实时比较,如果倾斜角大于阈值则发出报警信息,将红色报警LED灯点亮。