问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

麦克风传感器 - 从零开始认识各种传感器【第四期】

创作时间:
作者:
@小白创作中心

麦克风传感器 - 从零开始认识各种传感器【第四期】

引用
CSDN
1.
https://blog.csdn.net/m0_61036291/article/details/140473959

麦克风传感器是将声音信号转换为电信号的重要设备,在手机、蓝牙耳机、智能音箱等产品中广泛应用。本文将从工作原理、常见种类、选购指南到实际应用等多个维度,为您全面解析麦克风传感器的相关知识。

1. 什么是麦克风传感器

麦克风传感器是一种可以将声音信号转换为电信号的传感器。我们工作生活中常用到的手机,蓝牙耳机,智能音箱等产品中,都要使用到麦克风传感器来拾取声音信号,转换为电信号进行处理。


图1 麦克风传感器

2. 麦克风传感器是如何工作的

我们以录音最常用到的电容式麦克风为例来看下它的工作原理:最外面是一层具有导电特性的薄膜(diaphragm)与里面临近的的背板(backpanel)构成了一个平板电容。下面的电池的作用是产生一个偏置电压,为该电容充有一定电荷。当薄膜在声压作用下发生震动,改变了与背板之间的距离,进而影响了电容容量,最终就导致电容两极之间的电压发生变化,再经过放大器便可以输出反应声音特性的电信号。


图2 麦克风传感器工作原理

3. 常见的麦克风传感器的种类

目前市场上常用的麦克风传感器主要是:驻极体电容麦克风;和微机电系统 (MEMS) 麦克风,另外还有动圈麦克风。

3.1 驻极体电容麦克风

驻极体麦克风ECM是最常用的电容麦克风,它由极体薄膜感知声音压强的变化产生震动,导致与背板之间的距离改变。而驻极体与背板相当于电容两个电极,电极之间的距离变化会改变电容的容量。进而产生电压变化,这个电信号由三极管进行放大后输出。由于驻极体材料自身带有静电偏压,所以无需外加一个给电容增加偏压供电,它具有结构简单,电声性能好,性价比高的特点。


图3 驻极体电容麦克风


图4 驻极体电容麦克风结构

3.2 微机电系统

MEMS麦克风的原理与传统的驻极体麦克风(ECM)相似,但是很多关键器件集成在半导体芯片内部,具有集成度高。这里的MEMS是指的微机电系统(MEMS, Micro-Electro-Mechanical System),也叫做微电子机械系统、它是指的在当前技术发展趋势下,把微型传感器,电路,机械控制等部分电路集成在几毫米甚至更小的电路结构中的产品。


图5 微机电系统 (MEMS) 麦克风

MEMS麦克风一般是由MEMS微电容传感器、微集成转换电路ASIC、声腔、RF抗干扰电路这几个部分组成的。MEMS微电容极头包括接收声音的硅振膜和硅背极,硅振膜可以直接接收到音频信号,经过MEMS微电容传感器传输给微集成电路,微集成电路把高阻的音频电信号转换并放大成低阻的电信号,同时经RF抗噪电路滤波,输出与前置电路匹配的电信号,就完成了声电转换。


图6 微机电系统 (MEMS) 麦克风结构

大多数 MEMS 麦克风都使用电容式传感器技术。也有使用压电传感元件的麦克风。利用压电效应产生音频电压。


图7 压电效应

3.3 动圈麦克风

动圈麦克风是利用电磁感应现象制成的。当声波使膜片振动时,连接在膜片上的线圈随着一起振动,音圈在磁场里振动产生感应电流,这个信号电流经扩音器放大后传给扬声器,从扬声器中就发出放大的声音。动圈麦克风结构相对简单非常耐用且用途广泛。 它擅长拾取近距离范围内的声音。在捕捉鼓、吉他和人声等高声压级音源时,动圈麦克风比电容麦克风更不容易过载和失真,而且还非常适合用作现场表演的手持人声话筒。它可以承受较高的声音压力和背景杂音小的特点,适用于舞台演出和KTV等声音嘈杂且不需要太丰富的声音细节的场合。


图8 动圈麦克风


图9 动圈麦克风原理图


图10 麦克风特性比较

这里列出了上面介绍的三种麦克风传感器的对比。可以看到,从性能和应用方面,目前MEMS麦克风传感器具有比较大的优势,它不但体积小巧,还可以承受回流焊接,适合用在批量生产的设备中。ECM驻极体麦克风相对来说尺寸更大一些,可以应用在一些对于尺寸和空间要求不是那么严格的场合。而动圈麦克风在对于现场演出,录制乐器等场合有着很好的应用。

4. 麦克风传感器实验演示

最后,我们来演示如何使用配备显示屏的树莓派读取并显示麦克风传感器的数据。 这里我们选用的是一款驻极体麦克风传感器。树莓派MCU通过模拟接口读取到的数字进行数字化处理后,在显示屏上直观地显示出来。


图11 树莓派读取麦克风传感器展示

主控板卡:基于RP2040的带屏调试助手

以下是完整程序:

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)
stemp = ADC(2)  
global x,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("volume", 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)
    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/2)/2)*6)
    display.set_pen(0,0,0)
    display.rectangle(150,50,90,40)
    display.set_pen(0,255,0)
    display.text(str(temp), 150, 50, 5, 5)
    display.update()

#----------------------------------------------------------------------
def get_temp():
    Analogvalue=stemp.read_u16()
    voltage=100*float(Analogvalue)/65535
    #print(voltage)
    return voltage

#----------------------------------------------------------------------
def main():
    
    global current_temp, temp,alarm,x
    color = [0,255,0]     
    timer1 = Timer()
    #基本图形绘制
    display_init()
    #timer1初始化
    timer1.init(freq=15,mode=Timer.PERIODIC, callback=lambda t:display_change(round(get_temp(),1), color))
    while True:
      sleep(0.1) 
main()
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号