newlined 发表于 2023-11-6 11:28:26

今天 关于ADC,遇到一个奇怪的问题【已解决】

本帖最后由 32位8051-STCAI 于 2023-11-9 15:07 编辑

这个程序是别人以前写的,用ADC来区分1.54V以上和1.48V一下的直流电压信号,精度要求不高,只用了ADC结果寄存器的高八位。我现在做维护,做些修修改改的工作,在STC8H3K32S2上跑,程序如下:



神农鼎 发表于 2023-11-6 13:24:36

先单独用 STC 的测试程序测试,按如下线路图测试











gentleman 发表于 2023-11-6 13:25:43


有的芯片没有那么多通道


newlined 发表于 2023-11-6 14:59:10

本帖最后由 newlined 于 2023-11-6 15:00 编辑

gentleman 发表于 2023-11-6 13:25
有的芯片没有那么多通道
谢谢您的回复,在8H1K24上跑时,AD口已经改为P0.0,相应的语句已经改为
MOV                ADC_CONTR,#11001000B                        ;打开P0.0口A/D
这个程序识别1.54V没有问题,不知道为什么不能识别1.48V,我以为多半是我的程序有问题,
但我不知道为什么在8H3K32S2上跑正常,一个子程序,我复制过来的,只是AD口的地址改了下。


newlined 发表于 2023-11-6 15:00:56

神农鼎 发表于 2023-11-6 13:24
先单独用 STC 的测试程序测试,按如下线路图测试

谢谢您的回复,我仔细看下。

神农鼎 发表于 2023-11-6 15:14:00

你要贴出你的原理图,大家才好帮你分析到位

梁工 发表于 2023-11-6 17:22:07

楼主程序判断2个点ADC值相差3,并且没有任何滤波措施,所以一点干扰或误差,就会导致错误。
并且ADC转换也不规范,应参考官方例程修改。
楼主应该使用10位或12位ADC,这样两个判断点的ADC能拉开比较大的距离,适当使用合理的数字滤波,避免干扰导致误判。
楼主可以下载官方例子测试,串口直接观察ADC值。

newlined 发表于 2023-11-7 14:43:53

梁工 发表于 2023-11-6 17:22
楼主程序判断2个点ADC值相差3,并且没有任何滤波措施,所以一点干扰或误差,就会导致错误。
并且ADC转换也 ...

谢谢梁工的回复,您说的“适当使用合理的数字滤波,避免干扰导致误判”提醒了我,我看STC8H的手册,在STC8H8K64U 系列 B/C/D等 版本中,有一个ADCEXCFG寄存器,可以设定多次转换功能,然后取平均值,但我看STC8H1K24,好像没有这个功能?我不知道您说的是不是这个功能?如果不是请具体说下,我再尝试。原来的硬件和软件已经用了10多年了,我也不好过多修改,尤其是您说的AD转换,我现在用了多次AD取值的办法,可以区分出1.54V和1.48V了。

神农鼎 发表于 2023-11-7 14:51:08

讨论ADC, 你应该贴出你的 原理图的 PDF, 或者清晰的原理图图片,如我发的

newlined 发表于 2023-11-7 14:55:30

神农鼎 发表于 2023-11-6 15:14
你要贴出你的原理图,大家才好帮你分析到位

原理图很简单,功能是检测充电电池的电压,充电时高于8V(经电阻分压变为1.54V)则停止充电,低于7.6V(经电阻分压变为1.48V)则停止充电。P0.0接电池的正极,AD的参考电压是跟VCC接一起,是5V,对时间要求不高,检测到高于8V,几秒,几分钟后再动作都可以。经过梁工的提示,我修改了程序,暂时可以了,我正在测试,如果能通过,就好了,如果不行,在上原理图,请您和大家帮忙,非常感谢。
页: [1] 2
查看完整版本: 今天 关于ADC,遇到一个奇怪的问题【已解决】