你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
地狱魔音 提问时间:2018-5-2 16:32 /
本帖最后由 地狱魔音 于 2018-5-3 09:59 编辑

各位前辈,本人新手,想做一个延时开通开关,延时时间由一个电位器通过AD转换来决定,电位器是100K,两端接VCC的3.3V和GND,中间抽头接AIN3,主控芯片是STM8S103F3,内部默认时钟。
问题:上电,读取ADC数据,根据读到数据延时一段时间,IO口输出高电平开通开关,这步没问题,然后我调节电位器改变延迟时间,重新复位,延迟时间竟然跟原来一样,没变,但是当我再一次复位之后,时间改变了。
好奇怪,为什么要第二次复位才会生效,望前辈解惑,非常感谢!
下面是主函数,为了方便检测,先把开关放到死循环里面了,实际我只要开关一次就够了。
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);
}

收藏 评论11 发布时间:2018-5-2 16:32

举报

11个回答
地狱魔音 回答时间:2018-5-2 17:06:52
自顶一个
す疯Ⅱ恒す 回答时间: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口没有另外配置,应该是默认悬浮输入的,校准不知道怎么搞
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了,非常感谢!
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;
在这句之后加的延迟吗?
为什么呢?
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版