打印

STC单片机AD转换奇怪的问题

[复制链接]
4941|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
STC内部有个BandGap,准备用来检测外部电压的,我配置完相应的寄存器后,启动AD转换,准备读取BandGap的值,可是一直读不到AD转换结束的标志!有哪位朋友用过STC的这个功能的,帮忙看一看!下面是部分代码!
   AD的基本配置:
        EA=0;                                        //屏蔽总中断
        CLK_DIV=0x02;                           //12MHz4分频    时钟频率3M                               
        ADC_CONTR=0;
        ADC_CONTR|=0x80;                //选择通道0,打开电源,
        _nop_();                                //第一次上电等待电源稳定
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        P1ASF=0x00;                                //P1口都不当成AD口  读取BandGap必须这样设置
        EADC=0;                                        //禁止ADC中断
        ADC_RES=0;                              //清除结果寄存器
        ADC_RESL=0;
AD值读取:
               ADC_CONTR|=0x88;                        //启动ADC转换
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
       
        while(!(ADC_CONTR&0x10));        //等转换结束  程序一直死在这里 读不到转换结束的标志
        ADC_CONTR&=0x6F;                          //关闭AD转换
        ADC_Vaule=(unsigned int)ADC_RES<<8+ADC_RESL;        //取结?       

寄存器配置应该无错误,硬件上现在就相当于一个最小系统 什么也没接  各位朋友帮忙看看,很是奇怪
单片机型号为:IAP15L2K61S2

相关帖子

沙发
程序会不会|  楼主 | 2014-3-12 13:57 | 只看该作者
有人帮忙看看吗

使用特权

评论回复
板凳
coody| | 2014-3-12 14:09 | 只看该作者

使用特权

评论回复
地板
berryman| | 2014-3-12 16:06 | 只看该作者
看一下,学习

使用特权

评论回复
5
fengxiaoli111| | 2014-3-12 17:13 | 只看该作者
难道是第一次上电时间短了???

使用特权

评论回复
6
xyz549040622| | 2014-3-12 17:34 | 只看该作者
放整体的代码,一般这种错误出在你往往认为不可能的地方

使用特权

评论回复
7
程序会不会|  楼主 | 2014-3-12 20:30 | 只看该作者
xyz549040622 发表于 2014-3-12 17:34
放整体的代码,一般这种错误出在你往往认为不可能的地方

别的部分我都屏蔽了

使用特权

评论回复
8
xyz549040622| | 2014-3-12 21:18 | 只看该作者
程序会不会 发表于 2014-3-12 20:30
别的部分我都屏蔽了

看代码是没有问题的,不知道你的其他部分,只能建议你先烧官网给的程序看看是否正确

使用特权

评论回复
9
程序会不会|  楼主 | 2014-3-12 21:33 | 只看该作者
xyz549040622 发表于 2014-3-12 21:18
看代码是没有问题的,不知道你的其他部分,只能建议你先烧官网给的程序看看是否正确 ...

#include "STC15F2K60S2.H"
#include "intrins.h"

unsigned int ADC_Vaule=0;

void delay(unsigned char Count)
{
        unsigned int Temp=5000;
        while(Count--)
         {
                 while(Temp--);
                Temp=5000;
         }

}
void InitAllPer()
{
          
        EA=0;                                        //屏蔽总中断
//        CLK_DIV=0x02;                           //12MHz4分频    时钟频率3M
/*        SCON = 0x53;                        //8位数据,可变波特率
        AUXR |= 0x40;                        //定时器1时钟为Fosc,即1T
        AUXR &= 0xFE;                        //串口1选择定时器1为波特率发生器
        TMOD &= 0x0F;                        //设定定时器1为16位自动重装方式
        TL1 = 0xB2;                                //设定定时初值
        TH1 = 0xFF;                                //设定定时初值
        ET1 = 0;                                //禁止定时器1中断
        TR1 = 1;                                //启动定时器1  */

        ADC_CONTR=0;
        ADC_CONTR|=0x80;                //选择通道0,打开电源,
        delay(2);

        P1ASF=0x11;                                //P1口都不当成AD口
//        ADC_CONTR|=0x60;                //90个时钟转换一次
        EADC=0;                                        //禁止ADC中断
        ADC_RES=0;
        ADC_RESL=0;
}

void UsartSendChar(unsigned char Temp)                //发字符
{
        if(TI)                                          //如若一帧数据发送结束
         {
                 TI=0;
                SBUF=Temp;         
         }
}
void UsartSendString(unsigned char *p)                          //发字符串
{  
   
        while(*p)
         {
                  if(TI) UsartSendChar(*p++);
         }
}

void SenorVotagleSample(void)
{       
       
        ADC_CONTR|=0x88;                        //启动ADC转换
        delay(2);
        while((ADC_CONTR&0x10)==0);        //等转换结束
        ADC_CONTR&=0x6F;                          //关闭AD转换
        ADC_Vaule=(unsigned int)ADC_RES<<8+ADC_RESL;        //取结?                                        
}
void main()
{
   // unsigned char i=8,string[]={1,2,3};
        InitAllPer();                 //初始化所有外设
        while(1)
         {
                
        //        UsartSendString(string);
                SenorVotagleSample();                        //三轴加速度输出采样
//                UsartSendChar(ADC_Vaule);
        //        UsartSendChar(ADC_Vaule>>8);
               
         
         }       

}

使用特权

评论回复
10
xyz549040622| | 2014-3-12 22:17 | 只看该作者
        P1ASF=0x11;                                //P1口都不当成AD口
手册上说首先要将这个初始化为0,你这都是0?

使用特权

评论回复
11
程序会不会|  楼主 | 2014-3-12 22:20 | 只看该作者
xyz549040622 发表于 2014-3-12 22:17
P1ASF=0x11;                                //P1口都不当成AD口
手册上说首先要将这个初始化为0 ...

哈哈 不好意思,这个是我想看看正常的AD能不能用的 忘了改回来了 改为0也是没用的,

使用特权

评论回复
12
xyz549040622| | 2014-3-12 23:15 | 只看该作者
AD使用第九通道的的初始化不对,给你看看官网的例程
        EADC=0;                                        //禁止ADC中断
        ADC_RES=0;
        ADC_RESL=0;
这都是多余的

使用特权

评论回复
13
xyz549040622| | 2014-3-12 23:15 | 只看该作者

这才是使用第九通道的初始化

使用特权

评论回复
14
xyz549040622| | 2014-3-12 23:16 | 只看该作者
然后直接读取即可

使用特权

评论回复
15
程序会不会|  楼主 | 2014-3-12 23:39 | 只看该作者
xyz549040622 发表于 2014-3-12 23:16
然后直接读取即可

感谢版主耐心回答,版主贴出来的我都看过!一开始我也怀疑是配置错误,特意重新建了个工程,代码基本一样如下:
#include "STC15F2K60S2.h"
#include "intrins.h"

#define ADC_POWER 0x80
//#define ADC_RES 0x10
#define ADC_START 0x08
#define ADC_FLAG 0x10
#define ADC_SPEEDLL 0x00
#define ADC_SPEEDL 0x20
#define ADC_SPEEDH 0x40
#define ADC_SPEEDHH 0x60
void Delay(unsigned int count)
{
        unsigned int Temp;
        while(count--)
         {
                 Temp=5000;
                while(Temp--);
         }
}

void InitADC()
{
        P1ASF=0x00;
        ADC_RES=0x00;
        ADC_CONTR=ADC_POWER|ADC_SPEEDLL;
        Delay(9);   //怀疑时间不够自己加的
}
void Get()
{
        ADC_CONTR=ADC_POWER|ADC_SPEEDLL|0|ADC_START;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        while(!(ADC_CONTR&ADC_FLAG));   
        ADC_CONTR&=~ADC_FLAG;  //下面的代码没加,就想看AD能不能转换成功 结果还是实在WHILE里面

}
void main(void)
{
          InitADC();
        while(1)
         {
                 Get();         
         }

}
硬件上几乎没东西,就是P1.0到P1.3接到了三轴加速度的输出,现在怀疑是不是 初始化的时候不能接东西,不过按理说应该不会,因为P1口都没当AD口用,还有怀疑时钟频率和采样周期之间有没有什么要求,在手册没见到这方面的描述!

使用特权

评论回复
16
xyz549040622| | 2014-3-13 07:30 | 只看该作者
和手册上一模一样都没反应?你把官网最原始得程序烧进去,如果真没反应的话,怀疑你的硬件吧!或者这样试试,挨个检测你每个寄存器是否都写成功

使用特权

评论回复
17
程序会不会|  楼主 | 2014-3-13 13:01 | 只看该作者
xyz549040622 发表于 2014-3-13 07:30
和手册上一模一样都没反应?你把官网最原始得程序烧进去,如果真没反应的话,怀疑你的硬件吧!或者这样试试 ...

今晚检查了半天  发现是编程器上的供电电压太低 只有2.2V  现在外接了一个3.3V 能正常工作了 坑人的编程器

使用特权

评论回复
评论
autopccopy 2014-3-13 15:44 回复TA
天啊,又是电压过低、没接电源、接触不良、短路等低级错误!!! 
18
coody| | 2014-3-13 14:56 | 只看该作者
编程器上的供电电压太低?你输入多高电压?LDO的压差多少?

使用特权

评论回复
19
程序会不会|  楼主 | 2014-3-13 15:49 | 只看该作者
程序会不会 发表于 2014-3-13 13:01
今晚检查了半天  发现是编程器上的供电电压太低 只有2.2V  现在外接了一个3.3V 能正常工作了 坑人的编程 ...

恩 是的 自己有点死脑筋,认为硬件上没什么东西 一直在扣程序,涨姿势了

使用特权

评论回复
评论
ningling_21 2014-3-13 16:59 回复TA
遇到问题时,应该先硬件后软件的顺序去解决... 
20
gnhxsk| | 2014-10-3 21:40 | 只看该作者
在陀螺仪上怎么用啊?

使用特权

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

本版积分规则

46

主题

443

帖子

5

粉丝