嵌入式成长轨迹47 【Zigbee项目】【CC2430基础实验】【1/3AVDD】
将AD的源设为1/3 电源电压,并将转换得到温度通过串口送至电脑
ADCCON1
7 EOC 0 R H0 ADC 结束标志位
0 ADC进行中
1 ADC 转换结束
6 ST 0 R W1 手动启动AD转换(读1 表示当前正在进行AD转换)
0 没有转换
1 启动 AD 转换
(STSEL=11)
5:4 STSEL[1:0] 11 R/W AD 转换启动方式选择
00 外部触发
01 全速转换,不需要触发
10 T1 通道 0 比较触发
11 手工触发
3:2 RCTRL[1:0] 00 R/W 16 位随机数发生器控制位
(写01,10会在执行后返回00)
00 普通模式(13x 打开)
01 开启LFSR 时钟一次
10 生成调节器种子
11 信用随机数发生器
1:0 - 11 R/W 保留,总是写设置为1
ADCCON3
7:6 SREF[1:0] 00 读/ 写
选择单次AD 转换参考电压
00 内部1.25V 电压
01 外部参考电压 AIN7输入
10 模拟电源电压
11 外部参考电压
AIN6-AIN7 输入
5:4 SDIV[1:0] 01 读/ 写
选择单次A/D 转换分辨率
00 8 位 (64dec)
01 10 位 (128dec)
10 12 位 (256dec)
11 14 位 (512dec)
3:0 SCH[3:0] 00 读/ 写
单次A/D 转换选择,如果写入时ADC正在运行,则在完成序列A/D 转换后立刻开始,否则写入后立即开始A/D 转换,转换完成后自动清0
0000 AIN0
0001 AIN1
0010 AIN2
0011 AIN3
0100 AIN4
0101 AIN5
0110 AIN6
0111 AIN7
1000 AIN0- AIN1
1001 AIN2- AIN3
1010 AIN4- AIN5
1011 AIN6- AIN7
1100 GND
1101 正电源参考电压
1110 温度传感器
1111 1/3模拟电压
void InitialAD(void);
函数原型:
1 void InitialAD(void) 2 { 3 //P1 out 4 P1DIR = 0x03; //P1 控制LED 5 led1 = 1; 6 led2 = 1; //关LED 7 8 ADCH &= 0X00; // 清EOC标志 9 ADCCON3=0xbf; //单次转换, 参考电压为电源电压,对 1/3 AVDD进行A/D 转换 10 //14位分辨率 11 ADCCON1 = 0X30; // 停止A/D 12 13 ADCCON1 |= 0X40; //启动A/D; 14 }
函数功能:设 P10,P11 设为输出控制 LED 灯,将 AD转换源设为电源电压,ADC结果分辨率设
为14 位(最高精度),AD模式为单次转换,启动ADC转换。
1 //main.c 2 3 #include "ioCC2430.h" 4 #include "stdio.h" 5 #define uint unsigned int 6 7 #define ConversionNum 20 8 //定义控制灯的端口 9 #define led1 P1_0 10 #define led2 P1_1 11 12 void Delay(uint); 13 void initUARTtest(void); 14 void InitialAD(void); 15 void UartTX_Send_String(char *Data,int len); 16 17 char adcdata[]=" 0.0V "; 18 19 /**************************************************************** 20 *函数功能 :延时 * 21 *入口参数 :定性延时 * 22 *返 回 值 :无 * 23 *说 明 : * 24 ****************************************************************/ 25 void Delay(uint n) 26 { 27 uint i; 28 for(i=0;i<n;i++); 29 for(i=0;i<n;i++); 30 for(i=0;i<n;i++); 31 for(i=0;i<n;i++); 32 for(i=0;i<n;i++); 33 } 34 35 /**************************************************************** 36 *函数功能 :初始化串口1 * 37 *入口参数 :无 * 38 *返 回 值 :无 * 39 *说 明 :57600-8-n-1 * 40 ****************************************************************/ 41 void initUARTtest(void) 42 { 43 CLKCON &= ~0x40; //晶振 44 while(!(SLEEP & 0x40)); //等待晶振稳定 45 CLKCON &= ~0x47; //TICHSPD128分频,CLKSPD不分频 46 SLEEP |= 0x04; //关闭不用的RC振荡器 47 48 PERCFG = 0x00; //位置1 P0口 49 P0SEL = 0x3c; //P0用作串口 50 51 U0CSR |= 0x80; //UART方式 52 U0GCR |= 10; //baud_e = 11; 53 U0BAUD |= 216; //波特率设为57600 54 UTX0IF = 1; 55 56 U0CSR |= 0X40; //允许接收 57 IEN0 |= 0x84; //开总中断,接收中断 58 } 59 60 61 /**************************************************************** 62 *函数功能 :初始化ADC * 63 *入口参数 :无 * 64 *返 回 值 :无 * 65 *说 明 :参考电压AVDD,转换对象是1/3AVDD * 66 ****************************************************************/ 67 void InitialAD(void) 68 { 69 //P1 out 70 P1DIR = 0x03; //P1控制LED 71 led1 = 1; 72 led2 = 1; //关LED 73 74 ADCH &= 0X00; //清EOC标志 75 ADCCON3=0xbf; //单次转换,参考电压为电源电压,对1/3 AVDD进行A/D转换 76 //14位分辨率 77 ADCCON1 = 0X30; //停止A/D 78 79 ADCCON1 |= 0X40; //启动A/D 80 81 } 82 83 /**************************************************************** 84 *函数功能 :串口发送字符串函数 * 85 *入口参数 : data:数据 * 86 * len :数据长度 * 87 *返 回 值 :无 * 88 *说 明 : * 89 ****************************************************************/ 90 void UartTX_Send_String(char *Data,int len) 91 { 92 int j; 93 for(j=0;j<len;j++) 94 { 95 U0DBUF = *Data++; 96 while(UTX0IF == 0); 97 UTX0IF = 0; 98 } 99 } 100 101 102 /**************************************************************** 103 *函数功能 :主函数 * 104 *入口参数 :无 * 105 *返 回 值 :无 * 106 *说 明 :无 * 107 ****************************************************************/ 108 void main(void) 109 { 110 char temp[2]; 111 float num; 112 initUARTtest(); //初始化串口 113 InitialAD(); //初始化ADC 114 115 led1 = 1; 116 while(1) 117 { 118 if(ADCCON1>=0x80) 119 { 120 led1 = 1; //转换完毕指示 121 temp[1] = ADCL; 122 temp[0] = ADCH; 123 ADCCON1 |= 0x40; //开始下一转换 124 125 126 temp[1] = temp[1]>>2; 127 temp[1] |= temp[0]<<6; 128 129 temp[0] = temp[0]>>2; //数据处理 130 temp[0] &= 0x3f; 131 132 num = (temp[0]*256+temp[1])*3.3/8192; //有一位符号位,取2^13; 133 num /= 2; 134 //定参考电压为3.3V。14位精确度 135 adcdata[1] = (char)(num)%10+48; 136 //adcdata[2] = '.'; 137 adcdata[3] = (char)(num*10)%10+48; 138 139 UartTX_Send_String(adcdata,6); //串口送数 140 //包括空格 141 142 Delay(30000); 143 led1 = 0; //完成数据处理 144 Delay(30000); 145 } 146 } 147 }