一、ADC功能介紹
ADC功能是將模擬量轉(zhuǎn)為數(shù)字量的數(shù)模轉(zhuǎn)換器;平時(shí)測(cè)量的溫度、光照強(qiáng)度、煙霧濃度、酒精濃度這些數(shù)據(jù)都是屬于模擬量,需要使用相關(guān)的線性變化傳感器進(jìn)行檢測(cè),然后通過ADC采樣轉(zhuǎn)為數(shù)字量,得到最終的一組數(shù)據(jù)。
ADC這個(gè)功能在很多低配單片機(jī)上是不自帶的,CC2530是帶了ADC采集功能,做一些模擬轉(zhuǎn)換的應(yīng)用就很方便,不需要再去額外的掛載其他外設(shè)ADC芯片。
二、配置ADC相關(guān)寄存器
要使用ADC功能,需要配置APCFG寄存器,下面截圖來至官方的數(shù)據(jù)手冊(cè),將寄存器對(duì)應(yīng)位配置為1即可開啟模擬IO功能。
三、示例代碼
3.1 配置ADC采集內(nèi)部溫度示例代碼
/******************************************************************************
CC2530模塊AD測(cè)試程序
通過內(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
}
}
}
審核編輯:湯梓紅
-
寄存器
+關(guān)注
關(guān)注
31文章
5336瀏覽量
120231 -
adc
+關(guān)注
關(guān)注
98文章
6495瀏覽量
544467 -
CC2530
+關(guān)注
關(guān)注
19文章
221瀏覽量
58001
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論