-
在 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);
}