倾斜传感器|从零开始认识各种传感器
1. 什么是倾斜传感器
倾斜传感器又称作倾角传感器、测斜仪、水平仪、倾角计,经常用于系统的角度测量, 测量被测平面相对于水平位置的倾斜度。它从简单的水泡水平仪发展到现在的电子水平仪, 是桥梁道路铺设、 工程钻井、航空航海、工业自动化等领域不可缺少的重要测量工具。
图1 倾斜传感器的应用
2. 倾斜传感器是如何工作的
倾斜传感器的工作是基于基于牛顿第二定律原理,当物体没有受到外力时,重力会使加速度计指向地球的重力方向。
图2 牛顿第二定律
水平状态下,作用在加速度计上面的只有重力加速度;当物体发生倾斜时,加速度计会感应到重力分量的改变,通过计算和处理这些数据,倾角仪可以准确测量出物体的倾斜角度阿尔法。
图3 倾斜传感器工作原理
3. 常见的倾斜传感器的种类
倾斜传感器从工作原理上可分为固体摆式、液体摆式、气体摆式三种倾角传感器,这三种倾角传感器都是利用地球万有引力的作用,将传感器敏感器件对大地的姿态角,即与大地引力的夹角 (也就是倾角)这一物理量,转换成模拟信号或脉冲信号。
3.1 固体摆式倾斜传感器
固体摆式倾斜传感器在设计中采用了力平衡式伺服系统,由摆锤、摆线、支架组成, 摆锤受重力G和摆拉力T的作用,其合外力F =G sinθ=mg sinθ。其中,θ为摆线与垂直方向的夹角。在小角度范围内测量时,可以认为F与θ成线性关系,测得F的大小即可知道夹角θ的大小。
图4 固体摆式倾斜传感器
3.2 液体摆式倾斜传感器
它的结构原理如下:在一个壳体内装有导电液,并有三根铂电极和外部相连接, 当壳体水平时,电极插入导电液的深度相同。 在两根电极之间加上幅值相等的交流电压时,电极之间会形成离子电流,那么两个电极之间的液体相当于两个电阻R1和R3。壳体水平时,则R1=R3。 当壳体倾斜时, 三根电极浸入液体的深度也发生变化, 左边电极浸入深度小,导电液减少,电阻R1增大,右边电极侵入深度增加,则导电液增加, 从而电阻R3 减少,即R1>R3。反之,若倾斜方向相反,则R1<R3。
图5 液体摆式倾斜传感器原理
3.3 气体摆式倾斜传感器
气体摆式惯性元件由密闭腔体、气体和热线组成,当腔体所在平面相对水平面倾斜或腔体受到加速度的作用时,气体的相对流动使得热线的阻值发生变化,并且热线阻值的变化是角度q或加速度的函数,因而也具有摆的效应。其中热线阻值的变化是气体与热线之间的能量交换引起的。
图6 气体摆式倾斜传感器工作原理
3.4 三种倾斜传感器的比较
图7 三种倾斜传感器的特性比较
固体摆、液体摆和气体摆作为倾角传感器在原理研制中各具特色。在重力场中,固体摆以摆锤质量为敏感质量,具有明确的摆长和摆心,运动机理与加速度传感器相似,广泛应用于高精度系统。液体摆介于固体摆和气体摆之间,其系统比较稳定 。而气体摆的敏感质量为气体,具有较小的惯性力,因此在大冲击或高过载时表现出较强的抗振动或冲击能力,但由于气体运动控制较为复杂,其精度不足以满足军用武器系统的要求。
4. 倾斜传感器实验演示
最后,我们来演示如何使用配备显示屏的树莓派读取并显示倾斜传感器的数据。实验中使用的是一款滚珠型倾斜开关,在初始平放状态下屏幕显示“safe”, 表示处于水平状态,将传感器倾斜一定角度后,屏幕显示“warning”,表示检测出了器件姿态的改变。
图8 树莓派读取倾斜传感器展示
完整调试代码:
from breakout_colourlcd240x240 import BreakoutColourLCD240x240
from machine import ADC, Pin, Timer, PWM,I2C
from utime import sleep
import time, math,array
#------------------------------------------------------------------
######################################################################
######################################################################
#初始化
#显示屏
width = BreakoutColourLCD240x240.WIDTH
height = BreakoutColourLCD240x240.HEIGHT
display_buffer = bytearray(width * height*2)
display = BreakoutColourLCD240x240(display_buffer)
alarm_pin = Pin(20,Pin.IN)
global current_temp
current_temp = 0
#-------------------------------------------------------------------
#屏幕基本图形绘制
def display_init():
display.set_pen(0,255,0)
display.rectangle(58,30,13,160)
display.circle(64,190,6)
display.set_pen(255,0,0)
display.text("current", 150, 20, 194, 2)
display.text("force", 150, 35, 194, 2)
display.update()
for i in range(6):
display.set_pen(0,200,0)
display.pixel_span(80,27 + i*30,10)
display.text(str(100 - i *20), 100, 20+i*30, 194, 2)
display.set_pen(0,0,220)
if i < 5:
for j in range(4):
display.pixel_span(80,33 + j*6 + i * 30,5)
display.update()
display.update()
#---------------------------------------------------------------------
def display_change(temp, color):
global current_temp
current_temp = temp
#print(temp)
if temp ==0 :
display.set_pen(color[0], color[1], color[2])
display.rectangle(58,30,13,160)
display.circle(64,190,6)
display.set_pen(0,0,150)
display.rectangle(58,20,13,7+int((50-(temp*100)/2)/2)*6)
display.set_pen(0,0,0)
display.rectangle(140,50,100,40)
display.set_pen(0,255,0)
display.text('safe', 140, 50, 5, 5)
else :
display.set_pen(255,0,0)
display.rectangle(58,30,13,160)
display.circle(64,190,6)
display.set_pen(0,0,150)
display.rectangle(58,20,13,7+int((50-(temp*100)/2)/2)*6)
display.set_pen(0,0,0)
display.rectangle(140,50,100,40)
display.set_pen(255,0,0)
display.text('war', 140, 50, 5, 5)
display.update()
#----------------------------------------------------------------------
def get_temp():
Analogvalue=stemp.read_u16()
voltage=(81-100*float(Analogvalue)/65535)
return voltage
def main():
global current_temp
color = [0,255,0]
timer1 = Timer()
#基本图形绘制
display_init()
#timer1初始化
timer1.init(freq=15,mode=Timer.PERIODIC, callback=lambda t:display_change(alarm_pin.value(), color))
while True:
sleep(0.1)
main()