Bootstrap

角度传感器 - 从零开始认识各种传感器【第九期】

角度传感器|从零开始认识各种传感器

1、什么是角度传感器

角度传感器是指能感受被测角度并转换成可用输出信号的传感器。它们可以用于测量转轴、电机、舵机和其他旋转部件的位置、角度和方向。在汽车,工程机械,航空航天等领域都需要用到角度传感器来感知角度变化,以确定位物体位置。

图1 角度传感器

2、角度传感器是如何工作的

角度传感器采用了敏感元件来感知转动轴承的位置变化,利用电容、电感、霍尔效应、光电效应等原理进行测量。当发生转动时,敏感元件所检测到的信号也随之变化,最终以数字或模拟信号的形式输出。

图2 角度传感器工作原理

3、常见的角度传感器的种类

常见的角度传感器根据感应元件主要有两大类别:霍尔效应以及磁阻效应角度传感器。 

3.1 霍尔效应角度传感器

角度传感器中,霍尔传感器是最常用的一种。它利用霍尔效应来感知角度变化。在磁场中放置一个霍尔半导体片,上面通过一个恒定的电流I,由于霍尔效应,磁场的变化被转换为半导体片电压的变化,监测此电压的变化就可以测量物体的旋转角度。

图3 霍尔效应原理

霍尔传感器本身在系统中通常是固定不动的。被测元件如马达的转动使得马达的磁铁发出的磁场线以直角穿过传感器。传感器感应到磁场线的变化后即可得出对应角度的变化。

图4 霍尔效应传感器工作原理

3.2 磁阻效应角度传感器

磁阻效应角度传感器利用的是磁阻效应:对通有电流的金属或半导体施加磁场时,其电阻值将发生明显变化,这种现象称为磁电阻效应(MR)。

图5 磁电阻效应(MR)

利用这种原理制成的角度传感器就是磁阻MR角度传感器。

图6 磁阻角度传感器

3.3 两种角度传感器的比较

图7 两种传感器的特性比较

从两种角度传感器的比较表格可以看出:从检测方式上,霍尔传感器检测垂直磁场的强度,而磁阻传感器检测水平磁场的强度。因此,一般来说磁阻传感器具有更广泛的检测范围,还可吸收布局误差。霍尔传感器通常可以达到更高的灵敏度,相对于温度变化,磁阻角度传感器性能更稳定。

4、角度传感器实验演示

我们来演示使用MCU 读取显示角度传感器的数据。这是一款电位计式的角度传感器,它的量程为300度。当前状态指示为90度。逆时针旋转电位计,角度显示增大。顺时针旋转,角度减小。

图8 树莓派读取角度传感器展示

完整代码如下:

from breakout_colourlcd240x240 import BreakoutColourLCD240x240
from machine import ADC, Pin, Timer, PWM
from utime import sleep
import time, math,array
#------------------------------------------------------------------
width = BreakoutColourLCD240x240.WIDTH
height = BreakoutColourLCD240x240.HEIGHT
display_buffer = bytearray(width * height*2)
display = BreakoutColourLCD240x240(display_buffer)

timer1 = Timer() 

stemp = ADC(2)                       
current_temp = 0                   
#-------------------------------------------------------------------
def display_init():
    
    display.set_pen(0,255,0)
    display.rectangle(58,30,13,160)
    display.circle(64,190,10)
    display.set_pen(255,0,0)
  
    display.text("current", 150, 20, 194, 2)
    display.text("angle", 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(300 - i *60), 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()
    
#---------------------------------------------------------------------
def display_change(temp, color):
    global current_temp
    current_temp = temp
    #print(temp)
    display.set_pen(color[0], color[1], color[2])
    display.rectangle(58,30,13,160)
    display.circle(64,190,10)
    display.set_pen(0,0,150)
    display.rectangle(58,20,13,7+int((300-temp)/2))
    display.set_pen(0,0,0)
    display.rectangle(140,50,100,40)
    display.set_pen(0,255,0)
    display.text(str(int(temp)), 140, 50, 5, 5)
    display.update()
#----------------------------------------------------------------------
#温度获取
def get_temp():
    
    Analogvalue=stemp.read_u16()
    voltage=300*float(Analogvalue)/65535

    return voltage
#----------------------------------------------------------------------
def main():
    
    color = [0,255,0] 
    timer1 = Timer()
    display_init()
    timer1.init(freq=5,mode=Timer.PERIODIC, callback=lambda t:display_change(round(get_temp(),1), color))

    while True:
      sleep(0.1) 
main()

;