打印
[STM8]

AD转换-无**常运行

[复制链接]
1069|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Gareth|  楼主 | 2015-9-15 16:29 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
大神帮忙看看,调试的时候一直停留在 while(!(0x80&ADC_CSR))
#include"stm8s903k.h"
void AD_Init(void)
{
        ADC_CSR|=0x06;                                                        //状态寄存器
        ADC_CR1=0x00;                                                        //预分频;开关 频率fmaster/2
        ADC_CR2=0x30;                                                        //左对齐
}

unsigned char AD_C(unsigned char chanel)
{
        unsigned char ad_voltage;
        ad_voltage=0;
        ADC_CSR=chanel;
        ADC_CSR&=0x7F;
        ADC_CR1|=0x01;                                                //启动ADC
        while(!(0x80&ADC_CSR));//判断是否结束转换
        ad_voltage=ADC_DRH;
        ADC_DRL;
        return(ad_voltage);
}

void main()
{
        unsigned char PW_AD;
        PW_AD=0;
        AD_Init();
        while(1)
        {
                        PW_AD=AD_C(0x03);
        }
       
}
沙发
lirunze| | 2015-9-15 19:42 | 只看该作者
可能是大部分时间停留在这个位置吧

使用特权

评论回复
板凳
734774645| | 2015-9-15 20:38 | 只看该作者
一直转换不结束?有没有例程,你看看过程哪儿配置不对。

使用特权

评论回复
地板
bbapple| | 2015-9-15 21:18 | 只看该作者
while(1),,,这种写法不是很准确吧。。。。

使用特权

评论回复
5
Gareth|  楼主 | 2015-9-16 08:09 | 只看该作者
我在等待结束标志下面的语句,设置了断点,没办法执行到那里

使用特权

评论回复
6
爱好学习者| | 2015-9-16 11:47 | 只看该作者
没有清除转换结束标志位

使用特权

评论回复
7
爱好学习者| | 2015-9-16 11:50 | 只看该作者
void AD_Init(unsigned char channel)
{
       
        /*================================
          连续模式
        =================================*/

        ADC1 -> CSR = channel; // 打开设置通道
        ADC1 -> CR1 = 0x02; // 预分频为2.连续转换
        ADC1 -> CR2 = 0x00; //  左对齐
        ADC1 -> CR3 = 0x00; //
}
unsigned int AD_Result(unsigned char channel)
{
        unsigned char num = 0;
        unsigned int temp = 0;
        for(num = 0;num < 5;num++)
                                {
                                        AD_Init(channel);
                                        ADC1 -> CR1 |= 0X01;
                                        ADC1 -> CR1 |= 0X01;
                                        while((ADC1 -> CSR &0X80)== 0X00);
                                        ADC1 -> CSR &= 0X7F;
                                        temp += ADC1 -> DRH;
                                }
                                temp = temp/5;
    return temp;
}
你参考下

使用特权

评论回复
8
Gareth|  楼主 | 2015-9-16 14:28 | 只看该作者
爱好学习者 发表于 2015-9-16 11:50
void AD_Init(unsigned char channel)
{
       

感谢,你的连续两次启动解决了我的问题。
为什么一定要CR1启动2次才能解决问题呢?

使用特权

评论回复
9
爱好学习者| | 2015-9-16 14:50 | 只看该作者

使用特权

评论回复
10
Gareth|  楼主 | 2015-9-16 16:52 | 只看该作者
感谢,感谢,终于搞明白了

使用特权

评论回复
11
t446952352| | 2015-9-17 11:19 | 只看该作者
学习,学习了

使用特权

评论回复
12
598330983| | 2015-9-17 13:06 | 只看该作者
楼上的楼上果然是个高人,一眼就看出了问题的所在

使用特权

评论回复
13
qgmfly| | 2015-9-18 15:56 | 只看该作者
第一次启动ADC后,应该需要一点点延时来等待ADC时钟的建立,之后再置位ADON启动转换。

若有不同ADC通道的采样,在转换通道之前,先清除ADC1 -> CSR寄存器,再设置通道

使用特权

评论回复
14
zkn866| | 2015-9-25 21:40 | 只看该作者
学习了

使用特权

评论回复
15
quray1985| | 2015-9-26 07:16 | 只看该作者
那就是读出来的值不是0x80

使用特权

评论回复
16
尤彼卡| | 2015-9-28 10:00 | 只看该作者
9楼的解释很清楚啊,顶

使用特权

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

本版积分规则

3

主题

7

帖子

0

粉丝