项目场景:

最近在使用安信可的 ESP32S P14 引脚(ADC 16)读取一个电路状态的时候遇到一个问题,电路状态不是很稳定,在高电平的时候,会突然出现毫秒级的波动,出现短暂的低电平,造成设备状态翻转,但是波动最低电压也不会到0,于是我想到使用 analogRead() 读取模拟量,替代 digitalRead() 的数据量。

可是 analogRead() 读出来的数据却是 0 ,digitalRead() 和 万用表都显示引脚电压却是没有问题。这就非常奇怪了

问题描述:

我先抽象了一个简单的 digitalRead() 和 analogRead() 读取模型,发现 P14 引脚(ADC 16)是可以进行模拟量和数据量的读取的,analogRead() 读取模拟量甚至可以不初始化为 INPUT 模式也可以读取,说明,这个引脚确实是 ADC 引脚。

可是这就没什么代码和流程,我整个复制到我应用的代码里面去获取模拟量,依然读取不到数据。

void setup() {
   Serial.begin(115200); 
    pinMode(water_pin, OUTPUT);
    pinMode(sign_pin, INPUT);               
    pinMode(monitor_pin,INPUT);
}

void loop() {
  // printf("\n digitalRead == : %d!!!!!\r\n", digitalRead(sign_pin));
  Serial.println();
  printf("\n analogRead == : %d!!!!!\r\n", analogRead(sign_pin));     // 读取没问题
  Serial.println();
  delay(100);
}

在这里插入图片描述

原因分析:

我在引用代码加打印的时候发现,在初始化引脚的时候确实是可以读取模拟量的,可是启动 WiFi 模块之后就读取不到了,我怀疑 arduino 在初始化 WiFi 的时候会把部分 ADC 引脚初始为 数字量模式,我测试了一下 P14(ADC16) 和 P27(ADC17) 都有这个问题,但是 SVP(ADC0) 没问题。这大概是这个初始化流程移植 arduino 上的时候保留了 UNO板子的特性(0-5 为模拟量)

void setup() {
   Serial.begin(115200); 
    pinMode(water_pin, OUTPUT);
    pinMode(sign_pin, INPUT);
    pinMode(monitor_pin,INPUT);
    printf("\n analogRead111 == : %d!!!!!\r\n", analogRead(sign_pin));   // 这时候是可以读取模拟量的

    // 启动 WiFi 并且连接网络
    WiFi.begin(ssid, password);
    while (WiFi.status() != WL_CONNECTED) 
    {
        delay(500);
        Serial.print(".");
    }
    printf("\n analogRead222 == : %d!!!!!\r\n", analogRead(sign_pin));   // 到这儿的时候就不能读取模拟量了
    // 获取并打印 IP 地址
    Serial.println("");
    Serial.println("WiFi connected");
    Serial.print("'ip :");
    Serial.print(WiFi.localIP());
    Serial.println("' to connect"); 
}

void loop() {
  printf("\n digitalRead == : %d!!!!!\r\n", digitalRead(sign_pin));
  Serial.println();
  printf("\n analogRead == : %d!!!!!\r\n", analogRead(sign_pin));
  Serial.println();
  delay(100);
}

解决方案:

修改硬件,将P14引脚修改为SVP引脚就行了


灵感桌面
1 声望3 粉丝

引用和评论

0 条评论