一、ADC功能介紹
ADC功能是將模擬量轉(zhuǎn)為數(shù)字量的數(shù)模轉(zhuǎn)換器;平時(shí)測量的溫度、光照強(qiáng)度、煙霧濃度、酒精濃度這些數(shù)據(jù)都是屬于模擬量,需要使用相關(guān)的線性變化傳感器進(jìn)行檢測,然后通過ADC采樣轉(zhuǎn)為數(shù)字量,得到最終的一組數(shù)據(jù)。
ADC這個(gè)功能在很多低配單片機(jī)上是不自帶的,CC2530是帶了ADC采集功能,做一些模擬轉(zhuǎn)換的應(yīng)用就很方便,不需要再去額外的掛載其他外設(shè)ADC芯片。
二、配置ADC相關(guān)寄存器
要使用ADC功能,需要配置APCFG寄存器,下面截圖來至官方的數(shù)據(jù)手冊,將寄存器對應(yīng)位配置為1即可開啟模擬IO功能。
三、示例代碼
3.1 配置ADC采集內(nèi)部溫度示例代碼
/******************************************************************************
CC2530模塊AD測試程序
通過內(nèi)置溫度傳感器實(shí)現(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í)鐘 不分頻
計(jì)數(shù)時(shí)鐘 32分頻
**************************/
void InitClock(void)
{
CLKCONCMD = 0x28; //時(shí)器計(jì)數(shù)時(shí)鐘設(shè)定為1M Hz, 系統(tǒng)時(shí)鐘設(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值,計(jì)算出實(shí)際的溫度
}
/****************************************************************
主函數(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"
/*===============定時(shí)器1初始化函數(shù)==================*/
void Init_Timer1()
{
T1CC0L = 0xd4; //設(shè)置最大計(jì)數(shù)值的低8位
T1CC0H = 0x30; //設(shè)置最大計(jì)數(shù)值的高8位
T1CCTL0 |= 0x04; //開啟通道0的輸出比較模式
T1IE = 1; //使能定時(shí)器1中斷
T1OVFIM = 1; //使能定時(shí)器1溢出中斷
EA = 1; //使能總中斷
T1CTL = 0x0e; //分頻系數(shù)是128,模模式
}
unsigned char count = 0;
unsigned char F_time = 0;
/*================定時(shí)器1服務(wù)函數(shù)====================*/
#pragma vector = T1_VECTOR
__interrupt void Timer1_Sevice()
{
T1STAT &= ~0x01; //清除定時(shí)器1通道0中斷標(biāo)志
count++;
if(count == 10) //定時(shí)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)時(shí)鐘產(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ù)寫入U(xiǎn)0DBUF
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) //定時(shí)1秒時(shí)間到
{
Get_ADC0_Value(); //進(jìn)行A/D轉(zhuǎn)換并讀取數(shù)據(jù)
UR0SendString(dat,4); //向上位機(jī)發(fā)送數(shù)據(jù)
F_time = 0; //定時(shí)1秒標(biāo)志清0
}
}
}
審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。
舉報(bào)投訴
-
寄存器
+關(guān)注
關(guān)注
31文章
5609瀏覽量
130017 -
adc
+關(guān)注
關(guān)注
100文章
7513瀏覽量
556089 -
CC2530
+關(guān)注
關(guān)注
19文章
222瀏覽量
60146
發(fā)布評論請先 登錄
相關(guān)推薦
熱點(diǎn)推薦
【技術(shù)精選】嵌入式STM32原創(chuàng)征文活動精選文章
CC2530(zigbee)入門開發(fā): 看門狗C2530(zigbee)入門開發(fā): 低功耗模式
發(fā)表于 07-27 18:26
基于CC2530芯片_zigbee基礎(chǔ)實(shí)驗(yàn)
zigbee基礎(chǔ)實(shí)驗(yàn),基于CC2530芯片
發(fā)表于 12-11 10:48
?50次下載
cc2530 adc測外部電壓
CC2530 是用于2.4-GHz IEEE 802.15.4、ZigBee 和RF4CE 應(yīng)用的一個(gè)真正的片上系統(tǒng)(SoC)解決方案。它能夠以非常低的總的材料成本建立強(qiáng)大的網(wǎng)絡(luò)節(jié)點(diǎn)。要在zigbee的組網(wǎng)中加入煙霧傳感器的模塊
發(fā)表于 11-07 18:53
?6176次閱讀
基于CC2530的ZigBee協(xié)調(diào)器節(jié)點(diǎn)設(shè)計(jì)
本文給出了基于TI新一代芯片CC2530的ZigBee協(xié)調(diào)器節(jié)點(diǎn)設(shè)計(jì)方法,該方法選用TICC2591作為射頻前端芯片。
發(fā)表于 01-05 15:25
?5w次閱讀
CC2530芯片的基本特性和CC2530無線模塊的設(shè)計(jì)
本文介紹了CC2530芯片的基本特性,論述了以CC2530芯片為核心的無線通信模塊的硬件設(shè)計(jì)和調(diào)試軟件設(shè)計(jì),在介紹設(shè)計(jì)規(guī)范和模塊結(jié)構(gòu)的基礎(chǔ)上,采用TI公司的CC2530芯片作為主控制芯片設(shè)計(jì)出具
發(fā)表于 02-11 08:00
?101次下載
如何使用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
?31次下載
微雪電子ZIGBEE開發(fā)板 CC2530 Eval Kit簡介
ZigBee CC2530 串口透傳 開發(fā)套件 物聯(lián)網(wǎng)套件 板載電池插槽 支持多種供電方式 引出所有IO 方便用戶功能擴(kuò)展 板載一個(gè)CP2102 方便調(diào)試下載 型號 CC2530 Ev
微雪電子ZIGBEE開發(fā)板 CC2530 Eval Kit5簡介
ZigBee CC2530 串口透傳 開發(fā)套件 XBEE 物聯(lián)網(wǎng)套件 直插接口兼容Xbee 支持自動組網(wǎng) 支持板載PCB天線及IPEX外接天線 型號 CC2530 Eval Kit5
CC2530 Zigbee射頻模塊開發(fā)板的電路原理圖免費(fèi)下載
本文檔的主要內(nèi)容詳細(xì)介紹的是CC2530 Zigbee射頻模塊開發(fā)板的電路原理圖免費(fèi)下載。
發(fā)表于 09-07 08:00
?181次下載
基于CC2530的ZigBee通信網(wǎng)的應(yīng)用設(shè)計(jì).pdf
基于CC2530的ZigBee通信網(wǎng)的應(yīng)用設(shè)計(jì).pdf
發(fā)表于 12-15 18:17
?24次下載
CC2530(zigbee)入門開發(fā): 安裝IAR開發(fā)環(huán)境
CC2530本身是一個(gè)51單片機(jī)內(nèi)核,開發(fā)過51的搞起來非常容易,也就是多了一個(gè)無線射頻部分;如果不使用無線射頻功能,那么就和一個(gè)正常的51單片機(jī)一樣。要進(jìn)行CC2530的軟件開發(fā),需
Zigbee(CC2530)傳感器板
電子發(fā)燒友網(wǎng)站提供《Zigbee(CC2530)傳感器板.zip》資料免費(fèi)下載
發(fā)表于 07-04 14:49
?11次下載
基于CC2530的ZigBee通信網(wǎng)絡(luò)的應(yīng)用設(shè)計(jì)
電子發(fā)燒友網(wǎng)站提供《基于CC2530的ZigBee通信網(wǎng)絡(luò)的應(yīng)用設(shè)計(jì).pdf》資料免費(fèi)下載
發(fā)表于 10-26 09:34
?6次下載
CC2530(zigbee)入門開發(fā): ADC應(yīng)用
評論