www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(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ù)。文章僅代表作者個人觀點(diǎn),不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

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

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護(hù)是驅(qū)動電源設(shè)計(jì)中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機(jī)驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計(jì)工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉