找回密码
 立即注册
查看: 4269|回复: 23

ADC的电源控制是不是不能始终保持打开?

[复制链接]

46

主题

108

回帖

604

积分

高级会员

积分
604
发表于 2023-3-25 00:24:41 | 显示全部楼层 |阅读模式
本帖最后由 sky999 于 2023-3-25 00:29 编辑

ADC_CONTR=0X80;我上电就打开了电源控制,而且读取过程中也没有关闭他,但是我发现,只要每次读ADC,不再次打开电源控制位,就有各种各样的问题,而且还得在后面加几ms延时,,,,转换的过程中,好像会影响到串口收发数据,是什么原因
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:56
  • 最近打卡:2025-05-03 10:05:34

718

主题

1万

回帖

1万

积分

管理员

积分
15646
发表于 2023-3-25 07:41:36 | 显示全部楼层
直接判你你自己的问题,请使用 STC-USB Link1D 这个专业仿真工具来仿真调试,
不要在那猜
1.png
2.png
3.png
1.png
2.png




  • 打卡等级:偶尔看看III
  • 打卡总天数:56
  • 最近打卡:2025-05-03 10:05:34

718

主题

1万

回帖

1万

积分

管理员

积分
15646
发表于 2023-3-25 09:21:53 | 显示全部楼层
  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12081
发表于 2023-3-25 12:32:58 | 显示全部楼层
实际跟你的说法相反,只要不睡眠,ADC电源始终打开是最好的。一旦关闭过ADC电源,再次打开,要延时至少1ms才启动ADC转换。
楼主可以直接测试STC的官方例程。

46

主题

108

回帖

604

积分

高级会员

积分
604
发表于 2023-3-26 08:03:41 | 显示全部楼层
梁*** 发表于 2023-3-25 12:32
实际跟你的说法相反,只要不睡眠,ADC电源始终打开是最好的。一旦关闭过ADC电源,再次打开,要延时至少1ms ...

怪事,因为我用了20个ADC口,开机就给ADC电源打开,for循环读10个,前4个是正常的,后16个全是错的,但是只要我在读ADC的前面,再加个打开ADC电源,并且加6ms延时,就一定是正确的,这是不是电源电流不够?

点评

我们的MCU最多15个输入,你怎么有20个?  详情 回复 发表于 2023-3-26 11:17
  • 打卡等级:偶尔看看III
  • 打卡总天数:56
  • 最近打卡:2025-05-03 10:05:34

718

主题

1万

回帖

1万

积分

管理员

积分
15646
发表于 2023-3-26 10:36:30 | 显示全部楼层
把你原理图的PDF发上来,大家好帮你
  • 打卡等级:偶尔看看III
  • 打卡总天数:51
  • 最近打卡:2025-05-02 10:07:51

73

主题

5883

回帖

1万

积分

超级版主

积分
12081
发表于 2023-3-26 11:17:19 | 显示全部楼层
sky*** 发表于 2023-3-26 08:03
怪事,因为我用了20个ADC口,开机就给ADC电源打开,for循环读10个,前4个是正常的,后16个全是错的,但是 ...

我们的MCU最多15个输入,你怎么有20个?

46

主题

108

回帖

604

积分

高级会员

积分
604
发表于 2023-3-26 14:08:23 | 显示全部楼层
梁*** 发表于 2023-3-26 11:17
我们的MCU最多15个输入,你怎么有20个?

对哦,我搞错了:L

46

主题

108

回帖

604

积分

高级会员

积分
604
发表于 2023-3-26 14:12:28 | 显示全部楼层
u16 READADC(u8 i)
{
u16 k;
                        ADC_RES=0;
                        ADC_RESL=0;
                        ADC_CONTR |= 0x08+i;
                        ADCCFG=0X02;                //低4位是时钟频率
                        ADCEXCFG=0X07;               
                        
                        ADC_CONTR |= 0x40;                      //启动AD转换
                        _nop_();
                        _nop_();
                        while (!(ADC_CONTR & 0x20));            //查询ADC完成标志               
                        ADC_CONTR &= ~0x20;                     //清完成标志                        
                        ADC_CONTR = 0x80; //---------------------------------------------------如果少了这句,程序就会一直错
                        Delay1ms(1);

                        k=k+((WORD)ADC_RES<<4)+((WORD)ADC_RESL>>4);
return k;
}

ADC_CONTR = 0x80;这句在程序上电初始化的时候就已经写过了,但是上面这个函数,读一遍之后,末尾如果不再次打开电源位,读出来的结果在5次后就都是错的





点评

ADC_CONTR |= 0x08+i; 这句错误,导致你读几个通道之后,就全部是读15通道了。 用该是这样: ADC_CONTR &= 0x90; ADC_CONTR |= 0x08+i; 或者 ADC_CONTR |= i;  详情 回复 发表于 2023-3-26 15:25
  • 打卡等级:偶尔看看III
  • 打卡总天数:56
  • 最近打卡:2025-05-03 10:05:34

718

主题

1万

回帖

1万

积分

管理员

积分
15646
发表于 2023-3-26 14:33:27 | 显示全部楼层
具体哪个型号的MCU我们给你个完整的演示程序参考
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-3 12:40 , Processed in 0.173308 second(s), 106 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表