tft每日頭條

 > 科技

 > 了解三分鐘

了解三分鐘

科技 更新时间:2024-06-30 16:25:04

了解三分鐘? 在第 7 節,我們讨論了借助于單片機和傳感器,電腦也能獲取環境參數,例如室内的溫度和濕度等信息,接下來我們就來聊聊關于了解三分鐘?以下内容大家不妨參考一二希望能幫到您!

了解三分鐘(三分鐘弄懂什麼是ADC)1

了解三分鐘

在第 7 節,我們讨論了借助于單片機和傳感器,電腦也能獲取環境參數,例如室内的溫度和濕度等信息。

不過不知道大家注意到沒有,環境的溫濕度應該是無時無刻都在變化的,而我們使用單片機采集的溫濕度值卻是離散的(大約1秒個溫度值),這其實就是将模拟信息數字化的過程。

使用ADC将模拟信号數字化

相當一部分單片機都帶有 adc 外設,ADC 的功能就是将模拟信息數字化。恰好我使用的這款 51 單片機就有 ADC 功能,本節将介紹該模塊。目的是讓我們的電腦具備測量電壓的能力。

ADC 的全稱是 Analog-to-Digital Converter,即“模拟到數字轉換器”,它可以将連續不斷變化的模拟信号轉換為離散的數字信号,供計算機進一步處理。

将模拟信号數字化之後,才能使用計算機處理之,因為計算機本身就是數字電路組成的運算機器。

其實說将模拟信号“轉換”為離散信号并不合适,更恰當的說法應該是 ADC 從模拟信号中取出“一部分”信息,請看下面右圖的黑點即為 ADC 采集的數字信号。

這麼看來,ADC的重要參數有兩個:采樣頻率和精度。采樣頻率決定了 ADC 從模拟信号中取數據的“密集”程度,一般來說肯定越密集越好,因為這樣更能還原信号的特性。精度則決定了取數據的時的精确性。

以我的 51 單片機為例,它有 8 路 10 位的 ADC,采樣頻率為 250K/s。所以它能從每秒的模拟信号中取出 25 萬個數字信号,也就相當于在坐标系中用 25 萬個點描繪出 1 秒的信号。

精度為 10 位,也就是說它利用 1~1024(2的十次方)的數字表示信号,我的 51 單片機 ADC 的參考電壓信号為 5V,所以它能夠表示的最小電壓為 5V/1024 約為 5mV。

C語言編程單片機,實現ADC采樣

現在知道了什麼是 ADC,怎麼使用它呢?請繼續往下看。我使用的這款 51 單片機自帶的 ADC 模塊結構如下圖所示:

可以看出,最終得到的數字信号其實是經過逐次比較的來的。下圖是 ADC 相關寄存器的信息:

所以,在 keil4 中可以寫出如下C語言代碼:

sfr ADC_CONTR = 0xbc; sfr ADC_RES = 0xbd; // 高 8 位結果 sfr ADC_LOW2 = 0xbe; // 低 2 位結果 sfr P1ASF = 0x9d; //

我的這款 51 單片機的 ADC 轉換通道與 P1 口複用,上電複位後 P1 口為弱上拉型 IO 口,我們可以通過 C語言編程設置這 8 路的任意一路做 ADC 轉換。

void adc_init() { P1ASF = 0xff; // 8 個通道都開 ADC_RES = 0; ADC_CONTR = ADC_POWER|ADC_SPEEDLL; delay_about_100ms(2); }

上面的C語言代碼中,我們将 P1ASF 賦值為 0xff,表示 P1 的 8 個 IO 口都可以作為 ADC 采樣口。然後延時一段時間,等待 ADC 模塊初始化。

因為我使用的這款 51 單片機是一個 8 位單片機,傳送 10 位的 ADC 值需要兩次,當 AUXR1.1/ADRJ = 0 時,ADC 轉換結果寄存器格式如下:

當 AUXR1.1/ADRJ = 1 時,ADC 轉換結果寄存器格式如下:

這麼看來,獲取一次 ADC 的采樣值高 8 位的 C語言代碼可以如下寫:

// 獲取高 8 位的 adc 值 BYTE get_adc_h8bit(BYTE ch) { ADC_CONTR = ADC_POWER|ADC_SPEEDLL|ADC_START|ch; _nop_();_nop_();_nop_();_nop_(); // 等待轉換完成 while(!(ADC_CONTR & ADC_FLAG)); ADC_CONTR &= ~ADC_FLAG; return ADC_RES; }

然後将之與餘下 2 位 ADC 值組合一下,就得到了一次完整的ADC采樣值:

// 獲取 10 位 adc WORD get_adc_res(BYTE ch) { WORD res = 0; res = get_adc_h8bit(ch); res <<= 2; res |= ADC_LOW2; return res; }

使用電腦測量電壓值

上面一小部分介紹了單片機的 ADC 模塊使用方法,結合之前介紹的單片機的串口 printf,我們已經能夠把外界的電壓值轉換為 1~1024 之間的數值并傳送到電腦了,但是如何将之轉換為電壓值呢?

其實很簡單,我的這款單片機 ADC 模塊的參考電壓為 5V,假設 ADC 采集的數值為 n,那麼對應的電壓值為:

U = n*5V / 1024

如此一來,C語言控制程序可以如下寫:

void main() { init_uart(9600); adc_init(); while(1){ delay_about_100ms(2); printf("adc: %0.2f\r\n", 5.0*((float)get_adc_res(0))/1024.0); } }

使用電腦測量電壓

如上圖,為了方便測試,将可變電阻和定電阻串聯,将單片機的 P10 口與中間相連,即可在電腦端的串口調試助手得到電壓信息:

使用電壓表測量該點的電壓值,發現的确在 3.05V 附近:

現在調節可變電阻,發現串口傳來的電壓值也随之改變:

至此就實現了使用電腦測量電壓,相信大家也應該明白了 ADC 的功能。

歡迎在評論區一起讨論,質疑。文章都是手打原創,每天最淺顯的介紹C語言、linux等嵌入式開發,喜歡我的文章就關注一波吧,可以看到最新更新和之前的文章哦。

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved