打印

pic12f675 ADC转换快弄疯了,求助

[复制链接]
4573|14
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gmgmgm|  楼主 | 2015-3-10 15:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
pic12f675 芯片
GP1用作ADC输入,下面的程序调了3天没调通,返回的数据总是0或者0xffff,不知道问题在哪了
unsigned int ADCRead()
{
    unsigned int temp;
    ADON=1;
    GO_nDONE=1;  //adc start
    while(GO_nDONE);
    temp=ADRESH<<8+ADRESL;
    return(temp);
}

void ADCInit()
{
   TRISIO1=1;//ADC  //GP1输入
    ADCON0=0b10000100;    //右对齐,AN0
    ANSEL =0b00010010;     //Fosc/8
}
沙发
JY-DX-JY| | 2015-3-10 16:33 | 只看该作者
电压多大?原理图?

使用特权

评论回复
板凳
shell.albert| | 2015-3-10 16:58 | 只看该作者
多看看数据手册,再实地测试一下,看是不是ADC的输入引脚电压不对。

使用特权

评论回复
地板
ayb_ice| | 2015-3-10 17:03 | 只看该作者
temp=(ADRESH<<8) + ADRESL;

使用特权

评论回复
5
MOn51| | 2015-3-10 21:42 | 只看该作者
给你一个#define JL_OUT                GPIO1                //低电压电位保护
#define JH_OUT                GPIO2                //高电压电位保护
#define MAX_REF                (5000)                //5.00v
#define MAX_UK                (10)                //变比系数10最大测量范围

/*-----------------------------------------------------------
//ADCON0 ADFM VCFG - - CHS1 CHS0 GO/DONE ADON 00-- 0000 58,83
ADFM: A/D 结果格式选择位
1 = 右对齐
0 = 左对齐
//ch=输入的ADC的通道 B0000_1111
--------------------------------------------------------------*/
void ADC_Init(unsigned char ch){
        ANSEL  =B0111_0000 | ch;                //使用内部特殊RC=500K
        CMCON  =B0000_0111;                                //Cout在内部,V-=Cin-       
        TRISIO =B0000_1000 | ch;                //必须采用或处理
        if(ch & B0000_1000) TRISIO |=B0001_0000;        //CH4=ENABLED
}
//-----------------------------------------------------------
//ADC采集开始
unsigned int  ADC(unsigned char channel){                //AD转换.
        const unsigned char ADCNok[]={
                B1000_0001,B1000_0101,B1000_1001,B1000_1101,
        };
        while(GODONE);                           //等待转换完成.查询方式.
        ADCON0=ADCNok[channel];
        GODONE=1;                                     //开启转换过程.
    while(GODONE);                           //等待转换完成.查询方式.
        return (ADRESH<<8 | ADRESL);
}
//*******************************************************
//电压检测
void Get_U_Value(void){
        #define ADC_MAX_CNT                8
        static unsigned short buf[ADC_MAX_CNT];
        static unsigned char cnt=0;
        unsigned long u;       
        unsigned char i;

        buf[cnt++]=ADC(0);
        if(cnt>=ADC_MAX_CNT)        cnt=0;
        //**********************************
        //滑动滤波
        u=0;
        for(i=0;i<ADC_MAX_CNT;i++)        u +=buf[i];       
        u /=ADC_MAX_CNT;
        u =u*MAX_REF/1024;       
        u *=MAX_UK;//得到电压值
        Current_U=u;
}:

使用特权

评论回复
6
tozxq| | 2015-3-11 09:12 | 只看该作者
注意:TRISIO1应该是TRISIO,另外建议AD初始化时就开启ADON。

如GP0(AN0)口作AD采集:
void ADCInit()
{
   TRISIO=1;//ADC  //GP0输入
    ADCON0=0b10000001;    //右对齐,AN0
    ANSEL=0b00010001;     //Fosc/8
}

如GP1(AN1)口作AD采集:
void ADCInit()
{
   TRISIO=0b10000010;;//ADC  //GP1输入
    ADCON0=0b10000101;    //右对齐,AN1
    ANSEL=0b00010010;     //Fosc/8
}

使用特权

评论回复
7
forrest11| | 2015-3-11 11:59 | 只看该作者
1.  先展示原理图,说明测试方法才对。不要一上来就贴代码,你想用软件的思维解决硬件相关问题?
2.  自己想法确认是硬件问题还是软件问题。如果不知道,至少要想一想怎么定位(如:芯片内部有温度传感器吗?。。。。)
3.  过滤网友建议,采取行动。

使用特权

评论回复
8
gmgmgm|  楼主 | 2015-3-11 12:45 | 只看该作者
搞定了,谢谢楼上的各位,结贴了;
unsigned int ADCRead()
{
    unsigned int temp;
    ADON=1;
delay_us(1);/这里加延时就一切正常了
    GO_nDONE=1;  //adc start
delay_us(1);/这里加延时就一切正常了
    while(GO_nDONE);
    temp=ADRESH<<8+ADRESL;
    return(temp);
}

使用特权

评论回复
9
949155525| | 2015-3-17 10:49 | 只看该作者
参考pic的库

使用特权

评论回复
10
18271623385| | 2015-3-23 16:17 | 只看该作者

请问你说的库是什么东西?

使用特权

评论回复
11
ninicaoyuan| | 2016-2-17 14:42 | 只看该作者
确实是延时

使用特权

评论回复
12
xliuzz| | 2016-2-17 15:27 | 只看该作者
gmgmgm 发表于 2015-3-11 12:45
搞定了,谢谢楼上的各位,结贴了;
unsigned int ADCRead()
{

Mark一下,以备用

使用特权

评论回复
13
michaellengleng| | 2016-2-24 11:28 | 只看该作者
;P哈哈  找我们呗

使用特权

评论回复
14
fqc168| | 2016-3-12 13:59 | 只看该作者
可以看出楼主对ADC的采样过程一点都没有了解,,,会单片机和精通单片机,单片机老手差别还是很大的

使用特权

评论回复
15
shuier1028| | 2016-12-19 16:10 | 只看该作者
uint ADC(uchar channel)
{
    uint result;
    channel=channel<<2;
    ADCON0 &= 0b11110011;
    ADCON0 |= channel ;         //select AD channel
    delay_10us(2);
    GODONE=1;                   //START ADC
    while(GODONE){}
    result=(uint)ADRESH<<8;
    result=result+ADRESL;
    return (result);
}

使用特权

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

本版积分规则

135

主题

766

帖子

2

粉丝