當(dāng)前位置:首頁 > 公眾號精選 > 嵌入式云IOT技術(shù)圈
[導(dǎo)讀]版權(quán)聲明:本文為博主原創(chuàng)文章,如有需要,請注明轉(zhuǎn)載地址:http://blog.csdn.net/morixinguan。若是侵權(quán)用于商業(yè)用途,請聯(lián)系博主,否則將追究責(zé)任 ADC,就是模數(shù)轉(zhuǎn)換器,什么是模數(shù)轉(zhuǎn)換器? 模數(shù)轉(zhuǎn)換器,在電子技術(shù)中即是將模擬信號轉(zhuǎn)換成數(shù)字信號,也稱為數(shù)字

版權(quán)聲明:本文為博主原創(chuàng)文章,如有需要,請注明轉(zhuǎn)載地址:http://blog.csdn.net/morixinguan。若是侵權(quán)用于商業(yè)用途,請聯(lián)系博主,否則將追究責(zé)任

ADC,就是模數(shù)轉(zhuǎn)換器,什么是模數(shù)轉(zhuǎn)換器?

模數(shù)轉(zhuǎn)換器,在電子技術(shù)中即是將模擬信號轉(zhuǎn)換成數(shù)字信號,也稱為數(shù)字量化。

當(dāng)然還有一種叫DAC,就是數(shù)模轉(zhuǎn)換,意思相反,即是將數(shù)字信號轉(zhuǎn)換成模擬信號。

在友善之臂ARM-contexA9這款開發(fā)板上的4412芯片本身就自帶了一個ADC的接口,我們來看看基本介紹:



數(shù)據(jù)手冊開篇介紹了這么多,最有用的一句話:精度10位或12位CMOS模數(shù)轉(zhuǎn)換器(ADC)包括多路模擬輸入。靈敏度為1M,一共有4路輸入,支持較低的電源模式等。

接下來我們還是跟以前一樣:

1、先看電路原理圖:



從原理圖和核心板上可以看出可調(diào)電阻的IO對應(yīng)數(shù)據(jù)手冊的是AIN[0]。



2、看數(shù)字手冊相關(guān)的寄存器

(1)ADC控制寄存器



寄存器的地址為:0x126C0000

在這里,我們要如何配置呢?

[0] 第0位:判斷A/D轉(zhuǎn)換有沒有開始

[2] 第2位:配置模式位(正常的,標(biāo)準(zhǔn)的,我們這里選擇默認(rèn)為0)

[6:13]第6~13位:這里要配置預(yù)分頻系數(shù),我們配置為49,對應(yīng)的公式就是:ADCCLK=PCLK/(49+10)=100MHZ / 50 =2MHZ

[14]第14位:選擇使能預(yù)分頻,寫1到這個位去就可以了

[15]第15位:判斷A/D轉(zhuǎn)換結(jié)束了沒有

[16]第16位:設(shè)置轉(zhuǎn)換的精度(10或者12,自己選)

(2)ADC數(shù)據(jù)寄存器


基地址:0x126C000C

[11:0] 第0~11位:ADC轉(zhuǎn)換的數(shù)據(jù)

(2)ADC通道選擇寄存器


基地址:0x12C001C

ADCMUX[0:3]:這里我們配置為0000,也就是通道0

3、寫代碼

config.h

  1. <span style="font-size:18px;">#ifndef __CONFIG_H__  

  2. #define __CONFIG_H__

  3. #define udelay  ((void (*)(unsigned int ))0x43e25e88)     //定義udelay在uboot中的地址,這樣我們就可以使用這個函數(shù)

  4. #define print   ((int (*)(const char *, ...))0x43e11434)  //定義printf在uboot中的地址

  5. typedef unsigned int u32;  

  6. typedefvolatile u32 v32;  

  7. //設(shè)置位

  8. #define set_one(reg, bit)   \

  9.                 ((*(v32 *)reg) |= (1<<bit))  

  10. #define set_zero(reg, bit)  \

  11.                 ((*(v32 *)reg) &= (~(1<<bit)))  

  12. #define set_bit(reg, bit, val)  \

  13.                 (*(v32 *)reg = (((*(v32 *)reg) & (~(1<<bit))) | (val << bit)))  

  14. #define set_2bit(reg, bit, val) \

  15.                 (*(v32 *)reg = (((*(v32 *)reg) & (~(3<<bit))) | (val << bit)))  

  16. #define set_nbit(reg, bit, n, val)  \

  17.                 (*(v32 *)reg = (((*(v32 *)reg) & (~( ((1<<n)-1) <<bit))) \  

  18.                                     | (val << bit)))  

  19. #define set_val(reg, val)   \

  20.                 ((*(v32 *)reg) = val)  

  21. #define get_bit(reg, bit)   \

  22.                 (((*(v32 *)reg) & (1<<bit)) >> bit)  

  23. #define get_2bit(reg, bit)  \

  24.                 (((*(v32 *)reg) & (3<<bit)) >> bit)  

  25. #define get_nbit(reg, bit, n)   \

  26.                 (((*(v32 *)reg) & (((1<<n)-1) <<bit)) >> bit)  

  27. #define get_val(reg)        \

  28.                 (*(v32 *)reg)  

  29. #endif</span>

<span style="font-size:18px;">#ifndef	__CONFIG_H__
#define __CONFIG_H__

#define udelay	((void (*)(unsigned int ))0x43e25e88)     //定義udelay在uboot中的地址,這樣我們就可以使用這個函數(shù)
#define print	((int (*)(const char *, ...))0x43e11434)  //定義printf在uboot中的地址

typedef unsigned int u32;
typedef volatile u32 v32;
//設(shè)置位
#define set_one(reg, bit)	\
				((*(v32 *)reg) |= (1<<bit))
#define set_zero(reg, bit)	\
				((*(v32 *)reg) &= (~(1<<bit)))
#define set_bit(reg, bit, val)	\
				(*(v32 *)reg = (((*(v32 *)reg) & (~(1<<bit))) | (val << bit)))
#define set_2bit(reg, bit, val)	\
				(*(v32 *)reg = (((*(v32 *)reg) & (~(3<<bit))) | (val << bit)))
#define set_nbit(reg, bit, n, val)	\
				(*(v32 *)reg = (((*(v32 *)reg) & (~( ((1<<n)-1) <<bit))) \
									| (val << bit)))
#define set_val(reg, val)	\
				((*(v32 *)reg) = val)

#define get_bit(reg, bit)	\
				(((*(v32 *)reg) & (1<<bit)) >> bit)
#define get_2bit(reg, bit)	\
				(((*(v32 *)reg) & (3<<bit)) >> bit)
#define get_nbit(reg, bit, n)	\
				(((*(v32 *)reg) & (((1<<n)-1) <<bit)) >> bit)
#define get_val(reg)		\
				(*(v32 *)reg)


#endif</span>

adc.h

  1. <span style="font-size:18px;">#ifndef __ADC_H__  

  2. #define __ADC_H__

  3. #define ADCCON 0x126C0000     //ADC控制寄存器

  4. #define ADCDAT 0x126C000C     //ADC數(shù)據(jù)寄存器

  5. #define ADCMUX 0x126C001C     //ADC通道寄存器

  6. #define CLRINTADC   0x126C0018  //清除ADC中斷

  7. #endif</span>

<span style="font-size:18px;">#ifndef	__ADC_H__
#define __ADC_H__

#define ADCCON 0x126C0000     //ADC控制寄存器
#define ADCDAT 0x126C000C     //ADC數(shù)據(jù)寄存器
#define ADCMUX 0x126C001C     //ADC通道寄存器
#define CLRINTADC	0x126C0018  //清除ADC中斷

#endif</span>

adc.c

  1. <span style="font-size:18px;">#include <adc.h>  

  2. #include <config.h>

  3. void select_mux(void)  

  4. {  

  5.     set_nbit(ADCMUX, 0, 4, 0x0);   //設(shè)置通道為通道0

  6. }  

  7. void adc_init(void)  

  8. {  

  9.     set_val(ADCCON, ((1<<16)|(1<<14)|(49<<6)));   //按照數(shù)據(jù)手冊參數(shù)來配置adc控制寄存器的初始化部分

  10. }  

  11. void adc_start(void)  

  12. {  

  13.     set_one(ADCCON, 0);   //adc轉(zhuǎn)換開始的配置,默認(rèn)參數(shù)為0

  14. }  

  15. int adc_wait_flag(void)  

  16. {  

  17.     return get_bit(ADCCON, 15);<span style="white-space:pre"> </span>//AD轉(zhuǎn)換是否成功

  18. }  

  19. int adc_data(void)  

  20. {  

  21.     return get_nbit(ADCDAT, 0, 12); //獲取ADC數(shù)據(jù)

  22. }     

  23. void clear_adc(void)  

  24. {  

  25.     set_val(CLRINTADC, 0);<span style="white-space:pre">  </span>//清ADC

  26. }</span>  

<span style="font-size:18px;">#include <adc.h>
#include <config.h>

void select_mux(void)
{
	set_nbit(ADCMUX, 0, 4, 0x0);   //設(shè)置通道為通道0
}

void adc_init(void)
{
	set_val(ADCCON, ((1<<16)|(1<<14)|(49<<6)));	//按照數(shù)據(jù)手冊參數(shù)來配置adc控制寄存器的初始化部分
}

void adc_start(void)
{
	set_one(ADCCON, 0);   //adc轉(zhuǎn)換開始的配置,默認(rèn)參數(shù)為0
}

int adc_wait_flag(void)
{
	return get_bit(ADCCON, 15);<span style="white-space:pre">	</span>//AD轉(zhuǎn)換是否成功
}

int adc_data(void)
{
	return get_nbit(ADCDAT, 0, 12); //獲取ADC數(shù)據(jù)
}	

void clear_adc(void)
{
	set_val(CLRINTADC, 0);<span style="white-space:pre">	</span>//清ADC
}</span>

main.c

  1. <span style="font-size:18px;">#include <config.h>  

  2. #include <adc.h>

  3. int main(void)  

  4. {     

  5.     //設(shè)置ADC通道為通道0

  6.     select_mux();  

  7.     //adc初始化

  8.     adc_init();  

  9.     //adc轉(zhuǎn)換開始

  10.     adc_start();  

  11.     while(1)  

  12.     {  

  13.         //判斷是否已經(jīng)轉(zhuǎn)換

  14.         if(adc_wait_flag())  

  15.         {  

  16.             //打印相應(yīng)的數(shù)據(jù)

  17.             print("data = %d\n",adc_data());  

  18.             //重新adc轉(zhuǎn)換開始

  19.             adc_start();  

  20.         }  

  21.     }     

  22.     return 0;  

  23. }</span>  

<span style="font-size:18px;">#include <config.h>
#include <adc.h>
int main(void)
{	
	//設(shè)置ADC通道為通道0
	select_mux();
	//adc初始化
	adc_init();
	//adc轉(zhuǎn)換開始
	adc_start();
	while(1)
	{
		//判斷是否已經(jīng)轉(zhuǎn)換
		if(adc_wait_flag())
		{
			//打印相應(yīng)的數(shù)據(jù)
			print("data = %d\n",adc_data());
			//重新adc轉(zhuǎn)換開始
			adc_start();
		}
	}	
	return 0;
}</span>


4、makefile略

5、觀察結(jié)果

先讓uboot啟動


然后用dnw下載程序:


最后旋轉(zhuǎn)電阻觀察數(shù)據(jù)變化:


免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉