打印

cc2530 AD转换外部P0口模拟输入0V电压问题

[复制链接]
3782|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ming月|  楼主 | 2014-11-5 23:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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;//1111 1110 串口0选择备用位置1
P0SEL  |=0x0C;//0000 1100IO口设置为片上外设模式

U0CSR  |=0xC0;//1100 0000串口0的一般配置
U0UCR   =0;

U0GCR  |=8;//0000 1000波特率配置为9600
U0BAUD  =59;
}

void UartTX_Send_String(uchar *Data,uchar len)
{
  int j;
  for(j=0;j<len;j++)
  {
    U0DBUF = *Data++;
    while(UTX0IF == 0);
    UTX0IF = 0;
  }
}

void init_AD()
{
    ADCCON3=0X37;//0011 0100 内部产考电压,14分辨率, p0_0模拟输入
    P0SEL|=0X80; //1000 0000
    P0DIR&=0X7F; //0111 1111
    APCFG|=0X80;//0010 0001
    ADCCFG|=0X80;
}

float get_AD()
{
    uint value;
    uchar adc_h;
    uchar adc_l;
   
    ADCCON3=0XB7;//0011 0111 内部产考电压,14分辨率, p0_0模拟输入
    P0SEL|=0X80; //1000 0000
    P0DIR&=0X7F; //1101 1111
    APCFG|=0X80;//0010 0001
    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)8191)*3.3;
}

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);
  }
}

相关帖子

沙发
dirtwillfly| | 2014-11-6 08:21 | 只看该作者
有什么问题吗?
出现这种情况很正常,你的0V在系统上有可能并不是真正的逻辑0.
另外,ad采样数据要经过校准才行的

使用特权

评论回复
板凳
ayb_ice| | 2014-11-6 15:14 | 只看该作者
零点失调不很正常吗

使用特权

评论回复
地板
cyldark| | 2015-11-9 19:06 | 只看该作者
ADCCON3=0X37;//0011 0100 内部产考电压,14分辨率, p0_0模拟输入
    P0SEL|=0X80; //1000 0000
    P0DIR&=0X7F; //0111 1111
    APCFG|=0X80;//0010 0001
    ADCCFG|=0X80;

你的这段代码对么?
我在学cc2530的adc,但是不知道为什么用作转换的P0_6总是输出3.3v,感觉应该就是配置上的问题。
看了你的代码本来想借鉴下,不过有几个问题。
ADCCON3若为P0_0输入,为什么不是0x30?
APCFG设置为0x80那不是设置的P0_7的模拟输入么?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

23

帖子

0

粉丝