求助CC2530 ADC测量比色法不准确原因的原因

21ic官方微信-->
后使用快捷导航没有帐号?
请完成以下验证码
查看: 2469|回复: 3
cc2530 AD转换外部P0口模拟输入0V电压问题
&&已结帖(0)
主题帖子积分
初级技术员, 积分 79, 距离下一级还需 21 积分
初级技术员, 积分 79, 距离下一级还需 21 积分
主题帖子积分
专家等级:结帖率:60%
主题帖子积分
初级技术员, 积分 79, 距离下一级还需 21 积分
初级技术员, 积分 79, 距离下一级还需 21 积分
cc2530的AD在转换0v电压时,也就是把AD输入通道接地,会出现转换出的数据变为负数而不是0的问题,在其他电压就不会出现这种问题,不知道是不是我选的参考电压有问题。问题的解决方法是对转换出的二进制代码进行判断如果出现负数现将其转换成原码的形式。下面是程序
#include &ioCC2530.h&
#define uint unsigned int
#define uchar unsigned char
void delay(uint z)
&&uint t1,y;
&&for(t1=z;t1&0;t1--)
& & for(y=200;y&0;y--);
void init_CLK32()
&&CLKCONCMD&=0XBF;
&&while(CLKCONSTA&0X40);
&&CLKCONCMD&=0XF8;
void init_uart0()
PERCFG &=0xFE;// 串口0选择备用位置1
P0SEL&&|=0x0C;//IO口设置为片上外设模式
U0CSR&&|=0xC0;//串口0的一般配置
U0UCR& &=0;
U0GCR&&|=8;//波特率配置为9600
U0BAUD&&=59;
void UartTX_Send_String(uchar *Data,uchar len)
&&for(j=0;j&j++)
& & U0DBUF = *Data++;
& & while(UTX0IF == 0);
& & UTX0IF = 0;
void init_AD()
& & ADCCON3=0X37;// 内部产考电压,14分辨率, p0_0模拟输入
& & P0SEL|=0X80; //
& & P0DIR&=0X7F; //
& & APCFG|=0X80;//
& & ADCCFG|=0X80;
float get_AD()
& & uchar adc_h;
& & uchar adc_l;
& & ADCCON3=0XB7;// 内部产考电压,14分辨率, p0_0模拟输入
& & P0SEL|=0X80; //
& & P0DIR&=0X7F; //
& & APCFG|=0X80;//
& & ADCCFG|=0X80;
& & ADCCON1|=0X30;
& & ADCCON1|=0X40;//AD启动方式
& & while(!(ADCCON1&0X80));
& & adc_h=ADCH;
& & adc_l=ADCL;
& & if(adc_h&0X80)
& && &adc_h =~(adc_h-1);
& && &adc_l =~(adc_l);
& & value = adc_h;
& & value = value&&6;
& & value|=adc_l&&2;
& & return (float)(value/(float);
void main()
&&uchar tempdata[6];
&&float x=0;
&&init_CLK32();
&&init_uart0();
&&init_AD();
&&while(1)
& & x=get_AD();
& & tempdata[0]=(uchar)(x)%10+48;
& & tempdata[1]='.';
& & tempdata[2]=(uchar)(x*10)%10+48;
& & tempdata[3]=(uchar)(x*100)%10+48;
& & tempdata[4]='v';
& & tempdata[5]='\n';
& & UartTX_Send_String(tempdata,6);
& & delay(2000);
主题帖子积分
主题帖子积分
专家等级:结帖率:94%打赏:141.96受赏:359.98
主题帖子积分
有什么问题吗?
出现这种情况很正常,你的0V在系统上有可能并不是真正的逻辑0.
另外,ad采样数据要经过校准才行的
欢迎进入& && &21ic TI技术交流1群:(已满),&&21ic TI技术交流2群:
主题帖子积分
技术总监, 积分 40135, 距离下一级还需 9865 积分
技术总监, 积分 40135, 距离下一级还需 9865 积分
主题帖子积分
专家等级:结帖率:3%
主题帖子积分
技术总监, 积分 40135, 距离下一级还需 9865 积分
技术总监, 积分 40135, 距离下一级还需 9865 积分
零点失调不很正常吗
主题帖子积分
实习生, 积分 3, 距离下一级还需 47 积分
实习生, 积分 3, 距离下一级还需 47 积分
主题帖子积分
专家等级:结帖率:0%
主题帖子积分
实习生, 积分 3, 距离下一级还需 47 积分
实习生, 积分 3, 距离下一级还需 47 积分
ADCCON3=0X37;// 内部产考电压,14分辨率, p0_0模拟输入
& & P0SEL|=0X80; //
& & P0DIR&=0X7F; //
& & APCFG|=0X80;//
& & ADCCFG|=0X80;
你的这段代码对么?
我在学cc2530的adc,但是不知道为什么用作转换的P0_6总是输出3.3v,感觉应该就是配置上的问题。
看了你的代码本来想借鉴下,不过有几个问题。
ADCCON3若为P0_0输入,为什么不是0x30?
APCFG设置为0x80那不是设置的P0_7的模拟输入么?
终身成就奖章
等级类勋章
坚毅之洋流
发帖类勋章
时间类勋章
技术领袖奖章
人才类勋章
荣誉元老奖章
等级类勋章CC2530 ADC实验1(读取片内温度并通过串口显示)
我的图书馆
CC2530 ADC实验1(读取片内温度并通过串口显示)
/*****************************************//by 虚幻代码//名称:读取片内温度并通过串口显示//说明:取片内温度传感器为AD源,通过串口在PC上显示出来。//实验使用UART0,波特率为19200*****************************************//*引用********************************************/#include &iocc2530.h&#include &stdio.h&/*宏定义*****************************************/#define uchar unsigned char#define uint unsigned int#define int16 short #define uint16 unsigned short &&&&& /*函数定义*******************************///初始化时钟void initclock(void){& CLKCONCMD &=0XBF;//系统时钟源选择32MHZ XOSC& CLKCONCMD &=0XF8;//系统时钟频率为32MHZ& & CLKCONCMD |=0X28;& CLKCONCMD &=0XEF;//定时时钟频率为1MHZ& while(CLKCONSTA & 0X40);//等待时钟稳定}//初始化串口0函数void inituart0(void){& PERCFG &=0XFE;//设USART0的ALT 1& P0SEL |=0X3C;//P0口2、3、4、5做外设& P2DIR &=0X3F;//P0外设优先级USART0最高& U0CSR |=0X80;//设USART0 工作方式为 UART& U0GCR |=9;& U0BAUD |=59;//设波特率,理论上应该为19200,调试串口却要设为9600,奇怪?& UTX0IF=0;//UART0 TX中断标志位清0& U0CSR |=0X40;//USART0 接收使能& IEN0 |=0X04;//usart0 接收中断使能& IEN0 |=0X80;//总中断使能}//串口发送字符串函数void uarttx_send_string(char *data,int len){& int j;& for(j=0;j&len;j++)& {&&& U0DBUF=*data++;&&& while(UTX0IF==0);&&& UTX0IF=0;& }& U0DBUF=0X0A;//换行& while(UTX0IF==0);& UTX0IF=0;& }//延时函数void delay(uint n){& uint i;& for(i=0;i&n;i++);& for(i=0;i&n;i++);& for(i=0;i&n;i++);& for(i=0;i&n;i++);& for(i=0;i&n;i++);}//读取温度传感器AD值函数uint gettemperature(void){& uint i;& uint16 adcvalue;& uint16 value;& & adcvalue=0;& for(i=0;i&4;i++)& {&&& ADCCON3 |=0X0E;//单通道AD转换源为温度传感器&&& ADCCON3 &=0X3F;//单通道AD转换参考电压为1.25内部电压&&& ADCCON3 |=0X30;//单通道AD转换分辨率为512DEC,12有效&&& ADCCON1 |=0X30;//ADC启动方式选择为ADCCON1.ST=1事件&&& ADCCON1 |=0X40;//ADC启动转换&&&&&&& &&& while(!ADCCON1&0X80);//等待AD转换完成&&& value =& ADCL && 2; //ADCL寄存器低2位无效&&& value |=(((uint16)ADCH)&&6);//连接ADCH和ADCL,并赋值给value&&& adcvalue +=value;//adcvalue被赋值为4次AD值之和& }& value=adcvalue&&2;//累加除以4,得到平均值& return ((value) && 4) - 315;&&&& //根据AD值,计算出实际的温度}&& && /*变量定义和赋值*******************************/int16 avgtemp;/*主函数*******************************/void main(void){& char i;& char tempvalue[10];& & initclock();//初始化时钟& & inituart0();//初始化串口& IEN0=IEN1=IEN2=0X00;//关闭所有中断& ATEST=0X01;//开启温度传感器& TR0=0X01;//将温度传感器与ADC连接起来& & while(1)& {&&& avgtemp=0;&&& for(i=0;i&64;i++)&&& {&&&&& avgtemp +=gettemperature();//取得温度数,加上原平均值&&&&& avgtemp&&=1;//除以2,取得平均值&&& }&&& &&& sprintf(tempvalue,(char *)"%dC/r",(int)avgtemp);&&& uarttx_send_string(tempvalue,4);&&& delay(50000);& }}
TA的最新馆藏
喜欢该文的人也喜欢ADC实验_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
阅读已结束,下载文档到电脑
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩6页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢CC2530 ADC学习笔记
CC2530的ADC最大支持14位(实际上为12位)的模拟数字转换。它包括一个模拟多路转换器,具有多达8个可独立配置的通道以及一个参考电压发生器。
ADC框图如下所示:
由图中可知CC2530的AD有多种输入通道如AIN0~AIN7、VDD/3、温度传感器等。
CC2530的采样精度有7Bit、9Bit、10Bit、12Bit四种,可通过对ADCCON2寄存器、ADCCON3寄存器进行配置来改变ADC的采样精度。
一、GPIO配置
由于ADC的AIN引脚设定在P0端口,因此需要对P0端口的寄存器进行配置。需要配置的寄存器有:APCFG寄存器、P0SEL寄存器、P0DIR寄存器(CC2530的GPIO默认情况下为输入状态)。
寄存器名称
寄存器介绍
P0.0~P0.7模拟IO功能配置
P0.0~P0.7外设功能选择
P0.0~P0.7引脚方向
注:P0.0对应AIN0, P0.7对应AIN7;
/** ADC AIN通道引脚定义 */
#define USE_P0_0_AS_ADC_CH0 (0x01)
#define USE_P0_1_AS_ADC_CH1 (0x02)
#define USE_P0_2_AS_ADC_CH2 (0x04)
#define USE_P0_3_AS_ADC_CH3 (0x08)
#define USE_P0_4_AS_ADC_CH4 (0x10)
#define USE_P0_5_AS_ADC_CH5 (0x20)
#define USE_P0_6_AS_ADC_CH6 (0x40)
#define USE_P0_7_AS_ADC_CH7 (0x80)
*******************************************************************************
ADC通道初始化函数
初始化通道
*******************************************************************************
void MCU_ADC_CH_Init( uint8 channel )
//P0DIR &= ~
//P0INP |=
二、ADC配置
ADC有6个控制寄存器,它们分别是:ADCL寄存器、ADCH寄存器、ADCCON1寄存器、ADCCON2寄存器、ADCCON3寄存器、TR0寄存器。
1. ADC数据寄存器介绍
ADCL寄存器和ADCH寄存器保存的是AD转换完成的结果,数据以2的补码形式表现。下表为采样精度与有效数据解析表:
有效数据(从低到高)
ADCH寄存器的第0位到第6位
ADCL寄存器的第6位到ADCH寄存器的第6位
ADCL寄存器的第5位到ADCH寄存器的第6位
ADCL寄存器的第3位到ADCH寄存器的第6位
*******************************************************************************
读取AD转换数值
程序运行状态
ADC工作在单次转换模式
*******************************************************************************
bool Rd_ADC_Data( uint16 *data, uint8 convert_bit )
uint16 temp = (uint16)(ADCH && 8);
temp |= (uint16)ADCL;
if( !MCU_ADC_FLAG )
switch(convert_bit)
case ADC_CONVERT_7BIT:
temp &&= 8;
*data = temp & ~(1 && 8);
case ADC_CONVERT_9BIT:
temp &&= 5;
*data = temp & ~(1 && 10);
case ADC_CONVERT_10BIT:
temp &&= 4;
*data = temp & ~(1 && 11);
case ADC_CONVERT_12BIT:
temp &&= 2;
*data = temp & ~(1 && 13);
2. ADCCON1寄存器介绍
ADC转换完成标志
0(转换未完成)
1(转换完成)
软件开启转换位
0(ADC没有转换任务)
1(软件触发ADC转换信号)
配置AD转换触发信号
00(P2.0引脚触发AD转换)
01(ADC一直处于转换状态,不等待触发信号)
10(定时器0通道1比较事件触发AD转换)
11(ST触发AD转换)
控制16位随机数发生器
3. ADCCON2、ADCCON3寄存器介绍
ADC转换参考电压
00(使用内部参考电压)
01(使用AIN7引脚上的外部点电压作为参考电压)
10(使用AVDD5作为参考电压)
11(使用AIN6-AIN7差分输入外部电压作为参考电压)
ADC转换抽取率(转换时间和转换精度)
00(转换精度为7)
01(转换精度为9)
10(转换精度为10)
11(转换精度为12)
ADC采样通道
0000(配置ADC采样通道为AIN0)
0001(配置ADC采样通道为AIN1)
0010(配置ADC采样通道为AIN2)
0011(配置ADC采样通道为AIN3)
0100(配置ADC采样通道为AIN4)
0101(配置ADC采样通道为AIN5)
0110(配置ADC采样通道为AIN6)
0111(配置ADC采样通道为AIN7)
1000(配置ADC采样通道为AIN0-AIN1电压)
1001(配置ADC采样通道为AIN2-AIN3电压)
1010(配置ADC采样通道为AIN4-AIN5电压)
1011(配置ADC采样通道为AIN6-AIN7电压)
1101(正参考电压)
1110(温度传感器)
1111(VDD/3)
配置ADCCON2寄存器完成循环AD转换,配置ADCCON3寄存器完成单次AD转换。
// AD参考电压配置
#define ADC_SREF_VREF
#define ADC_SREF_AIN7
#define ADC_SREF_AVDD
#define ADC_SREF_AIN6_AIN7
// AD转换精度
#define ADC_CONVERT_7BIT
#define ADC_CONVERT_9BIT
#define ADC_CONVERT_10BIT
#define ADC_CONVERT_12BIT
// AD转换通道
#define ADC_CONVERT_CH0
#define ADC_CONVERT_CH1
#define ADC_CONVERT_CH2
#define ADC_CONVERT_CH3
#define ADC_CONVERT_CH4
#define ADC_CONVERT_CH5
#define ADC_CONVERT_CH6
#define ADC_CONVERT_CH7
// AD转换差分输入信号
#define ADC_CONVERT_CH0_CH1 (0x08)
#define ADC_CONVERT_CH2_CH3 (0x09)
#define ADC_CONVERT_CH4_CH5 (0x0A)
#define ADC_CONVERT_CH6_CH7 (0x0B)
// AD转换其它信号
#define ADC_CONVERT_GND
#define ADC_CONVERT_VREF
#define ADC_CONVERT_TEMP
#define ADC_CONVERT_VDD_3
// 启动ADC转换
#define MCU_ADC_START()
( ADCCON1 |= 0x70 )
// ADC转换完成标识
#define MCU_ADC_FLAG
( ADCCON1 & 0x80 )
// 使能AD转换中断
#define enable_adc_isr()
(IEN0 |= 0x02)
//失能AD转换中断
#define disable_adc_isr()
(IEN0 &= ~0x02)
*******************************************************************************
ADC启动单次转换函数
convert_bit
转换数据打小
*******************************************************************************
void MCU_ADC_SIGNAL_START( uint8 adc_ref, uint8 channel, uint8 convert_bit )
ADCCON3 = adc_ref | channel | convert_
enable_adc_isr();
MCU_ADC_START();
三、参考资料
[1]. CC2530数据手册
本文已收录于以下专栏:
相关文章推荐
CC2530有8个ADC通道,系统框图如下:
使用ADC有两种情况:
第一种是连续转换,此时需要配置ADCCON1和ADCCON2寄存器;
第二种是单次转换,此时只需要配置寄存器AD...
CC2530中adc的使用记录本文主要是记录使用CC2530中adc过程中遇到的问题。同时分析ZigBee协议栈中实现的代码。
ADC的基本知识
CC2530中ADC相关特性
CC2530中和ADC相...
一、任务分析编写程序实现实验板测定芯片外部光敏传感器的电压,通过串口发送电压值。实验板安装上光线传感器,光线的强弱转换成电压的高低,经ADC转换以后通过串口将电压值发送给PC,可以通过串口调试软件读取...
CC2530有8个ADC通道,系统框图如下:
使用ADC有两种情况:
第一种是连续转换,此时需要配置ADCCON1和ADCCON2寄存器;
第二种是单次转换,此时只需要配置寄存器AD...
在调试cc2530的上的ADC的小实验中,遇到的一些问题,想和大家一起分享一下。
关于ADC的使用需要注意以下几点:
 1.关于配置的寄存器:IO口的配置,其实仔细用大脑想想不用看数据手册就应该想...
/*#define BYTE_SWAP
#ifdef BYTE_SWAP*/
typedef struct{
unsigned long long tail1 :5...
他的最新文章
讲师:汪剑
讲师:刘道宽
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)在调试cc2530的上的ADC的小实验中,遇到的一些问题,想和大家一起分享一下。
关于ADC的使用需要注意以下几点:
&1.关于配置的寄存器:IO口的配置,其实仔细用大脑想想不用看数据手册就应该想到,IO口要配置成为输入模式,以下摘自数据手册:当使用ADC时,端口0引脚必须配置为ADC输入。可以使用多达八个ADC输入引脚。要配置一个端口0脚为一个ADC输入,APCFG寄存器中相应的位必须设置为1。这个寄存器的默认值选择端口0引脚为非ADC,即数字输入输出。APCFG寄存器的设置将覆盖P0SEL的设置。
2.关于和ADC有关的几个寄存器,实验中使用的是ADCL和ADCH,主要放的是ADC转换完毕的值,控制ADC启用转换的是三个控制器,分类是这样的ADCCON1,ADCCON2,ADCCON3.其中ADCCON1,ADCCON2可以启用连续转换,而ADCCON3可以控制某一个通道执行一次转换。以上这些一般人都是可以通过看手册配置的,但是配置不是什么大问题,但是从ADCL和ADCH取值有疑问的。经过我的实验,我总结到一个规律:
&& 说实话,TI的CC2530的数据手册有点失败,不过还好ADC能用,数据手册上是说ADC的最大有效数据位为12位。令人奇怪的是却留给用户一个ADCH和ADCL的高6位总共14位,真是令人费解,说好呢12位呢?不禁让人猜想是不是本来设计的是14位,发现无法满足设计的要求,就成12位了,呵呵。
&我用的是10位的有效数据,但是怎么从ADCH和ADCL拼凑这10位的数据,通过实验,我可以负责任地告诉大家,其实是这样算的。注我选的是以AVDD5作为参考电压的,AVDD5 = 3.3V
ADCL为(注ADCL的低两位无效,读为0)
那么如何取值呢?经过计算,发现ADCH中最高位是带有一位的有效数字的,对于单端的ADC转换,转换的数据是大于0的,所以符号位为0,那么总共是10位的有效数字位,所以抛开符号位,那么ADCL取高3位,和ADCH的除了符号位的7位组成10位的数字,那么此时有效值为,转化为10进制的数是869,那么电压值此时为869/V*1000 MV。
至于剩余的12位依次类推,可得到结果,需要注意的是对于电压值是0V的,会导致转换的值溢出的问题,需特别注意。
最后要谢谢我的老师太原联航科技的张老师。
总结:耐心一点就可以得到结果
本文已收录于以下专栏:
相关文章推荐
CC2530 ADC学习笔记
/*#define BYTE_SWAP
#ifdef BYTE_SWAP*/
typedef struct{
unsigned long long tail1 :5...
一、任务分析编写程序实现实验板测定芯片外部光敏传感器的电压,通过串口发送电压值。实验板安装上光线传感器,光线的强弱转换成电压的高低,经ADC转换以后通过串口将电压值发送给PC,可以通过串口调试软件读取...
CC2530中adc的使用记录本文主要是记录使用CC2530中adc过程中遇到的问题。同时分析ZigBee协议栈中实现的代码。
ADC的基本知识
CC2530中ADC相关特性
CC2530中和ADC相...
CC2530中有好多款的型号,其中什么F128,F256,F32都是所谓的flash的大小,很多人不知道关于flash的概念,其实需要概念吗? u盘就是典型的flash(可能表达不是很准确),可以读也...
有一段时间没有碰Z-STACK了,有点生疏,不过没关系!我们继续Z-STACK的驱动之旅!今天着重分析一下
z-stack的flash驱动。在分析flash驱动之前,需要熟读cc2530的datas...
CC2530 ZigBee ADC
初窥ZIGBEE
要在zigbee的组网中加入烟雾传感器的模块,所以需要用到cc2530的ADC对传感器输出的模拟信号进行采样。下面是自己对实现用CC2530的ADC采集外部电压的程序过程。
他的最新文章
讲师:汪剑
讲师:刘道宽
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 sw测量为何不准确 的文章

 

随机推荐