0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

CC2530 ADC配置步驟

DS小龍哥-嵌入式技術(shù) ? 來源:DS小龍哥-嵌入式技術(shù) ? 作者:DS小龍哥-嵌入式技 ? 2023-07-06 14:45 ? 次閱讀

第一章 A/D轉(zhuǎn)換的基本工作原理

A/D轉(zhuǎn)換(Analog-to-Digital Conversion)是將模擬信號轉(zhuǎn)換為數(shù)字信號的過程。在各種電子系統(tǒng)中廣泛應用,包括微控制器、數(shù)據(jù)采集系統(tǒng)、傳感器接口等。

A/D轉(zhuǎn)換器的基本工作原理如下:

(1)采樣(Sampling):A/D轉(zhuǎn)換開始時,模擬輸入信號被以固定時間間隔采樣。采樣是指在一段時間內(nèi)測量并記錄模擬輸入信號的電壓值或電流值。采樣速率決定了每秒對信號進行采樣的次數(shù),也稱為采樣頻率。

(2)量化(Quantization):采樣后,模擬信號的幅度需要被量化為離散的數(shù)字值。這個過程將連續(xù)的模擬信號劃分為有限數(shù)量的離散級別,它決定了數(shù)字表示的精度。量化過程涉及將每個采樣值映射到最接近的離散級別上。

(3)編碼(Encoding):量化后,所得到的離散級別需要被編碼為二進制數(shù)字。在大多數(shù)情況下,使用二進制編碼來表示每個離散級別。編碼的位數(shù)決定了A/D轉(zhuǎn)換器的分辨率和所能表示的數(shù)字范圍。

(4)樣本保持(Sample and Hold):在進行A/D轉(zhuǎn)換的過程中,模擬信號的值需要保持不變,以便進行準確的量化和編碼。為了實現(xiàn)這一點,樣本保持電路用于在樣本期間“凍結(jié)”輸入信號,直到轉(zhuǎn)換完成。

(5)轉(zhuǎn)換速率(Conversion Rate):A/D轉(zhuǎn)換器的轉(zhuǎn)換速率指的是它可以執(zhí)行的轉(zhuǎn)換操作的頻率。轉(zhuǎn)換速率取決于A/D轉(zhuǎn)換器的性能和應用需求。較高的轉(zhuǎn)換速率對于需要實時數(shù)據(jù)獲取和高速處理的應用是重要的。

A/D轉(zhuǎn)換的基本工作原理包括采樣、量化、編碼和樣本保持等步驟。通過這些步驟,模擬信號被轉(zhuǎn)換為離散的數(shù)字表示,從而使得數(shù)字系統(tǒng)能夠處理和分析這些信號。A/D轉(zhuǎn)換器在許多應用中都扮演著至關(guān)重要的角色,例如傳感器數(shù)據(jù)采集、音頻處理、儀器測量等。

img

第二章 CC2530的A/D轉(zhuǎn)換模塊

CC2530的ADC模塊支持最高14位二進制的模擬數(shù)字轉(zhuǎn)換,具有12位的有效數(shù)據(jù)位,它包括一個模擬多路轉(zhuǎn)換器,具有8個各自可配置的通道,以及一個參考電壓發(fā)生器。

img

ADC模塊有如下主要特征:

<1> 可選取的抽取率,設置分辨率(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> 差分輸入對:AIN0AIN1、AIN2AIN3、AIN4AIN5、AIN6AIN7。

<3> 片上溫度傳感器的輸出也可以作為ADC的輸入用于測量芯片的溫度。

<4> 可以將一個對應AVDD5/3的電壓作為ADC輸入,實現(xiàn)電池電壓監(jiān)測。

<5> 負電壓和大于VDD的電壓都不能用于這些引腳。

<6> 單端電壓輸入AIN0AIN7,以通道號碼07表示;四個差分輸入對則以 通道號碼8~11表示;溫度傳感器的通道號碼為14;AVDD5/3電壓輸入的通道號碼為15。

第四章 ADC相關(guān)的幾個概念

<1> 序列ADC轉(zhuǎn)換:可以按序列進行多通道的ADC轉(zhuǎn)換,并把結(jié)果通過DMA傳送到存儲器,而不需要CPU任何參與。

<2> 單通道ADC轉(zhuǎn)換:在程序設計中,通過寫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ù)。 當ADCCON1.EOC設置為1時,數(shù)字轉(zhuǎn)換結(jié)果可以獲得,且結(jié)果總是駐留在ADCH和ADCL寄存器組合的MSB段中。

<5> 中斷請求:通過寫ADCCON3觸發(fā)一個單通道轉(zhuǎn)換完成時,將產(chǎn)生一個中斷,而完成 一個序列轉(zhuǎn)換時,是不產(chǎn)生中斷的。當每完成一個序列轉(zhuǎn)換,ADC將產(chǎn)生 一個DMA觸發(fā)。

<6> 寄存器:ADC有兩個數(shù)據(jù)寄存器:ADCL和ADCH;三個控制寄存器:ADCCON1、ADCCON2、ADCCON3;分別用來配置ADC并返回轉(zhuǎn)換結(jié)果。

第五章 ADC配置步驟

【1】配置APCFG寄存器

當使用ADC時,端口0的引腳必須配置為ADC模擬輸入。要配置一個端口0引腳為一個ADC輸入,APCFG寄存器中相應的位必須設置為1。這個寄存器的默認值是0,選擇端口0為非模擬輸入,即作為數(shù)字I/O端口。

注意:寄存器的設置將覆蓋P0SEL的設置。

img

【2】配置ADCCON3寄存器

單通道的ADC轉(zhuǎn)換,只需將控制字寫入ADCCON3寄存器即可。

img

img

【3】ADC初始化

主要對端口的功能進行選擇,設置其傳輸方向,并將端口設置為模擬輸入。

【4】ADC數(shù)據(jù)采集

首先將ADCIF標志位清0,接著對ADCCON3寄存器設置,該寄存器一旦被寫入,轉(zhuǎn)換立即開啟;然后等待ADCIF置1,這時候轉(zhuǎn)換完成,讀取數(shù)據(jù)即可。

第六章 源代碼

【1】內(nèi)置溫度采集

/******************************************************************************
 CC2530模塊AD測試程序
 通過內(nèi)置溫度傳感器實現(xiàn)溫度采集
 ******************************************************************************/
 #include < ioCC2530.h >
 #include < stdio.h >
 ?
 #define uint unsigned int
 // Data
 typedef unsigned char       BYTE;
 ?
 // Unsigned numbers
 typedef unsigned char       UINT8;
 typedef unsigned char       INT8U;
 typedef unsigned short      UINT16;
 typedef unsigned short      INT16U;
 typedef unsigned long       UINT32;
 typedef unsigned long       INT32U;
 ?
 // Signed numbers
 typedef signed char         INT8;
 typedef signed short        INT16;
 typedef signed long         INT32;
 ?
 #define ADC_REF_1_25_V      0x00
 #define ADC_14_BIT          0x30
 #define ADC_TEMP_SENS       0x0E
 ?
 #define DISABLE_ALL_INTERRUPTS() (IEN0 = IEN1 = IEN2 = 0x00)
 ?
 #define ADC_SINGLE_CONVERSION(settings) \\
    do{ ADCCON3 = (settings); }while(0)
 ?
 #define ADC_SAMPLE_SINGLE() \\
   do { ADC_STOP(); ADCCON1 |= 0x40;  } while (0)
 ?
 #define ADC_SAMPLE_READY()  (ADCCON1 & 0x80)
 ?
 #define ADC_STOP() \\
   do { ADCCON1 |= 0x30; } while (0)
 ?
 #define ADC14_TO_CELSIUS(ADC_VALUE)    ( ((ADC_VALUE) > > 4) - 335)
 ?
 /**************************
 系統(tǒng)時鐘 不分頻
 計數(shù)時鐘 32分頻
 **************************/
 void InitClock(void)
 {
     CLKCONCMD = 0x28;           //時器計數(shù)時鐘設定為1M Hz,  系統(tǒng)時鐘設定為32 MHz 
     while(CLKCONSTA & 0x40);    //等晶振穩(wěn)定
 }
 ?
 /*****************************************
  串口初始化函數(shù):初始化串口 UART0        
 *****************************************/
 void InitUART0(void)
 {
     PERCFG = 0x00;               //位置1 P0口
     P0SEL = 0x3c;                //P0用作串口
     
     P2DIR &= ~0XC0;                           //P0優(yōu)先作為UART0    
     U0CSR |= 0x80;                        //串口設置為UART方式
     U0GCR |= 9;             
     U0BAUD |= 59;                         //波特率設為19200
 ?
     UTX0IF = 1;                               //UART0 TX中斷標志初始置位1  
     U0CSR |= 0X40;                //允許接收
     IEN0 |= 0x84;                 //開總中斷,接收中斷
 }
 ?
 /****************************************************************
    串口發(fā)送字符串函數(shù)                        
 ****************************************************************/
 void UartTX_Send_String(char *Data,int len)
 {
   int j;
   for(j=0;j< len;j++)
   {
     U0DBUF = *Data++;
     while(UTX0IF == 0);
     UTX0IF = 0;
   }
    U0DBUF = 0x0A;        //換行
    while(UTX0IF == 0);
    UTX0IF = 0;
 }
 ?
 /****************************************************************
   延時函數(shù)              
 ****************************************************************/
 void Delay(uint n)
 {
     uint i;
     for(i=0;i< n;i++);
     for(i=0;i< n;i++);
     for(i=0;i< n;i++);
     for(i=0;i< n;i++);
     for(i=0;i< n;i++);
 }
 ?
 INT16 AvgTemp;
 ?
 /****************************************************************
 溫度傳感器初始化函數(shù)                      
 ****************************************************************/
 void initTempSensor(void)
 {
    DISABLE_ALL_INTERRUPTS();            //關(guān)閉所有中斷
    InitClock();                         //設置系統(tǒng)主時鐘為32M
    *((BYTE __xdata*) 0x624B) = 0x01;    //開啟溫度傳感器
    *((BYTE __xdata*) 0x61BD) = 0x01;    //將溫度傳感器與ADC連接起來
 }
 ?
 /****************************************************************
 讀取溫度傳感器AD值函數(shù)                        
 ****************************************************************/
 INT8 getTemperature(void)
 {
   UINT8   i;
   UINT16  AdcValue;
   UINT16  value;
 ?
   AdcValue = 0;
   for( i = 0; i < 4; i++ )
   {
     ADC_SINGLE_CONVERSION(ADC_REF_1_25_V | ADC_14_BIT | ADC_TEMP_SENS);    // 使用1.25V內(nèi)部電壓,12位分辨率,AD源為:溫度傳感器
     ADC_SAMPLE_SINGLE();                                                   //開啟單通道ADC
     while(!ADC_SAMPLE_READY());                 //等待AD轉(zhuǎn)換完成
     value =  ADCL > > 2;                         //ADCL寄存器低2位無效
     value |= (((UINT16)ADCH) < < 6);    
     AdcValue += value;                          //AdcValue被賦值為4次AD值之和
   }
   value = AdcValue > > 2;                        //累加除以4,得到平均值
   return ADC14_TO_CELSIUS(value);               //根據(jù)AD值,計算出實際的溫度
 }
 ?
 /****************************************************************
 主函數(shù) 
 ****************************************************************/
 void main(void)
 {   
       char i;
       char TempValue[10]; 
       InitUART0();                                    //初始化串口
       initTempSensor();                               //初始化ADC
       while(1)
       {
         AvgTemp = 0;
         for(i = 0 ; i < 64 ; i++)
         {
           AvgTemp += getTemperature();              
           AvgTemp > >= 1;                              //每次累加后除2.
         }
          sprintf(TempValue, (char *)"%d ℃", (INT8)AvgTemp);
          UartTX_Send_String(TempValue,4);           
          Delay(50000);
       }
 }
 ?

【2】ADC通道0模擬數(shù)據(jù)采集

#include "ioCC2530.h"
 /*===============定時器1初始化函數(shù)==================*/
 void Init_Timer1()
 {
   T1CC0L = 0xd4;        //設置最大計數(shù)值的低8位
   T1CC0H = 0x30;        //設置最大計數(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服務函數(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端口設置成外設功能
   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端口設置為外設功能
   P0DIR &= ~0x01;     //P0_0端口設置為輸入端口
   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
     }
   }
 }
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 轉(zhuǎn)換器
    +關(guān)注

    關(guān)注

    27

    文章

    8517

    瀏覽量

    146093
  • adc
    adc
    +關(guān)注

    關(guān)注

    97

    文章

    6314

    瀏覽量

    542604
  • 模擬信號
    +關(guān)注

    關(guān)注

    8

    文章

    1086

    瀏覽量

    52262
  • 數(shù)字信號
    +關(guān)注

    關(guān)注

    2

    文章

    927

    瀏覽量

    47443
  • CC2530
    +關(guān)注

    關(guān)注

    19

    文章

    221

    瀏覽量

    57514
收藏 人收藏

    評論

    相關(guān)推薦

    CC2530 GPIO口輸入配置配置步驟

    介紹CC2530 GPIO口輸入配置配置。
    的頭像 發(fā)表于 07-06 14:40 ?2184次閱讀
    <b class='flag-5'>CC2530</b> GPIO口輸入<b class='flag-5'>配置</b><b class='flag-5'>配置</b><b class='flag-5'>步驟</b>

    CC2530 外部中斷配置步驟

    介紹CC2530 外部中斷配置步驟
    的頭像 發(fā)表于 07-06 14:41 ?2421次閱讀
    <b class='flag-5'>CC2530</b> 外部中斷<b class='flag-5'>配置</b><b class='flag-5'>步驟</b>

    Cc2530

    CC2530
    三分溫柔
    發(fā)布于 :2022年05月31日 21:12:52

    實現(xiàn)CC2530ADC采集外部電壓

    實現(xiàn)CC2530ADC采集外部電壓要在zigbee的組網(wǎng)中加入煙霧傳感器的模塊,所以需要用到CC2530ADC對傳感器輸出的模擬信號進行采樣。下面是自己對實現(xiàn)用
    發(fā)表于 04-14 15:51

    CC2530 ADC問題

    CC2530 內(nèi)部ADC是12位的還是14位的,如果是12位的,為何寄存器是14位的。
    發(fā)表于 06-24 06:23

    CC2530應用電路

    CC2530應用電路 Component Description Va
    發(fā)表于 06-29 08:09 ?5435次閱讀
    <b class='flag-5'>CC2530</b>應用電路

    基于CC2530的SDHC卡讀寫設計

    提出了將SDHC卡作為CC2530的外部存儲設備實現(xiàn)數(shù)據(jù)存儲的方法。SDHC卡具有體積小、存儲容量大的特點,通過CC2530組建的無線傳感網(wǎng)絡適用于工業(yè)監(jiān)測,而將SDHC卡與CC2530相結(jié)合
    發(fā)表于 05-02 14:28 ?3556次閱讀
    基于<b class='flag-5'>CC2530</b>的SDHC卡讀寫設計

    cc2530底板

    CC2530的核心板原理圖和詳細底板的PCB,包括重要外設的PCB
    發(fā)表于 06-20 17:48 ?0次下載

    cc2530的PWM實現(xiàn)

    CC2530 結(jié)合了領(lǐng)先的RF 收發(fā)器的優(yōu)良性能,業(yè)界標準的增強型8051 CPU,系統(tǒng)內(nèi)可編程閃存,8-KB RAM 和許多其它強大的功能。CC2530 有四種不同的閃存版本:CC2530F32/64/128/256,分別具有
    發(fā)表于 11-07 18:43 ?3950次閱讀
    <b class='flag-5'>cc2530</b>的PWM實現(xiàn)

    cc2530 adc測外部電壓

    CC2530 是用于2.4-GHz IEEE 802.15.4、ZigBee 和RF4CE 應用的一個真正的片上系統(tǒng)(SoC)解決方案。它能夠以非常低的總的材料成本建立強大的網(wǎng)絡節(jié)點。要在zigbee的組網(wǎng)中加入煙霧傳感器的模塊,所以需要用到cc2530
    發(fā)表于 11-07 18:53 ?5475次閱讀
    <b class='flag-5'>cc2530</b> <b class='flag-5'>adc</b>測外部電壓

    CC2530英文數(shù)據(jù)手冊

    CC2530英文數(shù)據(jù)手冊
    發(fā)表于 12-02 11:06 ?29次下載
    <b class='flag-5'>CC2530</b>英文數(shù)據(jù)手冊

    CC2530芯片的基本特性和CC2530無線模塊的設計

    本文介紹了CC2530芯片的基本特性,論述了以CC2530芯片為核心的無線通信模塊的硬件設計和調(diào)試軟件設計,在介紹設計規(guī)范和模塊結(jié)構(gòu)的基礎(chǔ)上,采用TI公司的CC2530芯片作為主控制芯片設計出具
    發(fā)表于 02-11 08:00 ?96次下載
    <b class='flag-5'>CC2530</b>芯片的基本特性和<b class='flag-5'>CC2530</b>無線模塊的設計

    CC2530控制LED閃爍

    CC2530控制LED閃爍CC2530 控制LED閃爍電路圖知識點CC2530有兩個高頻時鐘輸入輸出配置程序及注釋CC2530 控制LED閃
    發(fā)表于 11-29 18:51 ?15次下載
    <b class='flag-5'>CC2530</b>控制LED閃爍

    CC2530授課筆記】⑩ ADC 數(shù)模轉(zhuǎn)換,信號采集,光敏電阻

    CC2530授課筆記】⑩ ADC 數(shù)模轉(zhuǎn)換,信號采集,光敏電阻
    發(fā)表于 11-30 09:36 ?26次下載
    【<b class='flag-5'>CC2530</b>授課筆記】⑩ <b class='flag-5'>ADC</b> 數(shù)模轉(zhuǎn)換,信號采集,光敏電阻

    cc2530繼電器模塊使用

    CC2530繼電器模塊是一款基于TI公司的低功耗無線通信芯片CC2530的繼電器應用模塊。它能實現(xiàn)物聯(lián)網(wǎng)設備之間的遠程控制,廣泛應用于家庭自動化、工業(yè)控制、智能農(nóng)業(yè)等領(lǐng)域。本文將詳細介紹CC2530
    的頭像 發(fā)表于 12-21 14:47 ?1200次閱讀