ADC(Analog-to-Digital Converter)即模数转换器,是一种将模拟信号转换为数字信号的电路。
模数转换(Analog-to-Digital Conversion,简称 ADC) 是将模拟信号转换为数字信号的过程。
在电子技术中,许多实际的物理量,如温度、压力、声音、图像等,都是以模拟信号的形式存在的。然而,数字系统,如计算机、微控制器等,只能处理数字信号。
模数转换的过程通常包括采样和量化两个主要步骤。
采样是在一定的时间间隔内对模拟信号进行测量,获取一系列离散的样本值。例如,在音频处理中,每秒采集数千次的声音信号。
量化则是将每个采样值转换为有限数量的离散数字值。这意味着会存在一定的误差,但通过合理的量化精度,可以控制误差在可接受的范围内。
模数转换的精度和速度是两个关键指标。精度决定了转换后的数字信号与原始模拟信号的接近程度,通常用比特数来表示,比特数越高,精度越高。速度则影响着能够处理的模拟信号的频率范围。
模数转换在众多领域都有重要应用。比如:
在创意之星AI控制器中,我们配置了许多模拟量传感器,今天我们主要使用下面这款红外接近传感器。
在创意之星AI控制器中,ADC接口位于如下位置:
如上图所示,左边部分为ADC通道,九个ADC通道编号分别为(0~8),与IO类似,每列从上到下依次为GND,VCC和ADC引脚,GND和VCC用于给传感器供电,ADC用于信号传递。
我们将两个红外接近传感器分别接在0,1通道的ADC中。
在创意之星AI控制器中,我们通过下面这个函数来获取ADC传感器的数据:
#获取指定channel的ADC的值
def ADC_Get_Channel(self, channel)
我们通过下面的代码获取0,1两个通道的ADC的值:
#引入硬件配置库
from uptech import UpTech
up = UpTech()
#打开ADC_IO通信
up.ADC_IO_Open()
#获取0号通道的ADC值
value0 = up.ADC_Get_Channel(0)
#获取1号通道的ADC值
value1 = up.ADC_Get_Channel(1)
#打印这两个ADC的值
print("ADC 0 value is ", value0)
print("ADC 1 value is ", value1)
这样我们就可以获取到ADC传感器的数据了。
接下来,我们结合前面的LED流水灯控制,可以通过ADC传感器的数据来控制LED的亮灭。
将四个红外接近传感器分别接入0,1,2,3四个通道,将四个LED灯也分别接入IO的0,1,2,3通道,然后通过ADC传感器的数据来控制LED的亮灭,代码如下:
#引入硬件配置库
from uptech import UpTech
import time
up = UpTech()
#打开ADC_IO通信
up.ADC_IO_Open()
#设置0,1,2,3号引脚为输出模式
up.ADC_IO_SetIOMode(0,1)
up.ADC_IO_SetIOMode(1,1)
up.ADC_IO_SetIOMode(2,1)
up.ADC_IO_SetIOMode(3,1)
#获取四个通道的ADC值
value0 = up.ADC_Get_Channel(0)
value1 = up.ADC_Get_Channel(1)
value2 = up.ADC_Get_Channel(2)
value3 = up.ADC_Get_Channel(3)
#间隔1s循环采样ADC数值,ADC数值大于500,则对应LED亮(高电平),否则LED灭(低电平)
while(True):
value0 = up.ADC_Get_Channel(0)
value1 = up.ADC_Get_Channel(1)
value2 = up.ADC_Get_Channel(2)
value3 = up.ADC_Get_Channel(3)
if(value0 > 500):
up.ADC_IO_SetIOLevel(0,1)
else:
up.ADC_IO_SetIOLevel(0,0)
if(value1 > 500):
up.ADC_IO_SetIOLevel(1,1)
else:
up.ADC_IO_SetIOLevel(1,0)
if(value2 > 500):
up.ADC_IO_SetIOLevel(2,1)
else:
up.ADC_IO_SetIOLevel(2,0)
if(value3 > 500):
up.ADC_IO_SetIOLevel(3,1)
else:
up.ADC_IO_SetIOLevel(3,0)
time.sleep(1)
如此,我们就实现了通过ADC传感器的数据来控制LED的亮灭。