威廉希尔官方网站 设计william hill官网
直播中

许强

7年用户 81经验值
擅长:94066
私信 关注
[问答]

CC2530的最高ADC是12位吗?有效位是多少?

看了CC2530的中文手册,上面写道最高ADC位数是12位,然而在协议栈里可以看到抽取率可以选14位。通俗一点说,CC2530最高的12位ADC采集数据时,是将数据精分成2的12次方=4096份,还是分成2的11次方=2048份?这里有一个有效位的概念,我没有弄清楚,大家思考过吗?

回帖(7)

张予三丰

2017-2-22 21:37:14
ADC的位数指的是分辨率,有效位可以看成精度,12位AD的有效位至少11位,16位AD一般14位有效,24位AD一般18位,但这只是官方数据,实际应用精度可能有偏差,
举报

许强

2017-2-23 14:29:58
引用: zwx_zhang 发表于 2017-2-22 21:37
ADC的位数指的是分辨率,有效位可以看成精度,12位AD的有效位至少11位,16位AD一般14位有效,24位AD一般18位,但这只是官方数据,实际应用精度可能有偏差,

我又参考了一本zigbee的书,上面是这么说的CC2530的ADC支持多达14位的模拟数字转换,具有多达12位的有效数字位,那么精度也就是12位了?意味着我可以用这个14位分辨率的片内ADC将采集到的数据精分成2的12次方=4096份?   精度=参考电压/2的12次方?
举报

许强

2017-2-23 14:42:10
又查了一些资料。“位数”是A/D转换器的数学表达力(分辨力),这里应该是指有效位数,有效位数不等于分辨率就是输出的最小变化量其实是模拟量的离散值,在二进制系统中,它是满度量程的1/(2^x),式中的x为位数(有效位数),与精度相关,但不等于精度。
实际用途中的“精度”是个综合性指标,需要考虑非线性度、偏移、温漂、倍率漂移等器件特性以及搭成的威廉希尔官方网站 外部电气特性指标,这些都对威廉希尔官方网站 的精度有直接影响,要综合考虑。
大家如果有新的见解可以一起来探讨一下
举报

曾进荣

2017-2-23 15:22:54
和实际应用肯定会有偏差,不可能百分百的有效
举报

许强

2017-2-23 15:30:32
刚才试了一下,CC2530芯片RESOLUTION选14位,采集的电压按 参考电压/2的14-1次方 计算,基本能完成电压测量工作,和万用表、示波器进行了对比,万用表测量值为0.675V左右,示波器测量值为0.68V左右,CC2530内部AD测量值为0.700V左右,有一定的误差,但是是否可以说明CC2530进行AD采集的时候实际是有13位有效数的?
举报

许强

2017-2-24 14:30:29
还有人过来一起讨论一下么
举报

房浩然

2018-4-25 16:19:27
楼主你好,向你请教一下,我在用CC2530的P0_7引脚采集外部电压时,采集显示的一直是参考电压值(3.23V),这是为什么呢?



  1. #include "ioCC2530.h"
  2. #define uint unsigned int

  3. #define ConversionNum 20
  4. //定义控制灯的端口
  5. #define LED1 P1_0
  6. #define LED2 P1_1

  7. char temp[2];
  8. uint adc;
  9. float num;

  10. void Delay(uint);
  11. void InitialAD(void);
  12. void initUARTtest(void);
  13. void UartTX_Send_String(char *Data,int len);

  14. char adcdata[]=" 0.00V ";





  15. /****************************************************************
  16. *函数功能 :主函数                                                *
  17. *入口参数 :无                                                        *
  18. *返 回 值 :无                                                        *
  19. *说    明 :无                                                        *
  20. ****************************************************************/
  21. void main(void)
  22. {        

  23.         //P1控制LED
  24.         P1DIR = 0x03;
  25.         //关LED
  26.         LED1 = 1;
  27.         LED2 = 1;               
  28.      
  29.         //初始化ADC
  30.         InitialAD();
  31.         initUARTtest();
  32.         while(1)
  33.         {
  34.                //等待ADC转换完成
  35.                 if(ADCCON1&0x80)
  36.                 {
  37.                           //转换完毕指示
  38.                         temp[1] = ADCL;
  39.                         temp[0] = ADCH;
  40.                         //初始化AD
  41.                         InitialAD();
  42.                         //开始下一转换
  43.                         ADCCON1 |= 0x40;                  
  44.                         //adc赋值
  45.                         adc |= (uint)temp[1]>>4;
  46.                         adc |= ( (uint) temp[0] )<<4;
  47.                         
  48.                         if(adc&0x8000)
  49.                         {adc = 0;}
  50.                         else
  51.                         {
  52.                         num = adc*3.3/2048;//8192;//8096;//7686
  53.                         //定参考电压为3.3V。14位精确度
  54.                         adcdata[1] = (char)(num)%10+48;
  55.                         adcdata[3] = (char)(num*10)%10+48;
  56.                         adcdata[4] = (char)(num*100)%10+48;
  57.                         UartTX_Send_String(adcdata,6);
  58.                         }
  59.                        //完成数据处理                                
  60.                         Delay(30000);
  61.                         LED1 = ~LED1;                       
  62.                         Delay(30000);         
  63.                 }
  64.         }
  65. }


  66. /****************************************************************
  67. *函数功能 :延时                                                *
  68. *入口参数 :定性延时                                                *
  69. *返 回 值 :无                                                        *
  70. *说    明 :                                                        *
  71. ****************************************************************/
  72. void Delay(uint n)
  73. {
  74.         uint i;
  75.         for(i=0;i
  76.         for(i=0;i
  77.         for(i=0;i
  78.         for(i=0;i
  79.         for(i=0;i
  80. }


  81. /****************************************************************
  82. *函数功能 :初始化ADC                                                *
  83. *入口参数 :无                                                        *
  84. *返 回 值 :无                                                        *
  85. *说    明 :参考电压AVDD,转换对象是1/3AVDD                        *
  86. ****************************************************************/
  87. void InitialAD(void)
  88. {
  89.         
  90.         //清EOC标志
  91.         ADCH &= 0X00;
  92.         //P0.6端口模拟I/O使能
  93.         APCFG |= 0X80;//0x80
  94.         //单次转换,参考电压为电源电压,对P07进行采样 12位分辨率
  95.         ADCCON3=0xb7;//0xb7               
  96.         //停止A/D                                       
  97.         ADCCON1 = 0X30;               
  98.         //启动A/D
  99.         ADCCON1 |= 0X40;        

  100. }
  101. /****************************************************************
  102. *函数功能 :初始化串口1                                                                                
  103. *入口参数 :无                                                                                                
  104. *返 回 值 :无                                                        
  105. *说    明 :57600-8-n-1                                                
  106. ****************************************************************/
  107. void initUARTtest(void)
  108. {
  109.     //晶振选择32MHz
  110.     CLKCONCMD &= ~0x40;  
  111.     //等待晶振稳定
  112.     while(!(SLEEPSTA & 0x40));
  113.     //TICHSPD128分频,CLKSPD不分频
  114.     CLKCONCMD &= ~0x47;
  115.     //关闭不用的RC振荡器
  116.     SLEEPCMD |= 0x04;                  
  117.     //使用串口备用位置1 P0口
  118.     PERCFG = 0x00;                                
  119.     //P0用作串口
  120.     P0SEL = 0x3c;                                
  121.     //选择串口0优先作为串口
  122.     P2DIR &= ~0XC0;                             
  123.     //UART方式
  124.     U0CSR |= 0x80;                                
  125.     //波特率baud_e的选择
  126.     U0GCR |= 10;        
  127.     //波特率设为57600
  128.     U0BAUD |= 216;
  129.     //串口0发送中断标志清零
  130.     UTX0IF = 0;
  131. }

  132. /****************************************************************
  133. *函数功能 :串口发送字符串函数                                       
  134. *入口参数 : data:数据                                                                        
  135. *                        len :数据长度                                                        
  136. *返 回 值 :无                                                                                       
  137. *说    明 :                                
  138. ****************************************************************/
  139. void UartTX_Send_String(char *Data,int len)
  140. {
  141.   int j;
  142.   for(j=0;j
  143.   {
  144.     U0DBUF = *Data++;
  145.     while(UTX0IF == 0);
  146.     UTX0IF = 0;
  147.   }
  148. }
举报

更多回帖

发帖
×
20
完善资料,
赚取积分