cc2530 adc测外部电压

来源:网络整理 作者:2017年11月07日 18:53
关键词:CC2530adc

  CC2530 是用于2.4-GHz IEEE 802.15.4、ZigBee 和RF4CE 应用的一个真正的片上系统(SoC)解决方案。它能够以非常低的总的材料成本建立强大的网络节点。

  要在zigbee的组网中加入烟雾传感器的模块,所以需要用到cc2530的ADC对传感器输出的模拟信号进行采样。下面是自己对实现用CC2530的ADC采集外部电压的程序过程。

  以下是ADC的配置:

  #include《iocc2530.h》

  #include“adc.h”

  #include“uart.h”

  #include《stdio.h》

  #include“led.h”

  #define VDD_REF 3.3

  float ADCValue = 0.0;//global ,传递电压值

  /**************************************************************

  *funcTIon:ADInit()

  *This funciton is order to iniTIalize ADC of CC2530

  *单次采样,采用端口为P0.6

  **************************************************************/

  void ADInit(void)

  {

  uint ADCREGValue = 0;

  SET_IO_PORT_DIR(0,6,IO_IN);//设置P0..6为输入模式

  ADC_ENABLE_CHANNEL(6); //使能通道6作为ADC的采样通道

  ADC_SINGLE_CONVERSION(ADC_REF_AVDD|ADC_12_BIT| ADC_AIN6); //配置ADC参数,参考电压为AVDD5引脚电压,抽取率为512(12位分辨率)

  ADC_SAMPLE_SINGLE(); //启动单次采样

  while(!(ADCCON1&0x80)) ;//等待AD转换完成

  // while ( !ADCIF );

  /*获取结果,并转换为电压*/

  ADCREGValue = ADCL》》4;//程序中设置的是12bit的精度,取低4位值

  ADCREGValue |= ADCH《《4; //高八位值

  ADCValue = (float)(ADCREGValue/(float)2048)*3.3;//此处有疑问,本来是12bit的精度,除数应该是4096的,但是得用2048才能得到准确的值

  }

  以下是UART0的配置:

  #include《iocc2530.h》

  #include“uart.h”

  void UARTInit(void)

  {

  PERCFG = 0; //配置UART0的IO位置为备用位置1

  P0SEL = 0x3c; //P0.2-PO.5设置为外设功能的端口

  P2DIR &= ~(3《《6);//设置UART0为第一优先级,UART1为第二优先级,

  U0CSR |= (1《《7); //select the mode as UART mode

  U0GCR |= 0x09;

  U0BAUD |= 59; //19200

  UTX0IF = 1; //clear the interrupt flag

  U0CSR |= (1《《6); //enable receive bit

  IEN0 |= 0x84;

  }

  /*********************************************************

  note: “length” is the length of one line

  **********************************************************/

  void UARTSend(char *data,int length)

  {

  int i;

  for(i=0;i《length;i++)

  {

  U0DBUF = *data;

  data++;

  while(UTX0IF==0); // complete receive

  UTX0IF = 0; //clear the flag

  }

  U0DBUF =0x0A; //carriage return

  while(UTX0IF==0); // complete receive

  UTX0IF = 0;

  }

  以下是主函数:

  #include《iocc2530.h》

  #include“adc.h”

  #include“uart.h”

  #include“led.h”

  #include《stdio.h》

  #include 《string.h》

  void delay(uint n);

  void ClockInit(void);

  void main(void)

  {

  char i = 0;

  char TempValue[10];

  float average ;

  char len;

  P1_0 = 0;

  ClockInit();

  UARTInit();

  SET_IO_PORT_DIR(1,0,IO_OUT); //设置LED,作为ADC采样进行的标志

  IO_FUNC_PORT_PIN(1, 0, IO_FUNC_GIO);//INIT_LED();

  IEN0 =IEN1=IEN2 =0;

  while(1)

  {

  average = 0.0;

  for(i=0;i《64;i++)//取64次均值

  {

  ADInit();

  average +=ADCValue;

  }

  average /=64;

  LED();

  sprintf(TempValue,“%fV\r”,(float)average);//将数值格式化为字符串

  len = strlen(TempValue);//字符串的长度

  UARTSend(TempValue,len);//向串口发送数据

  delay(20000);

  }

  }

  /***********************************************************

  初始化时钟参数

  *************************************************************/

  void ClockInit(void)

  {

  CLKCONCMD = 0x28; //时器计数时钟设定为1M Hz, 系统时钟设定为32 MHz

  while(CLKCONSTA & 0x40); //等晶振稳定

  }

  串口显示结果:

  cc2530 adc测外部电压

  一开始的时候,读取出来的AD数值完全不对,最后发现是之前选取板子上的采样端口出现问题,换了P0.6之后,效果就好多了,估计就是由于端口复用的造成的影响。弄好了基本的驱动,后面得开始将程序添加到ZIGBEE的模块中,实现组网。

关注电子发烧友微信

有趣有料的资讯及技术干货

下载发烧友APP

打造属于您的人脉电子圈

关注发烧友课堂

锁定最新课程活动及技术直播
声明:电子发烧友网转载作品均尽可能注明出处,该作品所有人的一切权利均不因本站而转移。
作者如不同意转载,既请通知本站予以删除或改正。转载的作品可能在标题或内容上或许有所改动。
收藏 人收藏
分享:

相关阅读

发表评论

elecfans网友

分享到:

用户评论(0