[STM8] AD转换-无**常运行

[复制链接]
1279|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),,,这种写法不是很准确吧。。。。
 楼主| Gareth 发表于 2015-9-16 08:09 | 显示全部楼层
我在等待结束标志下面的语句,设置了断点,没办法执行到那里
爱好学习者 发表于 2015-9-16 11:47 | 显示全部楼层
没有清除转换结束标志位
爱好学习者 发表于 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;
}
你参考下
 楼主| Gareth 发表于 2015-9-16 14:28 | 显示全部楼层
爱好学习者 发表于 2015-9-16 11:50
void AD_Init(unsigned char channel)
{
       

感谢,你的连续两次启动解决了我的问题。
为什么一定要CR1启动2次才能解决问题呢?
爱好学习者 发表于 2015-9-16 14:50 | 显示全部楼层
 楼主| Gareth 发表于 2015-9-16 16:52 | 显示全部楼层
感谢,感谢,终于搞明白了
t446952352 发表于 2015-9-17 11:19 | 显示全部楼层
学习,学习了
598330983 发表于 2015-9-17 13:06 | 显示全部楼层
楼上的楼上果然是个高人,一眼就看出了问题的所在
qgmfly 发表于 2015-9-18 15:56 | 显示全部楼层
第一次启动ADC后,应该需要一点点延时来等待ADC时钟的建立,之后再置位ADON启动转换。

若有不同ADC通道的采样,在转换通道之前,先清除ADC1 -> CSR寄存器,再设置通道
zkn866 发表于 2015-9-25 21:40 | 显示全部楼层
学习了
quray1985 发表于 2015-9-26 07:16 | 显示全部楼层
那就是读出来的值不是0x80
尤彼卡 发表于 2015-9-28 10:00 | 显示全部楼层
9楼的解释很清楚啊,顶
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

7

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部