一、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文章
5336浏览量
120224 -
adc
+关注
关注
98文章
6495浏览量
544447 -
CC2530
+关注
关注
19文章
221浏览量
57999
发布评论请先 登录
相关推荐
cc2530 adc测外部电压
CC2530 是用于2.4-GHz IEEE 802.15.4、ZigBee 和RF4CE 应用的一个真正的片上系统(SoC)解决方案。它能够以非常低的总的材料成本建立强大的网络节点。要在zigbee的组网中加入烟雾传感器的模块
发表于 11-07 18:53
•5640次阅读
基于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
•158次下载
CC2530(zigbee)入门开发: 安装IAR开发环境
CC2530本身是一个51单片机内核,开发过51的搞起来非常容易,也就是多了一个无线射频部分;如果不使用无线射频功能,那么就和一个正常的51单片机一样。要进行CC2530的软件开发,需
评论