這一節(jié)內(nèi)容比較簡(jiǎn)單,就是電壓采樣,在傳統(tǒng)設(shè)計(jì)中應(yīng)用還是比較多的。首先看下支持ADC采樣的管腳,找到你手里模塊的原理圖,我的如下所示:
如上所示,U1的2腳為ADC管腳,而且整個(gè)模塊有且僅有這一個(gè)電壓采集管腳。CDS1是一個(gè)光敏電阻,它和R1組成一個(gè)分壓電路。不同強(qiáng)度的光照在CDS1上時(shí),會(huì)導(dǎo)致它的阻值變化,最終導(dǎo)致ADC管腳上的電壓發(fā)生變化。
那么,關(guān)于ESP8266的ADC,相關(guān)的性能參數(shù)有哪些?
可以打開(kāi)手冊(cè):2c-esp8266_sdk_api_guide_cn_v1.5.4,在第26頁(yè),有幾個(gè)ADC相關(guān)的函數(shù),我們截取其中一個(gè),看一下:
首先是電壓的輸入范圍,也就是ADC的量程:0~1.0V,相比傳統(tǒng)單片機(jī)的0~3.3V小了很多。
然后是分辨率:1/1024V。從這個(gè)參數(shù)可以知道,這是個(gè)10位的AD,只是不知道為何,量程這么小。
接著是三點(diǎn)注意事項(xiàng):
1、ADC讀取管腳電壓時(shí),需確保管腳連接了外部電路,且沒(méi)有超過(guò)量程。
這一點(diǎn)很好理解,根據(jù)輸入電壓設(shè)計(jì)相應(yīng)的分壓電路,接過(guò)來(lái)就行了。
2、讀取電壓之前,需要修改esp_init_data_default.bin文件中的第107byte的值,改為VDD3P3管腳3和4上的真實(shí)電源電壓值。
先說(shuō)修改esp_init_data_default.bin文件,這個(gè)其實(shí)很簡(jiǎn)單,因?yàn)檫@個(gè)文件是我們燒錄到ESP8266里面的,所以只要找到文件位置,用修改flash的函數(shù)改一下就行。
接下來(lái)這句話可能理解起來(lái)有點(diǎn)繞,這個(gè)VDD3P3管腳3和4是啥?模塊上沒(méi)有這兩個(gè)管腳啊~
還記得我在前言里面提到過(guò)的,ESP8266是樂(lè)鑫的芯片,安信可做的模組封裝。所以本文上面的原理圖截圖其實(shí)是模塊的管腳分布,并不是真實(shí)的芯片管腳。真實(shí)的模塊內(nèi)部的芯片原理圖是什么樣?我這里截取其中一部分,看一下:
懂?很簡(jiǎn)單。
3、第107byte的值的單位是0.1V,有效取值范圍是18~38.
這個(gè)就很好理解了,第二點(diǎn)已經(jīng)說(shuō)了,第107byte寫入的是VDD3P3管腳的電壓。而我們常用的供電電壓是3.3V,所以要寫入的值是33。因?yàn)閱挝皇?.1V,33*0.1V得到3.3V。
接下來(lái)看一下這三個(gè)函數(shù),system_adc_read() 剛才已經(jīng)看了,它的功能就是讀取ADC電壓值,很簡(jiǎn)單,直接調(diào)用讀取就行。
然后是system_get_vdd33(),我們看一下截圖:
簡(jiǎn)單來(lái)說(shuō),是用來(lái)測(cè)量VDD3P3管腳上的電壓的,可以理解為獲取當(dāng)前的工作電壓。工作前提必須要確保ADC管腳懸空,同時(shí)確保esp_init_data_default.bin的第127byte值為0xFF。
還有一個(gè)函數(shù),快速高精度的AD采樣,因?yàn)槠容^長(zhǎng),這里不截圖了,我總結(jié)一下。先看函數(shù)結(jié)構(gòu):
system_adc_read_fast(uint16 *adc_addr, uint16 adc_num, uint8 adc_clk_div)
注意事項(xiàng)和函數(shù)system_get_vdd33()類似,要限制輸入電壓值、修改107byte的值為VDD3P3,不同的地方在于,使用快速采樣函數(shù)的時(shí)候,要關(guān)閉wifi和所有中斷。
參數(shù)1:uint16 *adc_addr,ADC連續(xù)采樣輸出的地址指針
參數(shù)2:uint16 adc_num,ADC連續(xù)采樣的點(diǎn)數(shù),范圍1~65535
參數(shù)3:uint8 adc_clk_div,ADC工作時(shí)鐘=80M/ adc_clk_div,輸入范圍8~32,建議值8.
假設(shè)我們要連續(xù)采樣50次,那么可以定義一個(gè)50個(gè)元素的數(shù)組,把數(shù)組首地址給參數(shù)1,數(shù)組大小給參數(shù)2,參數(shù)3沒(méi)有特殊情況的話默認(rèn)輸入8.
所以,用過(guò)帶DMA功能的ADC的童鞋,會(huì)發(fā)現(xiàn)用法很相似。
接下來(lái)進(jìn)入演示部分,以之前的串口程序?yàn)槟0?,增加AD采樣功能,得到的AD值通過(guò)串口助手打印輸出。代碼比較簡(jiǎn)單,直接看一下主函數(shù)部分:
void ICACHE_FLASH_ATTRuser_init(void){ partition_item_t partition_item; uint16 vdd33 = 33; uint32 flash_r_w[1024]; uart_init(BIT_RATE_115200, BIT_RATE_115200); spi_flash_read(0x1fc*4096, flash_r_w, 4096); flash_r_w[107/4] = flash_r_w[107/4] & !(0xff<<((107%4)*8)); flash_r_w[107/4] = flash_r_w[107/4] | 33; spi_flash_erase_sector(0x1fc); spi_flash_write(0x1fc*4096,flash_r_w,4096); system_init_done_cb(system_done);}
前幾行比較簡(jiǎn)單,就是串口初始化。
接下來(lái)就到了修改esp_init_data_default.bin文件中的地方,該文件的地址為什么是0x1fc?
第二節(jié)講程序燒錄的時(shí)候,曾經(jīng)說(shuō)過(guò)每個(gè)文件的地址,如圖:
我的模塊是16Mbit的,esp_init_data_default.bin文件的起始地址是0x1fc000,0x1000等于10進(jìn)制的4096,所以0x1fc000=0x1fc*4096。
而我們要修改的是該文件的第107byte,而讀寫flash必須要4字節(jié)對(duì)齊,所以后面對(duì)107做了一些換算。理解不了的建議看一下第八節(jié)。
VDD33是前面定義的變量,值為33,對(duì)應(yīng)3.3V的供電電壓。
很簡(jiǎn)單吧?
系統(tǒng)初始化完成的回調(diào)函數(shù)里,我定義了一個(gè)軟件定時(shí)器,每隔3秒讀取一次ADC的電壓值,并通過(guò)串口打印出來(lái):
void system_done(){ wifi_station_disconnect(); os_timer_disarm(&LED_timer); os_timer_setfn(&LED_timer, (os_timer_func_t *)ADC_OUTPUT, NULL); os_timer_arm(&LED_timer, 3000, 1); }void ADC_OUTPUT(){ static adc_value = 0; adc_value = system_adc_read(); os_printf("adc_value is %d ", adc_value);}
細(xì)心的人會(huì)發(fā)現(xiàn)定義定時(shí)器之前有一行代碼:
wifi_station_disconnect();
這是因?yàn)槲业哪K之前保存了某個(gè)環(huán)境下的wifi賬號(hào)、密碼。即便主函數(shù)里沒(méi)有要求模塊連接wifi,上電后它還是會(huì)自動(dòng)連接,并打印相關(guān)信息。所以,加入這一行代碼,讓它不再連接。
這就完了?是的,so easy!
程序修改完成,保存、清理、編譯、下載一條龍,然后重新上電。這里借助串口助手來(lái)查看效果。設(shè)備上電之后,效果如下所示:
如圖所示,上電后開(kāi)始輸出ADC采集到的電壓值,前面兩個(gè)是200多,后面我用手擋住光敏電阻,導(dǎo)致光敏電阻阻值變大,R1分壓得到的電壓變小,只有40多。
實(shí)驗(yàn)完成。
鏈接:
https://pan.baidu.com/s/1yueZQpULiDklHK22TPqsqA
提取碼:tcfa
-
adc
+關(guān)注
關(guān)注
99文章
6533瀏覽量
545520 -
電壓
+關(guān)注
關(guān)注
45文章
5637瀏覽量
116164 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4345瀏覽量
62901
原文標(biāo)題:ESP8266_22基于自身ADC的電壓采樣
文章出處:【微信號(hào):gh_dae0718828df,微信公眾號(hào):gh_dae0718828df】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論