一、概念介绍:
1.数字信号和模拟信号:
? ? ? ? ?在显示生活中,我们经常遇到的如温度、压力、图像等都是模拟量,电子线路中的模拟电压和模拟电流等也都是模拟信号,它是一种连续变化的信号。而数字信号,通常我们无法看到,它通常存储在芯片内,如单片机、计算机、硬盘等。数字信号是离散的信号。
| 特点 | 幅度变化 | 信号传输方式 | 保密性 | 抗干扰能力 | 处理和存储信号难易 | 模拟信号 | 在时间上和数值上都是连续变化的信号 | 幅度的取值是连续的 | 用模拟量的电压或电流来表示 | 保密性差,通信信号很容易被窃听 | 弱,很容易受到干扰 | 难 | 数字信号 | 在时间上和数值上不连续变化的信号 | 幅度的取值是离散的 | 通过0和1的数字串所构成的数字流 | 数字信号保密性较强,可加密-传输-解密再变换还原成模拟信号 | 抗干扰能力强 | 简单 |
?2.数字信号和模拟信号相互转换的示例
? ? ? ? ?上图是一个打电话的过程,首先,我们通过手机内部的ADC将声音信号(模拟信号)转化为数字信号,然后通过天线将数字信号转换出去,对方手机接收到我们的数字信号之后,通过DAC转换为模拟信号(声音),双方就可以通话了。
? ? ? ? 下图为AD/DA相互转换的示意:
3. 模拟信号转数字信号:
- 最低有效位(Least Significant Bit)LSB?: 表示ADC芯片最小的一位所代表的模拟量的数值。
?步骤:
- 采样:在时间轴上对信号数字化。按照固定的时间间隔抽取模拟信号的值,采样后就可以使一个时间连续的信号波变为在时间上取值数目有限的离散信号。
- 保持
- 量化
- 编码
奈奎斯特采样定理:采样频率fs.max大于或等于有效信号最高频率fmax的两倍,采样值就可以包含原始信号的所有信号,被采样信号就可以不失真的还原成原始信号。
混叠效应:不同的信号频率在相同的采样频率下,可以得到相同的采样波形。
? ? ? ? ?上图1为原始信号,但是,在混叠效应之下,根据采样点还原原始信号,可以有多种不同频率的信号(如图2)。因此AD转换时需要添加一个抗混叠滤波器,将一些高频谐波干扰杂波过滤掉。只采样需要的波形。
3.1 采样
采样过程示例
?3.2 量化
? ? ? ? 上图为一个三位的ADC,即其所能能表示的分辨率位2的3次方,从000~111。
- 分辨率:ADC的分辨率指的是对于允许范围内的模拟信号,它能输出离散数字信号值的个数。例如,12位的ADC分辨率即为12位,或者说分辨率为满刻度的1/(2^12)。一个10V满刻度的12位ADC能分辨输入电压变化最小值为:
10V? X? 1/(2^12) = 2.4mV
- ?转换误差:转换误差通常是以输出误差的最大值形式给出。表示A/D转换器实际输出的数字量和理论上输出的数字量之间的差别。
- ?转换速率:ADC的转换指的是每秒转换的次数。
?4 ADC转换方式
?4.1 逐次逼近:
4.2 双积分式ADC?
二、ESP32 模数转换
? ? ? ? ?ESP32集成了两个12位SAR(逐次逼近寄存器)的ADC,并支持18通道(支持模拟的引脚)的测量。
? ? ? ? ADC驱动器API支持ADC1(8个通道,连接到GPIO 32-39)和ADC2(10个通道,连接到GPIO 0、2、4、12-15和25-27)。但是,ADC2的使用对应用程序有一些限制:
- Wi-Fi驱动程序使用了ADC2。因此,应用程序只能在未启动Wi-Fi驱动程序时使用ADC2。
- 在一些开发板中ADC2引脚用作捆绑引脚(GPIO 0、2、15),因此不能自由使用。例如GPIO0:用于选择运行方式
?ADC配置:
- 精度设置:
typedef enum {
ADC_WIDTH_BIT_9 = 0, /*!< ADC capture width is 9Bit*/
ADC_WIDTH_BIT_10 = 1, /*!< ADC capture width is 10Bit*/
ADC_WIDTH_BIT_11 = 2, /*!< ADC capture width is 11Bit*/
ADC_WIDTH_BIT_12 = 3, /*!< ADC capture width is 12Bit*/
ADC_WIDTH_MAX,
} adc_bits_width_t;
ESP32内置12位ADC,可以在9位到12位的精度之间调整。 - 衰减倍数:
typedef enum {
ADC_ATTEN_DB_0 = 0, /*!<The input voltage of ADC will be reduced to about 1/1 */
ADC_ATTEN_DB_2_5 = 1, /*!<The input voltage of ADC will be reduced to about 1/1.34 */
ADC_ATTEN_DB_6 = 2, /*!<The input voltage of ADC will be reduced to about 1/2 */
ADC_ATTEN_DB_11 = 3, /*!<The input voltage of ADC will be reduced to about 1/3.6*/
ADC_ATTEN_MAX,
} adc_atten_t;
不同的衰减倍数对应不同的检测电压范围
三、程序编写
void adc_Init(){
adc1_config_width(ADC_WIDTH_12Bit); //设置为12位的ADC 2^12=4096
//设置ADC1通道6,参考电压为1.1V
adc1_config_channel_atten(ADC1_CHANNEL_6 ,ADC_ATTEN_11db);
}
void app_main(void){
adc_Init();
int read_raw; //ADC值
while(1)
{
read_raw=adc1_get_raw(ADC1_CHANNEL_6); //采集ADC1 6通道的ADC值
printf("adc=%d,%dmv\r\n",read_raw, (read_raw*1100)/4096); //ADC值以及mV计算
vTaskDelay(1000/portTICK_PERIOD_MS);
}
}
四、结束
? ? ? ? 本文介绍了ADC模数转换的一些基本内容,并编写程序实现ESP32模数转换功能。
?
|