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

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

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

CC2530(zigbee)入門開發(fā): ADC應(yīng)用

DS小龍哥-嵌入式技術(shù) ? 來源:DS小龍哥-嵌入式技術(shù) ? 作者:DS小龍哥-嵌入式技 ? 2022-05-28 13:30 ? 次閱讀

一、ADC功能介紹

ADC功能是將模擬量轉(zhuǎn)為數(shù)字量的數(shù)模轉(zhuǎn)換器;平時測量的溫度、光照強(qiáng)度、煙霧濃度、酒精濃度這些數(shù)據(jù)都是屬于模擬量,需要使用相關(guān)的線性變化傳感器進(jìn)行檢測,然后通過ADC采樣轉(zhuǎn)為數(shù)字量,得到最終的一組數(shù)據(jù)。

ADC這個功能在很多低配單片機(jī)上是不自帶的,CC2530是帶了ADC采集功能,做一些模擬轉(zhuǎn)換的應(yīng)用就很方便,不需要再去額外的掛載其他外設(shè)ADC芯片。

二、配置ADC相關(guān)寄存器

要使用ADC功能,需要配置APCFG寄存器,下面截圖來至官方的數(shù)據(jù)手冊,將寄存器對應(yīng)位配置為1即可開啟模擬IO功能。

image.pngimage.pngimage.png

三、示例代碼

3.1 配置ADC采集內(nèi)部溫度示例代碼

/******************************************************************************
CC2530模塊AD測試程序
通過內(nèi)置溫度傳感器實現(xiàn)溫度采集
******************************************************************************/
#include 
#include 

#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ù)時鐘設(shè)定為1M Hz,  系統(tǒng)時鐘設(shè)定為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;   	                  //串口設(shè)置為UART方式
    U0GCR |= 9;				
    U0BAUD |= 59;		                  //波特率設(shè)為19200

    UTX0IF = 1;                               //UART0 TX中斷標(biāo)志初始置位1  
    U0CSR |= 0X40;				  //允許接收
    IEN0 |= 0x84;				  //開總中斷,接收中斷
}

/****************************************************************
   串口發(fā)送字符串函數(shù)						
****************************************************************/
void UartTX_Send_String(char *Data,int len)
{
  int j;
  for(j=0;j> 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);
      }
}
復(fù)制代碼;j++)>

3.2 配置ADC通道0采集模擬數(shù)據(jù)

#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中斷標(biāo)志
  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ā)送中斷標(biāo)志
  URX0IF = 0;       //清除RX接收中斷標(biāo)志
  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中斷標(biāo)志,即數(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();       //進(jìn)行A/D轉(zhuǎn)換并讀取數(shù)據(jù)
      UR0SendString(dat,4);   //向上位機(jī)發(fā)送數(shù)據(jù)
      F_time = 0;             //定時1秒標(biāo)志清0
    }
  }
}

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5271

    瀏覽量

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

    關(guān)注

    97

    文章

    6347

    瀏覽量

    543374
  • CC2530
    +關(guān)注

    關(guān)注

    19

    文章

    221

    瀏覽量

    57653
收藏 人收藏

    評論

    相關(guān)推薦

    zigbeecc2530

    `曬曬我的zigbeecc2530)模塊`
    發(fā)表于 03-20 13:58

    CC2530 Zigbee開發(fā)——開發(fā)工作室教程

    `CC2530 Zigbee開發(fā)——開發(fā)工作室教程`
    發(fā)表于 03-08 10:33

    【技術(shù)精選】嵌入式STM32原創(chuàng)征文活動精選文章

    CC2530(zigbee)入門開發(fā): 看門狗C2530(zigbee)入門開發(fā): 低功耗模式
    發(fā)表于 07-27 18:26

    基于CC2530芯片_zigbee基礎(chǔ)實驗

    zigbee基礎(chǔ)實驗,基于CC2530芯片
    發(fā)表于 12-11 10:48 ?48次下載

    cc2530 adc測外部電壓

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

    基于CC2530ZigBee協(xié)調(diào)器節(jié)點設(shè)計

    本文給出了基于TI新一代芯片CC2530ZigBee協(xié)調(diào)器節(jié)點設(shè)計方法,該方法選用TICC2591作為射頻前端芯片。
    發(fā)表于 01-05 15:25 ?4.9w次閱讀
    基于<b class='flag-5'>CC2530</b>的<b class='flag-5'>ZigBee</b>協(xié)調(diào)器節(jié)點設(shè)計

    CC2530芯片的基本特性和CC2530無線模塊的設(shè)計

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

    如何使用ZigBee TI ZStack CC2530 2.5搭建開發(fā)環(huán)境

    本文檔的主要內(nèi)容詳細(xì)介紹的是如何使用ZigBee TI ZStack CC2530 2.5搭建開發(fā)環(huán)境。
    發(fā)表于 05-10 18:14 ?25次下載
    如何使用<b class='flag-5'>ZigBee</b> TI ZStack <b class='flag-5'>CC2530</b> 2.5搭建<b class='flag-5'>開發(fā)</b>環(huán)境

    微雪電子ZIGBEE開發(fā)CC2530 Eval Kit簡介

    ZigBee CC2530 串口透傳 開發(fā)套件 物聯(lián)網(wǎng)套件 板載電池插槽 支持多種供電方式 引出所有IO 方便用戶功能擴(kuò)展 板載一個CP2102 方便調(diào)試下載 型號 CC2530 Ev
    的頭像 發(fā)表于 01-09 11:05 ?1992次閱讀
    微雪電子<b class='flag-5'>ZIGBEE</b><b class='flag-5'>開發(fā)</b>板 <b class='flag-5'>CC2530</b> Eval Kit簡介

    微雪電子ZIGBEE開發(fā)CC2530 Eval Kit5簡介

    ZigBee CC2530 串口透傳 開發(fā)套件 XBEE 物聯(lián)網(wǎng)套件 直插接口兼容Xbee 支持自動組網(wǎng) 支持板載PCB天線及IPEX外接天線 型號 CC2530 Eval Kit5
    的頭像 發(fā)表于 01-10 09:01 ?2000次閱讀
    微雪電子<b class='flag-5'>ZIGBEE</b><b class='flag-5'>開發(fā)</b>板 <b class='flag-5'>CC2530</b> Eval Kit5簡介

    CC2530 Zigbee射頻模塊開發(fā)板的電路原理圖免費下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是CC2530 Zigbee射頻模塊開發(fā)板的電路原理圖免費下載。
    發(fā)表于 09-07 08:00 ?157次下載
    <b class='flag-5'>CC2530</b> <b class='flag-5'>Zigbee</b>射頻模塊<b class='flag-5'>開發(fā)</b>板的電路原理圖免費下載

    基于CC2530ZigBee通信網(wǎng)的應(yīng)用設(shè)計.pdf

    基于CC2530ZigBee通信網(wǎng)的應(yīng)用設(shè)計.pdf
    發(fā)表于 12-15 18:17 ?23次下載

    CC2530(zigbee)入門開發(fā): 安裝IAR開發(fā)環(huán)境

    CC2530本身是一個51單片機(jī)內(nèi)核,開發(fā)過51的搞起來非常容易,也就是多了一個無線射頻部分;如果不使用無線射頻功能,那么就和一個正常的51單片機(jī)一樣。要進(jìn)行CC2530的軟件開發(fā),需
    的頭像 發(fā)表于 05-28 13:38 ?1.1w次閱讀
    <b class='flag-5'>CC2530</b>(<b class='flag-5'>zigbee</b>)<b class='flag-5'>入門開發(fā)</b>: 安裝IAR<b class='flag-5'>開發(fā)</b>環(huán)境

    Zigbee(CC2530)傳感器板

    電子發(fā)燒友網(wǎng)站提供《Zigbee(CC2530)傳感器板.zip》資料免費下載
    發(fā)表于 07-04 14:49 ?10次下載
    <b class='flag-5'>Zigbee</b>(<b class='flag-5'>CC2530</b>)傳感器板

    基于CC2530ZigBee通信網(wǎng)絡(luò)的應(yīng)用設(shè)計

    電子發(fā)燒友網(wǎng)站提供《基于CC2530ZigBee通信網(wǎng)絡(luò)的應(yīng)用設(shè)計.pdf》資料免費下載
    發(fā)表于 10-26 09:34 ?3次下載
    基于<b class='flag-5'>CC2530</b>的<b class='flag-5'>ZigBee</b>通信網(wǎng)絡(luò)的應(yīng)用設(shè)計