基于STM32的倾斜仪设计(三)—— 软件设计

3.1 加速度读取

在计算具体倾斜角之前,首先要得到各个轴的加速度信息,即需要对加速度芯片传来的电压信号的处理。

在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

另外,需要注意的是,此加速度可正可负,取决于芯片各轴正方向与重力加速度方向的关系。所以在计算最终夹角的时候,不仅可以得到被测平面的倾斜角,还可以根据各轴加速度的正负对被测平面的具体形态加以分析。

 

3.2 倾角计算

3.2.1 单轴倾斜角的计算

本设计中,我们选用的是加速度计作为测量倾斜角的传感器,故理所当然的涉及到如何将各个轴的加速度转换为倾斜角的问题。关于这种转换方式,首先有较为简单的单轴加速度测量方法。[2]其原理图如图3-1所示:

                                                       基于STM32的倾斜仪设计(三)—— 软件设计_第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.2.2 三轴倾斜角的计算

由于3.1.1中单轴倾斜角测量方式存在明显的缺陷,我们在本设计中对其进行了改善:充分利用此次选用的三轴加速度计,结合三个轴的加速度,综合分析,得出被测平面的加速度。其原理图如图3-2所示:

                                          基于STM32的倾斜仪设计(三)—— 软件设计_第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所示:

                                                                                 基于STM32的倾斜仪设计(三)—— 软件设计_第3张图片

                                                                               图3-3 角度计算流程图

得出倾斜角度之后,系统会对倾角加以判断,如果倾角大于阈值,会进行报警操作。阈值已在程序中初始化,也可以接收上位机的信息对阈值进行修改。

 

3.3 通信程序设计

3.3.1 通信协议

在本系统通信过程中,需要一定的通信协议来进行数据的传递,规定产品在接收到固定指令时返回相应的数据,因此在进行通信程序编写之前,首先要对通信协议进行一定的设计。在此次开发中,参照了市面上的倾斜仪通信协议进行设计,[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.2 通信流程

在本次设计中根据3.3.1中的通信协议以及本产品的设计需求,将通信流程设计如图3-3所示:

                                               基于STM32的倾斜仪设计(三)—— 软件设计_第4张图片

                                                                    图3-3 产品通信流程图

由于本设计采用的SP3485芯片只能实现半双工通信,因此在切换接收和发送模式时需要注意对使能引脚的处理。

在正常工作状态下,系统处于等待接收上位机命令的模式下,使能引脚PA6置为低电平。如果上位机发送指令,单片机进入接收中断,将数据帧接收至缓存区中。待接收完毕之后,将使能引脚PA6置为高电平,进入发送模式,并对此数据帧进行分析,根据数据帧中的命令字做出相应的应答:如果命令字为04,则按照表6的应答数据帧格式向上位机发送角度数据;如果命令字为20,则读取阈值数据并对预设阈值进行更改,再向上位机发送如表8所示的确认信息。完成信息应答之后,结束信息发送过程,再将使能引脚PA6置为低电平,进入接收模式,并将接收缓存区清空,等待接收下一个命令。

其中,所使用的接收中断函数为USART2_IRQHandler(),当单片机检测到上位机有信息发送过来时,就会进入此中断函数,其函数内容如图3-4所示:

                          基于STM32的倾斜仪设计(三)—— 软件设计_第5张图片

                                                                            图3-4 接收中断函数

其中,Rx[]为接收缓存数组,用于储存上位机发送的数据,在一次应答结束之后清空;Rxcounter为数组提供计数,可以用来表示数据存放的位置。

从接收中断可以看出,本系统还加入了出错处理机制,对每一个上位机传来的命令都会进行检验,如果数据帧格式不符合通信协议,系统将不对命令进行任何应答。这种纠错机制可以防止系统接收到无意义信息时进行应答,保持系统的稳定性。其具体检验方式为:

  1. 检查数据的第一位标识符是否为0x77,如果不是,整个数据将不会被接收。
  2. 判断接收完成的标志为接收到的最后一位数据与第二位数据之间的数据位数与数据帧中的数据长度位相等。
  3. 检查校验位是否等于从数据长度位到数据位所有数据的累加和,不满足的话将不对此命令做出任何应答。

与此同时,系统主函数循环读取角度数据,并在OLED显示出来以供直观显示。另外将被测平面的倾斜角与阈值实时比较,如果倾斜角大于阈值则发出报警信息,将红色报警LED灯点亮。

你可能感兴趣的:(基于STM32的倾斜仪设计(三)—— 软件设计)