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

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

[复制链接]
hjmhunter 提问时间: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个回答
hjmhunter 回答时间:2018-5-2 17:06:52
自顶一个
疯de_恒 回答时间:2018-5-2 18:05:52
ADC初始化里面是怎么样的?是否使用了ADC校准?IO的配置是否正确?
feixiang20 回答时间:2018-5-2 22:38:41
ADC完成一次转换之后是不是就自动开始下一次转换,不需要再次启动ADC的工作,看看设置是否异常,是不是模式出错循环问题或代码重复呢。
hjmhunter 回答时间: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;

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

多谢前辈点评,我设置了单次转换模式,初始化代码见上楼,帮忙看看有没有问题,谢谢
疯de_恒 回答时间:2018-5-3 09:18:38
地狱魔音 发表于 2018-5-3 08:43
先谢谢了,初始化函数如下,ADC输入IO口没有另外配置,应该是默认悬浮输入的,校准不知道怎么搞
void A ...

我觉得你应该配置好才启动ADC转换。但是你初始化第二句话就已经启动转换了,但是通道,单次模式都还没配置。你可以参考一下官方的例程。
hjmhunter 回答时间: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;
在这句之后加的延迟吗?
为什么呢?
hjmhunter 回答时间:2018-6-28 11:01:40
本帖最后由 地狱魔音 于 2018-6-28 11:04 编辑
sssdd 发表于 2018-5-9 09:25
应该是AD转换时钟设置有问题。默认内时钟16M你确定是1M没错?
另外,参考单次ADC转换:
void ADC_one(void) ...

有道理,跟时钟也有一定关系,默认时钟是2M
hjmhunter 回答时间:2018-6-28 11:03:13
xiajintaord 发表于 2018-5-9 09:47
ADC_TDRL=0x20;
在这句之后加的延迟吗?
为什么呢?

使能之后加个延迟,可能默认时钟慢,转换速度没那么快吧

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版