初步探讨Zigbee之外设ADC

ADC

之前接触Mega16的时候对ADC已经已经有所了解。

ADC支持14位模数转换,包含一个多路转换器,8个可独立配置的通道、一个参考电压发生器。其特点如下:
1、可选的抽取率(采样频率);
2、8个独立输入通道,可接受单端或差分信号;
3、参考电压可选内部单端、外部单端、外部差分或AVDD5;
4、转换结束可触发中断;
5、转换结束可触发DMA;
6、片上温度传感器输入;
7、电池测量功能;


ADC输入:
1、单端输入:AIN7~AIN0分别对应P0_7~P0_0;
2、差分输入: 由AIN0~AIN1、 AIN2~AIN3、 AIN4~AIN5、 AIN6~AIN7组成,以通道号码12~15表示;
3、片上温度传感器输入:由控制器配置;
4、AVDD5/3输入:连接AVDD5/3引脚,通过AIN7检测外部电源电压;

这里主要运用了单端输入。

实际就是将模拟信号转换成数字信号的东东。

其中有序列转换和单次转换

ADC控制寄存器ADCCON1:


初步探讨Zigbee之外设ADC_第1张图片

判断ADC是否转换结束开启ADC转换…


ADC控制寄存器ADCCON2:

控制序列转换的


初步探讨Zigbee之外设ADC_第2张图片


ADC控制寄存器ADCCON3:

控制单次转换的


初步探讨Zigbee之外设ADC_第3张图片

单次转换只用到ADCCON3,与ADDCON2和ADDCON1无关
写入就启动了。


数据的保存


初步探讨Zigbee之外设ADC_第4张图片

共14位,ADCL的低两位需要注意:


#include 
#include 
#include "uart.h"
int counter=0;
#define uint unsigned int 
#define uchar unsigned char 

#define LIGHT P0_5    //定义P0_5口为光敏入端
#define LED1 P1_0    //定义P1_0口为LED1控制端
#define LED2 P1_1    //定义P1_1口为LED2控制端

/**************************************************
 函 数 名  : IO_Init
 功能描述  : LED_IO初始化函数
 输入参数  : NONE  
 输出参数  : NONE
 返 回 值  : NONE
***************************************************/
#pragma vector = T3_VECTOR     
 __interrupt void T3_ISR(void)
 {      
         //消中断标志,可不清中断标志,硬件自动完成
    IRCON = 0x00;
        //200次中断LED闪烁一轮
        if(counter<2300)    //460 1s
         counter++;
        else
        {
           ADCCON3 = 0xb5;  //启动AD
           counter=0;        
        }

 }
 /**************************************************
 函 数 名  : timer3init
 功能描述  : TIMER3初始化函数
 输入参数  : NONE  
 输出参数  : NONE
 返 回 值  : NONE
***************************************************/
void timer3init()
{ 
   P1SEL|=0x08;    
   PERCFG&=~(1<<5);  //备用位置1
   P2SEL|=(1<<5);   //定时器3优先

 //  T3CCTL0=~(1<<2);


   T3CTL |= 0xE0;         //标记频率/128
   T3CTL |= 0x04;         //清除计数器
   T3CTL |= 0x10;         //启动定时器T3

  // T3CCTL1 |= 0x40;     //T2的通道1中断使
   T3CTL |= 0x08;         //溢出中断使
   IEN1 |= 0x08;            //T3中断使能
   IEN0 |= 0x80;      //使能所有中断 

}
void IO_Init(void)
{
    P1DIR |= 0x03;       //P1端口定义为输出
    LED1 = 0;            //点亮LED1
    LED2 = 0;            //点亮LED2
}
/**************************************************
 函 数 名  : ADC_Init
 功能描述  : ADC初始化函数
 输入参数  : NONE  
 输出参数  : NONE
 返 回 值  : NONE
***************************************************/
void ADC_Init(void)
{
    ADCH = 0x00;
    ADCL = 0x00;        //清空ADC数据寄存器
    APCFG |= 0x20;      //P0_5端口模拟IO使能
}


/**************************************************
 函 数 名  : Delayms
 功能描述  : 毫秒延时
 输入参数  : xms:延时时间,如 i=xms 即延时i毫秒
 输出参数  : none
 返 回 值  : none
***************************************************/
void Delayms(uint xms)
{
    uint i,j;
    for(i=xms;i>0;i--)
      for(j=587;j>0;j--);
}


/**************************************************
 函 数 名  : main
 功能描述  : LED测试(通用IO的输出使用)
 输入参数  : NONE  
 输出参数  : NONE 
 返 回 值  : NONE
***************************************************/
void main ( void )
{
  uint adc=0;

  float num=0;
  char data[2];
  IO_Init ();       //调用初始化程序
  ADC_Init();
  uartinit();
  clockinit();
  timer3init();  
  Delayms ( 2000 );   //延时2s

  while ( 1 )
  {
    LED1 = ~ LED1;
    LED2 = ~ LED2;  

    if(ADCCON1 & 0x80)  //等待转化完成
    {
      adc = ADCH << 6;      //读取、合并数据
      ADCL=ADCL>>2;
      adc |= ADCL;

      if(adc & 0x8000)  //度数不能为负,等同 adc<0
      {
        adc=0;
      }  
      else
      {
        adc = adc >> 4;  //12位有效数字
        num = adc * 3.3 / 4096;//换算成电压; 
        num=num*10; 
        sprintf(data,"%d",num);

      }        
    } 
    myprintf(data);

  }


}

END

你可能感兴趣的:(CC2530)