初步探讨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
文章图片

判断ADC是否转换结束开启ADC转换…
ADC控制寄存器ADCCON2:
控制序列转换的
初步探讨Zigbee之外设ADC
文章图片

ADC控制寄存器ADCCON3:
控制单次转换的
初步探讨Zigbee之外设ADC
文章图片

单次转换只用到ADCCON3,与ADDCON2和ADDCON1无关
写入就启动了。
数据的保存
初步探讨Zigbee之外设ADC
文章图片

共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 ); //延时2swhile ( 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); }}

【初步探讨Zigbee之外设ADC】END

    推荐阅读