地狱魔音 发表于 2018-5-2 16:32:19

关于ADC单次转换模式需要复位两次的问题

本帖最后由 地狱魔音 于 2018-5-3 09:59 编辑

各位前辈,本人新手,想做一个延时开通开关,延时时间由一个电位器通过AD转换来决定,电位器是100K,两端接VCC的3.3V和GND,中间抽头接AIN3,主控芯片是STM8S103F3,内部默认时钟。
问题:上电,读取ADC数据,根据读到数据延时一段时间,IO口输出高电平开通开关,这步没问题,然后我调节电位器改变延迟时间,重新复位,延迟时间竟然跟原来一样,没变,但是当我再一次复位之后,时间改变了。
好奇怪,为什么要第二次复位才会生效,望前辈解惑,非常感谢!:o
下面是主函数,为了方便检测,先把开关放到死循环里面了,实际我只要开关一次就够了。
main()
{
         unsigned int TEMP,TEMPL,TEMPH;
         ADC_INIT();
         ADC_CSR = 0x03; // 选择通道AIN3
   ADC_CR1|= 0x01; // 再次将CR1寄存器的最低位置1使能ADC转?
         while((ADC_CSR&0x83)==0); // 等待ADC结束?
         TEMPL= ADC_DRL;
         TEMPH= ADC_DRH;
         TEMPH= TEMPH<<8;
         TEMP=TEMPL+TEMPH;
         PA_DDR=0x08;
         PA_CR1=0x08;
         PA_CR2=0x00;
         while(1)
         {
               PA_ODR = 0x08;
               Delayms(1000+(TEMP*2));
               PA_ODR = 0x00;
               Delayms(1000);
}

地狱魔音 发表于 2018-5-2 17:06:52

自顶一个:P

す疯Ⅱ恒す 发表于 2018-5-2 18:05:52

ADC初始化里面是怎么样的?是否使用了ADC校准?IO的配置是否正确?

feixiang20 发表于 2018-5-2 22:38:41

ADC完成一次转换之后是不是就自动开始下一次转换,不需要再次启动ADC的工作,看看设置是否异常,是不是模式出错循环问题或代码重复呢。

地狱魔音 发表于 2018-5-3 08:43:44

す疯Ⅱ恒す 发表于 2018-5-2 18:05
ADC初始化里面是怎么样的?是否使用了ADC校准?IO的配置是否正确?

先谢谢了,初始化函数如下,ADC输入IO口没有另外配置,应该是默认悬浮输入的,校准不知道怎么搞:P
void ADC_INIT(void)//ADC初始化
{
ADC_CR2 = 0x08;// A/D结果数据右对齐
        ADC_CR1 = 0x01;// ADC时钟=主时钟/2=1MHZ
               // ADC转换模式=单次
               // 启动ADC转换
ADC_TDRL=0x20;

}

地狱魔音 发表于 2018-5-3 08:46:08

feixiang20 发表于 2018-5-2 22:38
ADC完成一次转换之后是不是就自动开始下一次转换,不需要再次启动ADC的工作,看看设置是否异常,是不是模式 ...

多谢前辈点评,我设置了单次转换模式,初始化代码见上楼,帮忙看看有没有问题,谢谢

す疯Ⅱ恒す 发表于 2018-5-3 09:18:38

地狱魔音 发表于 2018-5-3 08:43
先谢谢了,初始化函数如下,ADC输入IO口没有另外配置,应该是默认悬浮输入的,校准不知道怎么搞
void A ...

我觉得你应该配置好才启动ADC转换。但是你初始化第二句话就已经启动转换了,但是通道,单次模式都还没配置。你可以参考一下官方的例程。

地狱魔音 发表于 2018-5-3 09:58:43

す疯Ⅱ恒す 发表于 2018-5-3 09:18
我觉得你应该配置好才启动ADC转换。但是你初始化第二句话就已经启动转换了,但是通道,单次模式都还没配 ...

我试了,一开始禁止启动,初始化选通道之后再启动,还是不行,不过,我得到了启发,在后面启动转换后加了个延迟就OK了,非常感谢!:D

sssdd 发表于 2018-5-9 09:25:56

应该是AD转换时钟设置有问题。默认内时钟16M你确定是1M没错?
另外,参考单次ADC转换:
void ADC_one(void)
{//只做一次ADC 数据放在ADC_Value 访问 ADC_Value.twobytes
    ADC1->CSR&= 0x7F;//EOC=0
    ADC1->CR1|= 0x01;//开启一次转换 ADON=1
    while(!(ADC1->CSR&0x80));//EOC为0就一直循环
    ADC_Value.part.low =ADC1->DRL;
    ADC_Value.part.high=ADC1->DRH;
}

xiajintaord 发表于 2018-5-9 09:47:12

地狱魔音 发表于 2018-5-3 09:58
我试了,一开始禁止启动,初始化选通道之后再启动,还是不行,不过,我得到了启发,在后面启动转换后加了 ...

ADC_TDRL=0x20;
在这句之后加的延迟吗?
为什么呢?
页: [1] 2
查看完整版本: 关于ADC单次转换模式需要复位两次的问题