第6課 CC2530的ADC工作原理與應(yīng)用 廣東職業(yè)技術(shù)學(xué)院 歐浩源 一、A/D轉(zhuǎn)換的基本工作原理 將時間上連續(xù)變化的模擬量轉(zhuǎn)化為脈沖有無的數(shù)字量,這一過程就叫做數(shù)字化,實現(xiàn)數(shù)字化的關(guān)鍵設(shè)備是ADC。 ADC:數(shù)模轉(zhuǎn)換器,將時間和幅值連續(xù)的模擬量轉(zhuǎn)化為時間和幅值離散的數(shù)字量,A/D轉(zhuǎn)換一般要經(jīng)過采樣、保持、量化和編碼4個過程。 二、CC2530的A/D轉(zhuǎn)換模塊 CC2530的ADC模塊支持最高14位二進制的模擬數(shù)字轉(zhuǎn)換,具有12位的有效數(shù)據(jù)位,它包括一個模擬多路轉(zhuǎn)換器,具有8個各自可配置的通道,以及一個參考電壓發(fā)生器。 該ADC模塊有如下主要特征: <1> 可選取的抽取率,設(shè)置分辨率(7~12位)。 <2> 8個獨立的輸入通道,可接收單端或差分信號。 <3> 參考電壓可選為內(nèi)部單端、外部單端、外部差分或AVDD5。 <4> 單通道轉(zhuǎn)換結(jié)束可產(chǎn)生中斷請求。 <5> 序列轉(zhuǎn)換結(jié)束可發(fā)出DMA觸發(fā)。 <6> 可將片內(nèi)溫度傳感器作為輸入。 <7> 電池電壓測量功能。 三、ADC模塊的信號輸入 端口0引腳可以配置為ADC輸入端,依次為AIN0~AIN7: <1> 可以把輸入配置為單端輸入或差分輸入。 <2> 差分輸入對:AIN0~AIN1、AIN2~AIN3、AIN4~AIN5、AIN6~AIN7。 <3> 片上溫度傳感器的輸出也可以作為ADC的輸入用于測量芯片的溫度。 <4> 可以將一個對應(yīng)AVDD5/3的電壓作為ADC輸入,實現(xiàn)電池電壓監(jiān)測。 <5> 負電壓和大于VDD的電壓都不能用于這些引腳。 <6> 單端電壓輸入AIN0~AIN7,以通道號碼0~7表示;四個差分輸入對則以 通道號碼8~11表示;溫度傳感器的通道號碼為14;AVDD5/3電壓輸入的通道號碼為15。 四、ADC相關(guān)的幾個概念 <1> 序列ADC轉(zhuǎn)換:可以按序列進行多通道的ADC轉(zhuǎn)換,并把結(jié)果通過DMA傳送到存儲器,而不需要CPU任何參與。 <2> 單通道ADC轉(zhuǎn)換:在程序設(shè)計中,通過寫ADCCON3寄存器觸發(fā)單通道ADC轉(zhuǎn)換,一旦寄存器被寫入,轉(zhuǎn)換立即開始。 <3> 參考電壓:內(nèi)部生成的電壓、AVDD5引腳、適用于AIN7輸入引腳的外部電壓,或者 適用于AIN6~AIN7輸入引腳的差分電壓。 <4> 轉(zhuǎn)換結(jié)果:數(shù)字轉(zhuǎn)換結(jié)果以2的補碼形式表示。對于單端,結(jié)果總是正的。對于差分配置,兩個引腳之間的差分被轉(zhuǎn)換,可以是負數(shù)。 當(dāng)ADCCON1.EOC設(shè)置為1時,數(shù)字轉(zhuǎn)換結(jié)果可以獲得,且結(jié)果總是駐留在ADCH和ADCL寄存器組合的MSB段中。 <5> 中斷請求:通過寫ADCCON3觸發(fā)一個單通道轉(zhuǎn)換完成時,將產(chǎn)生一個中斷,而完成 一個序列轉(zhuǎn)換時,是不產(chǎn)生中斷的。當(dāng)每完成一個序列轉(zhuǎn)換,ADC將產(chǎn)生 一個DMA觸發(fā)。 <6>寄存器:ADC有兩個數(shù)據(jù)寄存器:ADCL和ADCH;三個控制寄存器:ADCCON1、ADCCON2、ADCCON3;分別用來配置ADC并返回轉(zhuǎn)換結(jié)果。 五、實訓(xùn)項目:定時采集電壓數(shù)據(jù)發(fā)送到上位機 【1】配置APCFG寄存器 當(dāng)使用ADC時,端口0的引腳必須配置為ADC模擬輸入。要配置一個端口0引腳為一個ADC輸入,APCFG寄存器中相應(yīng)的位必須設(shè)置為1。這個寄存器的默認值是0,選擇端口0為非模擬輸入,即作為數(shù)字I/O端口。 注意:APCFG寄存器的設(shè)置將覆蓋P0SEL的設(shè)置。 【2】配置ADCCON3寄存器 單通道的ADC轉(zhuǎn)換,只需將控制字寫入ADCCON3寄存器即可。 【3】ADC初始化 主要對端口的功能進行選擇,設(shè)置其傳輸方向,并將端口設(shè)置為模擬輸入。 【4】ADC數(shù)據(jù)采集 首先將ADCIF標志位清0,接著對ADCCON3寄存器設(shè)置,該寄存器一旦被寫入,轉(zhuǎn)換立即開啟;然后等待ADCIF置1,這時候轉(zhuǎn)換完成,讀取數(shù)據(jù)即可。 【5】實訓(xùn)項目源代碼 #include 'ioCC2530.h'/*===============定時器1初始化函數(shù)==================*/void Init_Timer1{ T1CC0L = 0xd4; //設(shè)置最大計數(shù)值的低8位 T1CC0H = 0x30; //設(shè)置最大計數(shù)值的高8位 T1CCTL0 |= 0x04; //開啟通道0的輸出比較模式 T1IE = 1; //使能定時器1中斷 T1OVFIM = 1; //使能定時器1溢出中斷 EA = 1; //使能總中斷 T1CTL = 0x0e; //分頻系數(shù)是128,模模式}unsigned char count = 0;unsigned char F_time = 0;/*================定時器1服務(wù)函數(shù)====================*/#pragma vector = T1_VECTOR__interrupt void Timer1_Sevice{ T1STAT &= ~0x01; //清除定時器1通道0中斷標志 count++; if(count == 10) //定時1秒到 { F_time = 1; count = 0; }}/*===================UR0初始化函數(shù)====================*/void Init_Uart0{ PERCFG = 0x00; //串口0的引腳映射到位置1,即P0_2和P0_3 P0SEL = 0x0C; //將P0_2和P0_3端口設(shè)置成外設(shè)功能 U0BAUD = 59; //16MHz的系統(tǒng)時鐘產(chǎn)生9600BPS的波特率 U0GCR = 9; U0UCR |= 0x80; //禁止流控,8位數(shù)據(jù),清除緩沖器 U0CSR |= 0xC0; //選擇UART模式,使能接收器 UTX0IF = 0; //清除TX發(fā)送中斷標志 URX0IF = 0; //清除RX接收中斷標志 URX0IE = 1; //使能URAT0的接收中斷 EA = 1; //使能總中斷}unsigned char dat[4];/*===================UR0發(fā)送字符串函數(shù)==================*/void UR0SendString(unsigned char *str, unsigned char count){ while(count--) { U0DBUF = *str++; //將要發(fā)送的1字節(jié)數(shù)據(jù)寫入U0DBUF while(!UTX0IF); //等待TX中斷標志,即數(shù)據(jù)發(fā)送完成 UTX0IF = 0; }}/*===================ADC初始化函數(shù)====================*/void Init_ADC0{ P0SEL |= 0x01; //P0_0端口設(shè)置為外設(shè)功能 P0DIR &= ~0x01; //P0_0端口設(shè)置為輸入端口 APCFG |= 0x01; //P0_0作為模擬I/O使用}/*===================讀取ADC的數(shù)據(jù)====================*/void Get_ADC0_Value{ ADCIF = 0; //參考電壓選擇AVDD5引腳,256抽取率,AIN0通道0 ADCCON3 = (0x80 | 0x10 | 0x00); while(!ADCIF); //等待A/D轉(zhuǎn)換完成, dat[0] = 0xaf; dat[1] = ADCH; //讀取ADC數(shù)據(jù)低位寄存器 dat[2] = ADCL; //讀取ADC數(shù)據(jù)高位寄存器 dat[3] = 0xfa;}/*=======================主函數(shù)======================*/void main{ Init_Uart0; Init_Timer1; Init_ADC0; while(1) { if(F_time == 1) //定時1秒時間到 { Get_ADC0_Value; //進行A/D轉(zhuǎn)換并讀取數(shù)據(jù) UR0SendString(dat,4); //向上位機發(fā)送數(shù)據(jù) F_time = 0; //定時1秒標志清0 } }} 【結(jié)語】: 關(guān)于CC2530微控制器入門基礎(chǔ)教程到此大功告成。 理解并能獨立完成上述6個基本模塊的應(yīng)用,可以說基本上掌握了CC2530的基礎(chǔ)應(yīng)用,為日后學(xué)習(xí)Zigbee組網(wǎng)應(yīng)用打下了良好的基礎(chǔ)。 對于CC2530來說,進行低功耗無線組網(wǎng)應(yīng)用才是它的真正使命。有了我們?nèi)腴T的基礎(chǔ),后面如果有時間,我會把OSAL操作系統(tǒng)和z-Stack協(xié)議棧的應(yīng)用再做兩個系列的教材,讓大家真正的掌握CC2530的應(yīng)用精髓。 -------------------------------------------------------------------------------------------------------------------- 6>5>4>3>2>1>6>5>4>3>2>1>7>6>5>4>3>2>1> |
|