本帖最后由 地狱魔音 于 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); } |
先谢谢了,初始化函数如下,ADC输入IO口没有另外配置,应该是默认悬浮输入的,校准不知道怎么搞
void ADC_INIT(void)//ADC初始化
{
ADC_CR2 = 0x08;// A/D结果数据右对齐
ADC_CR1 = 0x01;// ADC时钟=主时钟/2=1MHZ
// ADC转换模式=单次
// 启动ADC转换
ADC_TDRL=0x20;
}
多谢前辈点评,我设置了单次转换模式,初始化代码见上楼,帮忙看看有没有问题,谢谢
我觉得你应该配置好才启动ADC转换。但是你初始化第二句话就已经启动转换了,但是通道,单次模式都还没配置。你可以参考一下官方的例程。
我试了,一开始禁止启动,初始化选通道之后再启动,还是不行,不过,我得到了启发,在后面启动转换后加了个延迟就OK了,非常感谢!
另外,参考单次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;
}
ADC_TDRL=0x20;
在这句之后加的延迟吗?
为什么呢?
有道理,跟时钟也有一定关系,默认时钟是2M
使能之后加个延迟,可能默认时钟慢,转换速度没那么快吧