一、ADC功能介紹
ADC功能是將模擬量轉為數字量的數模轉換器;平時測量的溫度、光照強度、煙霧濃度、酒精濃度這些數據都是屬于模擬量,需要使用相關的線性變化傳感器進行檢測,然后通過ADC采樣轉為數字量,得到最終的一組數據。
ADC這個功能在很多低配單片機上是不自帶的,CC2530是帶了ADC采集功能,做一些模擬轉換的應用就很方便,不需要再去額外的掛載其他外設ADC芯片。
二、配置ADC相關寄存器
要使用ADC功能,需要配置APCFG寄存器,下面截圖來至官方的數據手冊,將寄存器對應位配置為1即可開啟模擬IO功能。
三、示例代碼
3.1 配置ADC采集內部溫度示例代碼
/******************************************************************************
CC2530模塊AD測試程序
通過內置溫度傳感器實現溫度采集
******************************************************************************/
#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)
/**************************
系統時鐘 不分頻
計數時鐘 32分頻
**************************/
void InitClock(void)
{
CLKCONCMD = 0x28; //時器計數時鐘設定為1M Hz, 系統時鐘設定為32 MHz
while(CLKCONSTA & 0x40); //等晶振穩定
}
/*****************************************
串口初始化函數:初始化串口 UART0
*****************************************/
void InitUART0(void)
{
PERCFG = 0x00; //位置1 P0口
P0SEL = 0x3c; //P0用作串口
P2DIR &= ~0XC0; //P0優先作為UART0
U0CSR |= 0x80; //串口設置為UART方式
U0GCR |= 9;
U0BAUD |= 59; //波特率設為19200
UTX0IF = 1; //UART0 TX中斷標志初始置位1
U0CSR |= 0X40; //允許接收
IEN0 |= 0x84; //開總中斷,接收中斷
}
/****************************************************************
串口發送字符串函數
****************************************************************/
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); //根據AD值,計算出實際的溫度
}
/****************************************************************
主函數
****************************************************************/
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);
}
}
復制代碼;j++)>
3.2 配置ADC通道0采集模擬數據
#include "ioCC2530.h"
/*===============定時器1初始化函數==================*/
void Init_Timer1()
{
T1CC0L = 0xd4; //設置最大計數值的低8位
T1CC0H = 0x30; //設置最大計數值的高8位
T1CCTL0 |= 0x04; //開啟通道0的輸出比較模式
T1IE = 1; //使能定時器1中斷
T1OVFIM = 1; //使能定時器1溢出中斷
EA = 1; //使能總中斷
T1CTL = 0x0e; //分頻系數是128,模模式
}
unsigned char count = 0;
unsigned char F_time = 0;
/*================定時器1服務函數====================*/
#pragma vector = T1_VECTOR
__interrupt void Timer1_Sevice()
{
T1STAT &= ~0x01; //清除定時器1通道0中斷標志
count++;
if(count == 10) //定時1秒到
{
F_time = 1;
count = 0;
}
}
/*===================UR0初始化函數====================*/
void Init_Uart0()
{
PERCFG = 0x00; //串口0的引腳映射到位置1,即P0_2和P0_3
P0SEL = 0x0C; //將P0_2和P0_3端口設置成外設功能
U0BAUD = 59; //16MHz的系統時鐘產生9600BPS的波特率
U0GCR = 9;
U0UCR |= 0x80; //禁止流控,8位數據,清除緩沖器
U0CSR |= 0xC0; //選擇UART模式,使能接收器
UTX0IF = 0; //清除TX發送中斷標志
URX0IF = 0; //清除RX接收中斷標志
URX0IE = 1; //使能URAT0的接收中斷
EA = 1; //使能總中斷
}
unsigned char dat[4];
/*===================UR0發送字符串函數==================*/
void UR0SendString(unsigned char *str, unsigned char count)
{
while(count--)
{
U0DBUF = *str++; //將要發送的1字節數據寫入U0DBUF
while(!UTX0IF); //等待TX中斷標志,即數據發送完成
UTX0IF = 0;
}
}
/*===================ADC初始化函數====================*/
void Init_ADC0()
{
P0SEL |= 0x01; //P0_0端口設置為外設功能
P0DIR &= ~0x01; //P0_0端口設置為輸入端口
APCFG |= 0x01; //P0_0作為模擬I/O使用
}
/*===================讀取ADC的數據====================*/
void Get_ADC0_Value()
{
ADCIF = 0;
//參考電壓選擇AVDD5引腳,256抽取率,AIN0通道0
ADCCON3 = (0x80 | 0x10 | 0x00);
while(!ADCIF); //等待A/D轉換完成,
dat[0] = 0xaf;
dat[1] = ADCH; //讀取ADC數據低位寄存器
dat[2] = ADCL; //讀取ADC數據高位寄存器
dat[3] = 0xfa;
}
/*=======================主函數======================*/
void main()
{
Init_Uart0();
Init_Timer1();
Init_ADC0();
while(1)
{
if(F_time == 1) //定時1秒時間到
{
Get_ADC0_Value(); //進行A/D轉換并讀取數據
UR0SendString(dat,4); //向上位機發送數據
F_time = 0; //定時1秒標志清0
}
}
}
審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
寄存器
+關注
關注
31文章
5363瀏覽量
121194 -
adc
+關注
關注
99文章
6534瀏覽量
545770 -
CC2530
+關注
關注
19文章
221瀏覽量
58234
發布評論請先 登錄
相關推薦
cc2530 adc測外部電壓
CC2530 是用于2.4-GHz IEEE 802.15.4、ZigBee 和RF4CE 應用的一個真正的片上系統(SoC)解決方案。它能夠以非常低的總的材料成本建立強大的網絡節點。要在zigbee的組網中加入煙霧傳感器的模塊
發表于 11-07 18:53
?5695次閱讀
基于CC2530的ZigBee協調器節點設計
本文給出了基于TI新一代芯片CC2530的ZigBee協調器節點設計方法,該方法選用TICC2591作為射頻前端芯片。
發表于 01-05 15:25
?4.9w次閱讀
CC2530芯片的基本特性和CC2530無線模塊的設計
本文介紹了CC2530芯片的基本特性,論述了以CC2530芯片為核心的無線通信模塊的硬件設計和調試軟件設計,在介紹設計規范和模塊結構的基礎上,采用TI公司的CC2530芯片作為主控制芯片設計出具
發表于 02-11 08:00
?97次下載
如何使用ZigBee TI ZStack CC2530 2.5搭建開發環境
本文檔的主要內容詳細介紹的是如何使用ZigBee TI ZStack CC2530 2.5搭建開發環境。
發表于 05-10 18:14
?26次下載
微雪電子ZIGBEE開發板 CC2530 Eval Kit簡介
ZigBee CC2530 串口透傳 開發套件 物聯網套件 板載電池插槽 支持多種供電方式 引出所有IO 方便用戶功能擴展 板載一個CP2102 方便調試下載 型號 CC2530 Ev
微雪電子ZIGBEE開發板 CC2530 Eval Kit5簡介
ZigBee CC2530 串口透傳 開發套件 XBEE 物聯網套件 直插接口兼容Xbee 支持自動組網 支持板載PCB天線及IPEX外接天線 型號 CC2530 Eval Kit5
CC2530 Zigbee射頻模塊開發板的電路原理圖免費下載
本文檔的主要內容詳細介紹的是CC2530 Zigbee射頻模塊開發板的電路原理圖免費下載。
發表于 09-07 08:00
?160次下載
CC2530(zigbee)入門開發: 安裝IAR開發環境
CC2530本身是一個51單片機內核,開發過51的搞起來非常容易,也就是多了一個無線射頻部分;如果不使用無線射頻功能,那么就和一個正常的51單片機一樣。要進行CC2530的軟件開發,需
評論