【esp32 项目】入门使用adc

原理图:

图 adc部分原理图

图 单片机adc相关引脚

图 ESP32模组数据手册——引脚部分

原理图分析:

  • Q4是一个NMOS管,当 ADC_CON 高电平的时候,Q4导通(目的是为了Q3导通);
  • Q5是一个PMOS管,当栅极为低电平时(即Q4导通时),Q3导通。
  • Q5导通之后,电流通过另外两路测量电路。

 

esp32 的adc相关硬件的属性:

  • 最大量程:ADC模拟输入引脚可承受最高3.3V的电压,如果需要测试更高的电压,需要通过分压之类的方式进行降压之后再进行采集。
  • 分辨率:可配置 12 位、 11 位、 10 位、 9 位多种分辨率
  • 引脚数量:支持 18 个模拟输入管脚(ADC1支持8个通道(GPIO32-GPIO39),ADC2支持10个通道(GPIO0、GPIO2、GPIO4、GPIO12-GPIO15、GPIO25-GPIO27))
  • 支持 DMA(1 个控制器支持), 并采用 2 个 SAR ADC(逐次逼近),可支持同时采样与转换
  • ESP32 ADC 对噪声敏感,从而导致 ADC 读数出现较大差异。为了尽量减少噪声,可以在使用中的 ADC 输入端连接一个 0.1uF 的电容,多重采样也可用于进一步减轻噪声的影响。

使用ADC2的时候,有两点需要注意:

  • ADC2的一些引脚比如GPIO0、GPIO2、GPIO15为芯片的Strapping 管脚,使用的时候要特别注意

  • ADC2只能在WiFi功能未启动的情况下使用

 

 

Arduino框架下——esp32 的adc相关软件的编写:

关于ADC的一些概念,比如时钟,分辨率,采样周期,衰减,量程等大家自行了解,下面我们讲一下基础的使用:

1-模拟电压读取

ADC使用不需要初始化引脚了,直接使用下面的函数读取引脚电压,使用默认的参数进行配置,这个参数配置能满足绝大部分的需求了。这里还有一点注意的是这里是阻塞的,直到采集结束。

analogRead(32);

2-分辨率设置

如上文中说的,ESP32的ADC是12位的,我们读取的范围默认是0-4095,如果想改也是可以的,通过下面你函数更改,一般用默认就好了。

/*
* Sets the conversion resolution
* Default is 12bit (0 - 4095)
* Range is 9 - 12
* */void analogSetWidth(uint8_t bits);

3-ADC时钟

ADC根据选择的分辨率在多个时钟周期内进行转换,时钟速率越快,转换过程就越快,通过更改时钟分频系数来控制频率,分频越大速率越慢,默认就是1,最快的速率。

/*
* Set the divider for the ADC clock.
* Default is 1
* Range is 1 - 255
* */void analogSetClockDiv(uint8_t clockDiv);

4-ADC参考电压

ADC的参考电压Vref,在不同的ESP型号可能是不一样的,我们这里ESP32参考电压为1.1V,一般用内部的就可以,要求高的需要校准一下,当然,也可以设置外置的引脚当做参考电压。

/*
* Set pin to use for ADC calibration if the esp is not already calibrated (25, 26 or 27)
* */void analogSetVRefPin(uint8_t pin);

5-ADC衰减倍数

对应不同的电压检测范围,我们可以设置引脚的衰减倍数,默认就是11db,实际检测范围为0-3.3V,下面两个函数,一个设置所有通道的,一个设置特定通道的。

/*
* Set the attenuation for all channels
* Default is 11db
* */void analogSetAttenuation(adc_attenuation_t attenuation); 
/*
* Set the attenuation for a particular pin
* Default is 11db
* */void analogSetPinAttenuation(uint8_t pin, adc_attenuation_t attenuation);/*
0dB --- 1.1V
2.5dB --- 1.5V
6dB --- 2.2V
11dB --- 3.9V(实际最大采集到3.3V电压)
* */static uint8_t __analogAttenuation = 3;//11dbtypedef enum {
    ADC_0db,
    ADC_2_5db,
    ADC_6db,    
    ADC_11db
} adc_attenuation_t;

通过以上介绍一些可能用到的函数,大家了解一下即可,大部分场合都用默认的就行啦。

完整程序

#define ANALOG_PIN   32
int analog_value = 0;

void setup(){
  Serial.begin(115200);
  Serial.println("ADC Demo!"); 
} 
void loop(){  
  analog_value = analogRead(ANALOG_PIN);
  Serial.print("ADC value on Pin("); 
  Serial.print(ANALOG_PIN); 
  Serial.print(") is ");
  Serial.print(analog_value); 
  Serial.println("!");
  delay(1000);
}

我们直接在loop中读取ADC的值,然后把结果通过串口打印出来,ADC都使用的默认参数,没有进行配置。

 

参考资料:

《老宇哥带你玩转 ESP32:05 ADC用起来这也太简单了吧》

链接:https://1681809564.spaces.eepw.com.cn/articles/article/item/315433

posted @ 2024-06-10 13:45  FBshark  阅读(67)  评论(0编辑  收藏  举报