《ESP32 學習筆記》 之Arduino環境下 使用全面的 ADC 檢測

  • Arduino環境下,我們如何用高精度ADC檢測電壓值?

  • 支持ADC功能的引腳請查看:引腳定義

  • 請注意,ADC2通道在ESP32開啓WIFI後,功能會受到限制,建議使用ADC1通道!

1.這裏我們就要藉助 esp32-hal-adc.h 和 esp32-hal-adc.c 兩個文件來完成 esp32-hal庫 內置的 ADC 檢測功能,分辨率可以設置!

2.下面是 esp32-hal-adc.h 文件,翻譯了一下,可以看到各個函數的作用:

#ifndef MAIN_ESP32_HAL_ADC_H_
#define MAIN_ESP32_HAL_ADC_H_

#ifdef __cplusplus
extern "C" {
#endif

#include "esp32-hal.h"

typedef enum {
    ADC_0db,
    ADC_2_5db,
    ADC_6db,
    ADC_11db
} adc_attenuation_t;

/*。
*獲取引腳的ADC值。
**/
uint16_t analogRead(uint8_t pin);

/*。
*設置aliogRead返回值的分辨率。默認值爲12位(範圍從0到4096)
*如果在9和12之間,它將等於設置的硬件分辨率,否則值將移位
*範圍爲1-16
*注:與Arduino SAM兼容
*/
void analogReadResolution(uint8_t bits);

/*。
*設置採樣位和讀取分辨率
*默認值爲12位(0-4095)
*範圍爲9-12
*/
void analogSetWidth(uint8_t bits);

/*。
*設置每個樣本的週期數
*默認爲8,似乎表現不錯
*範圍爲1-255
*/
void analogSetCycles(uint8_t cycles);

/*。
*設置範圍內的樣本數
*默認值爲1
*範圍爲1-255
*此設置將範圍拆分爲
*“樣本”件,可能看起來
*就像敏感度成倍增長
*那麼多次
*/
void analogSetSamples(uint8_t samples);

/*。
*設置ADC時鐘的分頻器
*默認值爲1
*範圍爲1-255
*/
void analogSetClockDiv(uint8_t clockDiv);

/*
 * Set the attenuation for all channels
 * Default is 11db
 * */
void analogSetAttenuation(adc_attenuation_t attenuation);

/*
*設置所有通道的衰減
*默認值爲11db
**/
void analogSetPinAttenuation(uint8_t pin, adc_attenuation_t attenuation);

/*。
*獲取霍爾傳感器的值(不帶LNA)
*連接到引腳36(SVP)和39(SVN)
**/
int hallRead();

/*。
*非阻塞接口(差不多)
*
*注:ADC轉換一次只能針對單個管腳運行。
*這意味着如果要在同一總線的兩個引腳上運行ADC
*需陸續運行。或許最好的用法是。
*在兩輛巴士上並行開始轉換
**/

/*。
*將引腳連接到ADC(還將清除任何其他可能開啓的模擬模式)
**/
bool adcAttachPin(uint8_t pin); 

/*
*在連接的引腳總線上開始ADC轉換
**/
bool adcStart(uint8_t pin);

/*
*檢查引腳的ADC總線上的轉換當前是否正在運行
**/
bool adcBusy(uint8_t pin);

/*
*獲取轉換結果(未完成將等待)
**/
uint16_t adcEnd(uint8_t pin);

#ifdef __cplusplus
}
#endif

#endif /* MAIN_ESP32_HAL_ADC_H_ */
  • 自己寫的測試代碼:
/*
@功能:ADC檢測電源電壓
@時間:2020/3/6
@作者:劉澤文
@引用庫:esp32-hal-adc.h
@QQ:2822604962
*/
#include <Arduino.h>

#define ADC1 15//ADC引腳
 
void setup(){
  Serial.begin(115200);
  adcAttachPin(ADC1);//將引腳連接到ADC
  adcStart(ADC1);//在連接的引腳總線上開始ADC轉換
  analogReadResolution(16);//設置aliogRead返回值的分辨率
}
 
void loop()
{
  Serial.print("系統電壓是:  ");
  Serial.print(analogRead(ADC1));
  Serial.print("  ");
  Serial.print((analogRead(ADC1)*3.3)/65535);
  Serial.println(" V");
  delay(100);
}
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章