如何从其ADC通道读取模拟输入信号

我们生活在一个模拟世界中,其中大多数物理变量都是模拟信号。但是,微控制器只能处理数字格式的可用数据。正是由于这个原因,模数转换(adc)在与模拟环境交互的嵌入式系统中是如此重要。在本教程中,我们将讨论chipkit uno32板的adc功能,并说明如何从其adc通道读取模拟输入信号。
模拟到数字转换
理论
许多嵌入式应用程序处理诸如运动,温度,压力,相对湿度,光强度和声音。微控制器无法直接处理这些实体,因为i)它们是非电信号,ii)它们是模拟量,这意味着与数字信号的离散值相比,它们在给定范围内具有一组连续的值。为了使微控制器能够处理这些数量,必须以某种方式将它们表示为数字信号。此过程的第一步是将物理信号转换为电信号,这需要使用换能器。
换能器是一种将物理信号转换为电信号的机电系统,反之亦然。换能器的最简单示例是光敏电阻或ldr,可用于测量环境光的强度。 ldr是一种特殊的电阻器,其电阻会随着落在其表面上的光强度而变化。 ldr的电阻随着光强度的升高而降低。下图显示了在两种不同强度的光照射下ldr的电阻的测量结果。
在较高的光强度下,ldr的电阻较低(1.31 k?)
当落在其上的光被阻挡时,ldr电阻会升高(6.30 k?)
与固定值电阻器串联的电阻可用于构建将光强度转换为电压的机制。稍后将对此进行更详细的讨论。换能器的另一个示例是电动机,它将电压转换为运动。
现在,物理信号已转换为电信号,但由于其模拟性质,尚未准备好进行计算机处理。因此,下一步需要模数转换(adc)系统,该系统采用连续变化的电压输入并返回适合微控制器使用的二进制数字表示形式。
如今,许多微控制器都配备了模数转换系统。 chipkit uno32板上的pic32mx320f128h微控制器具有一个内置adc,具有16个adc输入通道。在uno32板上,只有12个可通过排针a0至a11进行访问。 adc的分辨率为10位,这意味着对于给定范围的模拟信号,可以进行1024(2 10 )个离散二进制表示形式(0至1023)。 adc的可接受范围通过参考电压(vref)设置。 chipkit uno32板上pic32mx320f128h微控制器的默认设置参考电压是其电源电压(vcc = 3.3 v)。这也是可以在chipkit uno32板上的任何adc通道上施加的模拟电压的最大值。假设,如果将adc的范围设置为0-3.3v(vref = 3.3 v),则adc分辨率也可以用电压表示为3.3/1024? 3.2毫伏。这是片上模数(a/d)转换器可检测到的模拟输入电压的最小变化。因此,0到3.2 mv之间的任何值都将由十进制0表示,十进制1则介于3.2 mv和6.4 mv之间,十进制2代表6.4 mv和9.6 mv之间,…,最后是1023介于3.2968 v和3.3 v之间。可以看到,采用这种配置,模拟电压的数字表示形式中的最大误差可能为3.2 mv。这也称为量化误差。
有时,模拟输入电压的范围与3.3v相比过小,并且变化很小。例如,房间内的空气温度变化不大。在这种情况下,您可以提高a/d转换器的分辨率(从而减少量化误差)以更精确地跟踪温度。假设如果您知道温度感测传感器的输出电压不能超过1v,则将vref设置为1v可以提高分辨率为1/1024? 1毫伏。现在,a/d转换器能够检测到输入信号中很小的变化。外部adc参考电压可以通过其aref引脚(在连接器j5上标记为a)提供给chipkit uno32板上的微控制器。可以施加到该引脚的最大电压为3.3v。
电路设置
在本教程中,一个2.2k电阻与ldr以构建分压网络,如下所示。通过uno32板的adc通道a0测量电阻两端的电压。当光线落在ldr上时,其电阻减小,因此2.2k电阻两端的电压升高。如果光线被阻止落到ldr上,则会发生相反的情况。因此,10位adc输出与落在ldr上的光强度成正比。评估板已连接到pc,adc输出将通过串行端口发送并显示在串行监视器窗口中。
传感模拟世界
面包板上的ldr电路设置
书写草图
adc输出通过串行线路发送,必须在设置功能中初始化串行端口和波特率。 analogread()函数用于从括号内指定的模拟引脚读取模拟输入信号。默认情况下,3.3v的电源电压用作a/d转换的参考电压,这意味着0到3.3伏之间的输入电压映射为0到1023之间的整数值。为了使用施加到a引脚的外部参考电压,请在草图中使用 analogreference(external)函数。这是完整的chipkit草图,可读取a0 adc通道上的输入值并将adc输出打印到串行监视器。
/*
tutorial 4: analog to digital conversion
description: reads an analog signal input to a0 pin and send the
10-bit adc output to pc to display on the serial monitor.
board: chipkit uno32
*/
int adc_output;
void setup() {
serial.begin(9600);
}
void loop() {
adc_output = analogread(a0);
serial.print(“ldr sensor output = ”);
serial.println(adc_output, dec);
delay(1000);
}
下载草图文件
输出
将以上草图上传到uno32板上,然后从mpide打开串行终端窗口。 adc样本(整数adc输出)以1秒的间隔打印在窗口上。您可以观察这些数字如何随着ldr上光线的变化而变化。如果您将手指放在ldr上并阻挡掉落在ldr上的光,则adc输出将突然下降。
chipkit uno32板通过串行将adc输出发送到pc界面


工业相机对连接器的要求如此严苛?凌科这款Type-C航空插头凭不俗优势备受关注
A12XBionic性能超92%笔记本电脑处理器 或与英特尔分手
WLAN的频段介绍,如何更好地利用2.4GHz和5GHz
中国电信天翼云:打造安全云 为数字中国建设保驾护航
采用新波形技术的LTE系统可以满足未来5G业务需求?
如何从其ADC通道读取模拟输入信号
Ansys宣布通过GlobalFoundries面向GF 22FDX®平台的半导体工具认证
人工智能技术的发展是否会导致人们失去创新精神
苹果iOS10.3 Beta 6发布:苹果目前最稳定流畅的系统
各行业防雷工程和防雷接地的应用方案
欲振乏力iPhone第3季度拉货打9折
蓝牙定位都听说过,那么蓝牙定位信标都知道吗
中国移动表示建设5G同时4G服务不降
C语言入门教程-命令行参数
一张图解释自动化仪表家族的“亲属”关系
光电式液位传感器的常见问题解答
Wishbone片上总线技术的特点及如何提高PCI系统的负载能力
Redis键的生存时间、生存策略和毁灭策略
澳大利亚构建虚拟发电厂提供电量
DCDC电源纹波的正确测试方法