1、ADC 簡介
ADC 支持多達14 位的模擬數字轉換,具有多達12 位有效數字位。它包括一個模擬多路轉換器,具有多達8 個各自可配置的通道;以及一個參考電壓發生器。轉換結果通過DMA 寫入存儲器。還具有若干運行模式。
ADC 的主要特性如下:
● 可選的抽取率,這也設置了分辨率(7 到12 位)
● 8 個獨立的輸入通道,可接受單端或差分信號
● 參考電壓可選為內部單端、外部單端、外部差分或AVDD5
● 產生中斷請求
● 轉換結束時的DMA 觸發
● 溫度傳感器輸入
● 電池測量功能
2、ADC 操作
本節描述了ADC 的一般安裝和操作,并描述了CPU 存取的ADC 控制和狀態寄存器的使用。
2.1、ADC 輸入
The signals on the Port 0 pins can be used as ADC inputs. In the following, these port pins are referred to as the AIN0–AIN7 pins. The input pins AIN0–AIN7 are connected to the ADC.
可以把輸入配置為單端或差分輸入。在選擇差分輸入的情況下,差分輸入包括輸入對AIN0-1、AIN2-3、AIN4-5 和AIN6-7。電壓不能為負或者大于VDD。這些輸入對之間的區別書他們采用不同的模式進行轉換。
除了輸入引腳AIN0-AIN7,片上溫度傳感器的輸出也可以選擇作為ADC 的輸入,用于溫度測量。為此寄存器TR0.ADCTM 和ATEST.ATESTCTRL 必須分別按2.10 節和寄存器描述所述設置。
還可以輸入一個對應AVDD5/3 的電壓作為一個ADC 輸入。這個輸入允許諸如需要在應用中實現一個電池監測器的功能。注意在這種情況下參考電壓不能取決于電源電壓,比如AVDD5 電壓不能用作一個參考電壓。
單端電壓輸入AIN0 到AIN7 以通道號碼0 到7 表示。通道號碼8 到11 表示差分輸入,由AIN0–AIN1、AIN2–AIN3、AIN4–AIN5 和AIN6–AIN7 組成。通道號碼12 到15 表示G N D(12)溫度傳感器(14),和AVDD5/3(15)。這些值在ADCCON2.SCH 和ADCCON3.SCH 域中使用。
2.2、ADC 轉換序列(暫時難理解)
ADC將執行一系列的轉換,并把結果移動到存儲器(通過DMA),不需要任何CPU 干預。
轉換序列可以被APCFG 寄存器影響,八位模擬輸入來自I/O 引腳,不必經過編程變為模擬輸入。如果一個通道正常情況下應是序列的一部分,但是相應的模擬輸入在APCFG 中禁用,那么通道將被跳過。當使用差分輸入,處于差分對的兩個引腳都必須在APCFG 寄存器中設置為模擬輸入引腳。
The ADCCON2.SCH(用于定義轉換序列) register bits are used to define an ADC conversion sequence from the ADC inputs.
If ADCCON2.SCH is set to a value less than 8, the conversion sequence contains a conversion from each channel from 0 up to and including the channel number programmed in ADCCON2.SCH.(當設置該寄存器值小于8時,轉換序列為從通道0到SCH定義的值,包括該值)
When ADCCON2.SCH is set to a value between 8 and 12, the sequence consists of differential inputs, starting at channel 8 and ending at the programmed channel.(在8~12之間,為纏粉輸入,通道從8到定義的值)
For ADCCON2.SCH greater than or equal to 12, the sequence consists of the selected channel only.(如果大于12,則定義哪個就是哪個)
PS:the channel define in the last of 2.1
2.3、Single ADC Conversion(單個ADC轉換,2.2是設置一個ADC序列進行轉換)
In addition to this sequence of conversions, the ADC can be programmed to perform a single conversion from any channel(ADC能夠配置從任何一個channel開執行一次單通道轉換). Such a conversion is triggered by writing to the ADCCON3 register. (轉換開始的條件->)The conversion starts immediately unless a conversion sequence is already ongoing, in which case the single conversion is performed as soon as that sequence is finished.
2.4、ADC Operating Modes
本節描述:operating modes and initialization of conversions.
The ADC has three control registers: ADCCON1, ADCCON2, and ADCCON3. These registers are used to configure the ADC and to report status.
ADCCON1.EOC 位是一個狀態位,當一個轉換結束時,設置為高電平;當讀取ADCH 時,它就被清除。
ADCCON1.ST 位用于啟動一個轉換序列。當這個位設置為高電平,ADCCON1.STSEL 是11,且當前沒有轉換正在運行時,就啟動一個序列。當這個序列轉換完成,這個位就被自動清除。
ADCCON1.STSEL 位選擇哪個事件將啟動一個新的轉換序列。該選項可以選擇為外部引腳P2.0 上升沿或外部引腳事件,之前序列的結束事件,定時器1 的通道0 比較事件或ADCCON1.ST 是1。
ADCCON2 寄存器控制轉換序列是如何執行的。
ADCCON2.SREF 用于選擇參考電壓。參考電壓只能在沒有轉換運行的時候修改。
ADCCON2.SDIV 位選擇抽取率(并因此也設置了分辨率和完成一個轉換所需的時間,或樣本率)。抽取率只能在沒有轉換運行的時候修改。
轉換序列的最后一個通道由ADCCON2.SCH 位選擇,如上所述。
ADCCON3 寄存器控制單個轉換的通道號碼、參考電壓和抽取率。單個轉換在寄存器ADCCON3 寫入后將立即發生,或如果一個轉換序列正在進行,該序列結束之后立即發生。該寄存器位的編碼和ADCCON2 是完全一樣的。
2.5、ADC 轉換結果
數字轉換結果以2 的補碼形式表示。對于單端配置,結果總是為正。這是因為結果是輸入信號和地面之間的差值,它總是一個正符號數(Vconv=Vinp-Vinn,其中Vinn=0V)。當輸入幅度等于所選的電壓參考VREF時,達到最大值。
對于差分配置,兩個引腳對之間的差分被轉換,這個差分可以是負符號數。對于抽取率是512的一個數字轉換結果的12 位MSB,當模擬輸入Vconv 等于VREF 時,數字轉換結果是2047。當模擬輸入等于-VREF 時,數字轉換結果是-2048。
當ADCCON1.EOC 設置為1 時,數字轉換結果是可以獲得的,且結果放在ADCH 和ADCL 中。注意轉換結果總是駐留在ADCH 和ADCL 寄存器組合的MSB 段中。
當讀取ADCCON2.SCH 位時,它們將指示轉換在哪個通道上進行。ADCL 和ADCH 中的結果一般適用于之前的轉換。如果轉換序列已經結束, ADCCON2.SCH 的值大于最后一個通道號碼,但是如果最后寫入ADCCON2.SCH 的通道號碼是12 或更大,將讀回同一個值。
2.6、ADC 參考電壓
模擬數字轉換的正參考電壓可選擇為一個內部生成的電壓,AVDD5 引腳,適用于AIN7 輸入引腳的外部電壓,或適用于AIN6-AIN7 輸入引腳的差分電壓。
轉換結果的準確性取決于參考電壓的穩定性和噪音屬性。希望的電壓有偏差會導致ADC 增益誤差,與希望電壓和實際電壓的比例成正比。參考電壓的噪音必須低于ADC 的量化噪音,以確保達到規定的SNR。
2.7、ADC 轉換時間
ADC 只能運行在32 MHz XOSC 上,用戶不能整除系統時鐘。實際ADC 采樣的4 MHz 的頻率由固定的內部劃分器產生。執行一個轉換所需的時間取決于所選的抽取率。總的來說,轉換時間由以下公式給定:
Tconv = (抽取率+ 16) x 0.25 μs。
2.8、ADC 中斷
當通過寫ADCCON3 觸發的一個單個轉換完成時,ADC 將產生一個中斷。當完成一個序列轉換時,不產生一個中斷。
2.9、ADC DMA 觸發(和ADC中斷有種互補的感覺~)
每完成一個序列轉換,ADC 將產生一個DMA 觸發。當完成一個單個轉換,不產生DMA 觸發。
There is one DMA trigger for each of the eight channels defined by the first eight possible settings for ADCCON2.SCH。當通道中一個新的樣本準備轉換,DMA 觸發是活動的。The DMA triggers are named ADC_CHsd in Following Table, where s is single-ended channel and d is differential channel。
In addition, one DMA trigger, ADC_CHALL, is active when new data is ready from any of the channels in the ADC conversion sequence.
3、工程解析
從下面main函數可以看出,整個流程是先初始化串口收發(這個和上一節介紹的串口收發一模一樣,請參考上一節);接著是初始化ADC將片上片上溫度傳感器的輸出選擇作為ADC 的輸入用于溫度測量;在while大循環內則是連續讀取64次溫度數據并求平均(代碼中求平均方法有點怪),最后通過串口將采集的片內溫度傳感器數據輸出。
1 void main(void)
2 {
3 char i;
4 float AvgTemp;
5 char strTemp[6];
6
7 InitUART(); //初始化串口
8 InitSensor(); //初始化 ADC
9
10 while(1)
11 {
12 AvgTemp = GetTemperature();
13
14 for (i=0; i<63; i++)
15 {
16 AvgTemp += GetTemperature();
17 AvgTemp = AvgTemp/2; //每次累加后除 2
18 }
19
20 memset(strTemp, 0, 6);
21 sprintf(strTemp,"%.02f", AvgTemp);//將浮點數轉成字符串
22 UartSendString(strTemp, 5); //通過串口發給電腦顯示芯片溫度
23 DelayMS(1000); //延時
24 }
25 }
其中initSensor()是對ADC進行初始化:
第3行#define DISABLE_ALL_INTERRUPTS() (IEN0 = IEN1 = IEN2 = 0x00)是關閉所有中斷;
第4行為設置系統主時鐘為32M,上一節中main函數最前面做的工作;
1 void InitSensor(void)
2 {
3 DISABLE_ALL_INTERRUPTS(); //關閉所有中斷
4 InitClock(); //設置系統主時鐘為 32M
5 TR0=0x01; //設置為1來連接溫度傳感器到SOC_ADC
6 ATEST=0x01; //使能溫度傳感
7 }
第5行TR0=1為設置溫度傳感器連接到SOC_ADC:
第6行ATEST=1為使能溫度傳感器:
其中GetTemperature()函數用來獲取溫度傳感器AD的值:
1 /****************************************************************************
2 * 名 稱: GetTemperature()
3 * 功 能: 獲取溫度傳感器 AD 值
4 * 入口參數: 無
5 * 出口參數: 通過計算返回實際的溫度值
6 ****************************************************************************/
7 float GetTemperature(void)
8 {
9 uint value;
10
11 ADCCON3 = (0x3E); //選擇1.25V為參考電壓;14位分辨率;對片內溫度傳感器采樣
12 ADCCON1 |= 0x30; //選擇ADC的啟動模式為手動
13 ADCCON1 |= 0x40; //啟動AD轉化
14 while(!(ADCCON1 & 0x80)); //等待 AD 轉換完成
15 value = ADCL >> 4; //ADCL 寄存器低 2 位無效,由于他只有12位有效,ADCL寄存器低4位無效。網絡上很多代碼這里都是右移兩位,那是不對的
16 value |= (((uint)ADCH) << 4);
17
18 return (value-1367.5)/4.5-5; //根據 AD 值,計算出實際的溫度,芯片手冊有錯,溫度系數應該是4.5 /℃
19 //進行溫度校正,這里減去5℃(不同芯片根據具體情況校正)
20 }
其中ADCCON3設置為0x3E,即選擇內聯參考電壓,512采樣率(12位有效位數),對片內溫度傳感器單通道采樣!
其中 ADCCON1 |= 0x30 即Start select. Selects the event that starts a new conversion sequence(ADC啟動模式為手動)
其中 ADCCON1 |= 0x40 即Start a conversion sequence if ADCCON1.STSEL = 11 and no sequence is running(啟動ADC轉換)
其中 while(!(ADCCON1 & 0x80)) 即等待一次轉換完成
第15、16行:是獲得ADC采樣的12位有效數據的值保存在value中
15 value = ADCL >> 4; //ADCL 寄存器低 2 位無效,由于他只有12位有效,ADCL寄存器低4位無效。網絡上很多代碼這里都是右移兩位,那是不對的
16 value |= (((uint)ADCH) << 4);
但是value值只是ADC值,并不是溫度值,需要轉換,代碼18、19行就是完成轉換:(至于怎么算的我猜測應該有個公式對應!)
18 return (value-1367.5)/4.5-5; //根據 AD 值,計算出實際的溫度,芯片手冊有錯,溫度系數應該是4.5 /℃
19 //進行溫度校正,這里減去5℃(不同芯片根據具體情況校正)
4、實驗現象
將程序燒入CC2530,用USB連接開發板與PC,可以用串口助手觀察zigbee發來的溫度數據,當用手觸摸芯片時溫度會有明顯變化:
上一篇:ZigBee基礎實驗(八)--定時器一
下一篇:ZigBee基礎實驗(六)--UART(串口收發)
推薦閱讀
史海拾趣
COTO TECHNOLOGY的故事始于1917年,當時它在美國羅德島州的普羅維登斯以Coto Coil Incorporated的名字誕生,專注于線圈繞組的設計與制造。這個初創公司憑借對技術的深入理解和對質量的執著追求,逐漸在電子行業中嶄露頭角。它的線圈繞組產品以高精度、高穩定性而受到市場的青睞,為公司的初步發展奠定了堅實的基礎。
隨著汽車智能化的發展,ECT看到了車載連接器市場的巨大潛力。從2013年開始,公司開始布局車載連接器領域,并成功開發出多款適用于不同車型和場景的車載連接器產品。這一拓展不僅為ECT帶來了新的增長點,也進一步鞏固了公司在電子連接器行業的領先地位。
Auris公司的創始人Federic Moll博士,被譽為手術機器人之父。他在2007年創立了Auris Health(原名Auris Surgical Robotics),總部位于美國加利福尼亞州圣卡洛斯。Moll博士此前已經成功創辦了多家手術機器人企業,其中最為知名的是上市公司Intuitive Surgical,其達芬奇手術機器人技術已在全球范圍內廣泛應用。Moll博士的深厚技術背景和豐富的創業經驗為Auris的起步奠定了堅實的基礎。
在不斷追求技術創新的道路上,Auris公司并未止步。近年來,該公司正在積極研發柔性機器人技術,這種技術有望在治療喉嚨、肺和腸胃疾病方面發揮重要作用。柔性機器人的研發不僅展示了Auris在技術創新方面的持續努力,也為其在未來的醫療市場中搶占先機提供了有力支持。
這五個故事展示了Auris公司在電子行業中的發展歷程,從創始人的科技愿景到技術突破獲得認可,再到與強生的合作以及柔性機器人的研發,每一步都體現了Auris對于技術創新和市場拓展的不懈追求。這些事實性的故事不僅展現了Auris公司的成長軌跡,也反映了電子行業中技術創新和市場競爭的激烈態勢。
Dynachip Corp深知品質對于電子產品的重要性,因此他們建立了嚴格的質量管理體系,從原材料采購到生產過程再到成品檢測,每一個環節都嚴格把控。他們還引進了先進的生產設備和技術,確保產品的穩定性和可靠性。這種對品質的堅持使Dynachip Corp的產品在市場上獲得了廣泛認可,客戶群逐漸擴大。
在20世紀80年代初,Electro-Films Inc. 的創始人意識到了電子行業中對高性能薄膜材料的需求日益增加。因此,公司決定成立一個專門負責薄膜材料研發的部門,即Semi-Films Division。這個部門在成立之初就面臨著巨大的挑戰,但團隊憑借對技術的執著追求和不懈努力,成功開發出了具有優良電氣性能和機械性能的薄膜產品,為公司贏得了首批客戶。
DT-1在線液體密度測試變送器可對各種液體或液態混合物在線進行密度測量。故在石化行業可廣泛應用于煉油、調油、油水介面監測;在食品工業用于葡萄汁、番茄汁、果糖漿、植物油及軟飲料加工等生產現場;奶制品業;造紙業,黑漿、綠漿、白漿、堿溶液的 ...… 查看全部問答∨ |
五位半的測量范圍是:000000--199999 三位半的測量范圍是:0000--1999 可見,第一位只起0和1作用,所以稱半位. 數字表的數字有一個特點,它每位數字由七個筆劃組成,不同的筆劃組合先是不同的數字,例如顯示數字1用兩個筆劃,數字2用五個筆劃,如果 ...… 查看全部問答∨ |
External Medical and IT Power Supplies Meet Latest Energy Efficiency Standards XP Power has announced the launch of the AEF and AFM series of external AC/DC power supply units. Designed for a wide range of IT and portable medical equipment, the units provide single outputs with power output between 100 - 150 ...… 查看全部問答∨ |
寫過casio dt930手持機程序的朋友對日趨公司提供的rich_XXX 中間層函數了解多少? 我們公司以前開發casio dt930手持機程序都是用的這個日趨函數,但是因為不清楚其函數內部源碼,現在公司要求自己寫一個類似于這個日趨中間層函數庫的東西,其實現函數 ...… 查看全部問答∨ |
我把CxImage移植到EVC4.0的時候,編譯庫沒發現什么問題,但是鏈接到exe(exe是基于MFC的)的時候發現了如下的鏈接錯誤: ximapng.obj : error LNK2019: unresolved external symbol ___CxxLongjmpUnwind@4 referenced in function "public: bool __th ...… 查看全部問答∨ |
|
應該是通過指針,是嗎?下面的發送一個長整型數據的程序幫我看一下是否正確? void SendData(unsigned long int data){ unsigned long int *tmpdata; while((UTCTL1&0x01)==0); tmpdata=&data; // 得到存儲地址 TXBUF1=*tmpdata++; ...… 查看全部問答∨ |
|
各位大神,小弟按VCA820 datasheet 23頁Figure84搭出來的圖檢測,Rf和Rg分別為1K與200,增益按道理應該是10倍,現在最大只有2~3倍,極度郁悶,求解中!!!… 查看全部問答∨ |