你好,我是愛吃魚香ROS的小魚。上面兩節通過LED和按鍵學習了GPIO的輸出和輸入。
但這種輸入和輸出只有兩種狀態HIGH
或者LOW
,我們稱這種為數字邏輯,這也是輸入輸出函數稱為數字輸入和數字輸出的原因。
但是電池的電壓是一個在一個范圍內不斷變化的值,明顯無法通過HIGH
和LOW
來表示,所以本節我們學習使用ADC,將電壓值這個模擬信號轉換成數字信號。
本教程所使用硬件平臺為MicroROS學習板V1.0.0,可點擊閱讀原文購買及查看詳情
一、ADC介紹
ADC(analog to digital converter)模數轉換器是一種非常常見的外設,用于 將電壓等模擬信號轉換為數字形式 ,以便微控制器可以讀取和處理。
ADC在控制和監控應用中非常有用,因為大多數傳感器(例如溫度、壓力、力)都是輸出的模擬電壓,所以我們需要掌握ADC。
與ADC相對應的DAC——用于將數字信號轉換成模擬信號,比如將一段二進制的音樂文件轉換成一段連續的電壓信號播放出來就需要DAC。
二、電池電壓測量原理
在我們的開發板所使用的ESP32單片機上,自帶了ADC模塊,我們只需要將需要測量的模擬電壓接入相應引腳,接著調用ADC相關API即可讀取。
因為ADC原理是采用電壓比較方式進行測量,而我們的單片機的供電電壓為3.3V,所以測量的電壓范圍最大不能超過3.3V,但我們采用的電池電壓和板子的供電電壓分別是12V和5V的。
所以想要使用單片機測量電池電壓,那么就要想辦法將板子測量的電壓按照比例縮小即可,根據初中物理知識,串聯分壓原理,小魚就設計了這樣的電路。
串聯分壓,左邊接電機電壓輸入引腳,右側接地,R18是40.2千歐阻值的電阻,R19是10千歐的,假如此時VMOTOR的輸入電壓為5V,那么ESP_IO34的電壓就是
那么如果此時通過ADC測量出上的電壓,通過下面的等式就可以算出的電壓值。
三、Arduino ADC API
了解了原理,我們來看看Arduino為我們提供了哪些API可以直接獲取到引腳上的電壓。
3.1 設置ADC衰減系數(analogReadResolution)
這個函數用來設置ADC讀取時的衰減系數。
輸入到引腳的電壓在輸入到ADC之前可能會衰減。有 4 種可用的衰減選項,衰減越高,可測量的輸入電壓就越高,為了能夠測量到12V以上的電壓,我們采用最高的衰減比-ADC_11db。
typedef enum {
ADC_0db,
ADC_2_5db,
ADC_6db,
ADC_11db,
} adc_attenuation_t;
3.2 讀取ADC值(analogRead)
此函數用于獲取給定引腳或ADC通道的ADC原始值,默認是12位分辨率,所以這個讀出來的值的范圍就是0-2^12,也就是最大4096。
uint16_t analogRead(uint8_t pin);
pin
要讀取ADC值的GPIO 引腳
返回值:ADC原始值
3.3 讀取電壓值(analogReadMillivolts)
此函數用于獲取給定引腳或ADC 通道的 ADC 值(以毫伏為單位)。
uint32_t analogReadMilliVolts(uint8_t pin);
pin
要讀取ADC值的GPIO 引腳
返回值:此函數將以毫伏為單位返回模擬值。
四、編寫程序
利用上面的三個API和計算公式就可以實現電壓的測量,新建example04_adc
工程,在main.cpp
輸入代碼。
/**
* @file main.cpp
* @author fishros@foxmail.com
* @brief 4.電池電壓測量-學會使用ADC
* @version 0.1
* @date 2023-01-04
*
* @copyright Copyright(c) fishros.com 2023
*
*/
#include < Arduino.h >
void setup()
{
Serial.begin(115200);
pinMode(34, INPUT);
analogSetAttenuation(ADC_11db);
}
void loop()
{
int analogValue = analogRead(34); // 讀取原始值0-4096
int analogVolts = analogReadMilliVolts(34); // 讀取模擬電壓,單位毫伏
float realVolts = 5.02 * ((float)analogVolts * 1e-3); // 計算實際電壓值
Serial.printf("ADC analog value = %d\\n", analogValue);
Serial.printf("ADC millivolts value = %d\\n", analogVolts);
Serial.printf("realVolts value = %f\\n", realVolts);
delay(100);
}
五、測試
根據第三節中的原理圖,我們測量的是VMOTOR的電壓,VMOTOR是通過一個跳線帽選擇連接到5V還是12V上的,詳情可以看下面的原理圖。
對應板子上的位置
這里我們把跳線帽調整到左側,讓VMOTOR和5V連接,接著打開串口觀察測量到的電壓值。
可以看到我們成功的測量到了實際的電壓值為5.045V,符合正常電壓值。
如果你有整臺FishBot小車,可以將跳線帽調整到12V的位置,打開電池電源開關,看看是否可以正常測量到12V的電壓。
六、總結
本節我們通過電池電壓測量的例程,學習了ADC的使用,電池電壓測量對我們機器人來說是非常重要的,當電壓低的時候可以進行自動返回充電,然后等充電完成后再繼續工作。
-
adc
+關注
關注
98文章
6507瀏覽量
544913 -
電池電壓
+關注
關注
0文章
195瀏覽量
11732 -
GPIO
+關注
關注
16文章
1205瀏覽量
52155 -
ROS
+關注
關注
1文章
278瀏覽量
17024
發布評論請先 登錄
相關推薦
評論