0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

CC2530(zigbee)入门开发: ADC应用

DS小龙哥-嵌入式技术 来源:DS小龙哥-嵌入式技术 作者:DS小龙哥-嵌入式技 2022-05-28 13:30 次阅读

一、ADC功能介绍

ADC功能是将模拟量转为数字量的数模转换器;平时测量的温度、光照强度、烟雾浓度、酒精浓度这些数据都是属于模拟量,需要使用相关的线性变化传感器进行检测,然后通过ADC采样转为数字量,得到最终的一组数据。

ADC这个功能在很多低配单片机上是不自带的,CC2530是带了ADC采集功能,做一些模拟转换的应用就很方便,不需要再去额外的挂载其他外设ADC芯片

二、配置ADC相关寄存器

要使用ADC功能,需要配置APCFG寄存器,下面截图来至官方的数据手册,将寄存器对应位配置为1即可开启模拟IO功能。

image.pngimage.pngimage.png

三、示例代码

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
    adc
    +关注

    关注

    98

    文章

    6495

    浏览量

    544447
  • CC2530
    +关注

    关注

    19

    文章

    221

    浏览量

    57999
收藏 人收藏

    评论

    相关推荐

    zigbeecc2530

    `晒晒我的zigbeecc2530)模块`
    发表于 03-20 13:58

    CC2530 Zigbee开发——开发工作室教程

    `CC2530 Zigbee开发——开发工作室教程`
    发表于 03-08 10:33

    【技术精选】嵌入式STM32原创征文活动精选文章

    CC2530(zigbee)入门开发: 看门狗C2530(zigbee)入门开发: 低功耗模式
    发表于 07-27 18:26

    基于CC2530芯片_zigbee基础实验

    zigbee基础实验,基于CC2530芯片
    发表于 12-11 10:48 49次下载

    cc2530 adc测外部电压

    CC2530 是用于2.4-GHz IEEE 802.15.4、ZigBee 和RF4CE 应用的一个真正的片上系统(SoC)解决方案。它能够以非常低的总的材料成本建立强大的网络节点。要在zigbee的组网中加入烟雾传感器的模块
    发表于 11-07 18:53 5640次阅读
    <b class='flag-5'>cc2530</b> <b class='flag-5'>adc</b>测外部电压

    基于CC2530ZigBee协调器节点设计

    本文给出了基于TI新一代芯片CC2530ZigBee协调器节点设计方法,该方法选用TICC2591作为射频前端芯片。
    发表于 01-05 15:25 4.9w次阅读
    基于<b class='flag-5'>CC2530</b>的<b class='flag-5'>ZigBee</b>协调器节点设计

    CC2530芯片的基本特性和CC2530无线模块的设计

    本文介绍了CC2530芯片的基本特性,论述了以CC2530芯片为核心的无线通信模块的硬件设计和调试软件设计,在介绍设计规范和模块结构的基础上,采用TI公司的CC2530芯片作为主控制芯片设计出具
    发表于 02-11 08:00 97次下载
    <b class='flag-5'>CC2530</b>芯片的基本特性和<b class='flag-5'>CC2530</b>无线模块的设计

    如何使用ZigBee TI ZStack CC2530 2.5搭建开发环境

    本文档的主要内容详细介绍的是如何使用ZigBee TI ZStack CC2530 2.5搭建开发环境。
    发表于 05-10 18:14 26次下载
    如何使用<b class='flag-5'>ZigBee</b> TI ZStack <b class='flag-5'>CC2530</b> 2.5搭建<b class='flag-5'>开发</b>环境

    微雪电子ZIGBEE开发CC2530 Eval Kit简介

    ZigBee CC2530 串口透传 开发套件 物联网套件 板载电池插槽 支持多种供电方式 引出所有IO 方便用户功能扩展 板载一个CP2102 方便调试下载 型号 CC2530 Ev
    的头像 发表于 01-09 11:05 2079次阅读
    微雪电子<b class='flag-5'>ZIGBEE</b><b class='flag-5'>开发</b>板 <b class='flag-5'>CC2530</b> Eval Kit简介

    微雪电子ZIGBEE开发CC2530 Eval Kit5简介

    ZigBee CC2530 串口透传 开发套件 XBEE 物联网套件 直插接口兼容Xbee 支持自动组网 支持板载PCB天线及IPEX外接天线 型号 CC2530 Eval Kit5
    的头像 发表于 01-10 09:01 2064次阅读
    微雪电子<b class='flag-5'>ZIGBEE</b><b class='flag-5'>开发</b>板 <b class='flag-5'>CC2530</b> Eval Kit5简介

    CC2530 Zigbee射频模块开发板的电路原理图免费下载

    本文档的主要内容详细介绍的是CC2530 Zigbee射频模块开发板的电路原理图免费下载。
    发表于 09-07 08:00 158次下载
    <b class='flag-5'>CC2530</b> <b class='flag-5'>Zigbee</b>射频模块<b class='flag-5'>开发</b>板的电路原理图免费下载

    基于CC2530ZigBee通信网的应用设计.pdf

    基于CC2530ZigBee通信网的应用设计.pdf
    发表于 12-15 18:17 23次下载

    CC2530(zigbee)入门开发: 安装IAR开发环境

    CC2530本身是一个51单片机内核,开发过51的搞起来非常容易,也就是多了一个无线射频部分;如果不使用无线射频功能,那么就和一个正常的51单片机一样。要进行CC2530的软件开发,需
    的头像 发表于 05-28 13:38 1.2w次阅读
    <b class='flag-5'>CC2530</b>(<b class='flag-5'>zigbee</b>)<b class='flag-5'>入门开发</b>: 安装IAR<b class='flag-5'>开发</b>环境

    Zigbee(CC2530)传感器板

    电子发烧友网站提供《Zigbee(CC2530)传感器板.zip》资料免费下载
    发表于 07-04 14:49 10次下载
    <b class='flag-5'>Zigbee</b>(<b class='flag-5'>CC2530</b>)传感器板

    基于CC2530ZigBee通信网络的应用设计

    电子发烧友网站提供《基于CC2530ZigBee通信网络的应用设计.pdf》资料免费下载
    发表于 10-26 09:34 3次下载
    基于<b class='flag-5'>CC2530</b>的<b class='flag-5'>ZigBee</b>通信网络的应用设计