嵌入式成长轨迹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 }
原文地址:https://www.cnblogs.com/zeedmood/p/2666925.html