搜索
bottom↓
回复: 28

PY32F002A的ADC有BUG,感觉像示波器交流耦合的,无法测直流

[复制链接]

出0入4汤圆

发表于 2024-2-27 11:58:52 来自手机 | 显示全部楼层 |阅读模式
本帖最后由 kundi 于 2024-2-27 13:55 编辑

我是仿照LL.库例子写的,这里是连续转换,如果改成单次转换就ADC数值没有变化。
现在情况就是,如果在调用时,任何已经选定的外部通道那里,接入一个电位器并扭动,ADC数值根本就没有什么变化,但是用万用表测量此ADC的管脚是正常变化的。但如果去掉电位器,接一根导线,并且用手捏着,ADC数值就会和捏的力度有关系(我这附近500米内有中波广播发射台,白天才工作)。
另外说明,把794行注释掉,才能有以上的现象,否则复位稳定后,ADC数值就保持一个最大数值(134 217 728),怎么都不变。
函数实现

初始化时的调用

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入475汤圆

发表于 2024-2-27 12:23:52 来自手机 | 显示全部楼层
描述一点不清楚
adc没变化是指一直为0还是某一个值不动了
照你说的接电位器不就是应该不动吗?除非你改变电位器位置,

出0入4汤圆

 楼主| 发表于 2024-2-27 12:25:58 来自手机 | 显示全部楼层
1a2b3c 发表于 2024-2-27 12:23
描述一点不清楚
adc没变化是指一直为0还是某一个值不动了
照你说的接电位器不就是应该不动吗?除非你改变电 ...

(引用自2楼)

就是不论怎么扭动电位器,几乎稳定在一个数值上

出0入25汤圆

发表于 2024-2-27 13:15:50 | 显示全部楼层
kundi 发表于 2024-2-27 12:25
就是不论怎么扭动电位器,几乎稳定在一个数值上
(引用自3楼)

兄台你先用 万用表测量一下 ad 的pin 在说吧。。。   

感觉 又是一起乌龙

出0入16汤圆

发表于 2024-2-27 13:49:07 | 显示全部楼层
你的电位器不会只接两个根线没有接电源或上拉吧?
用了几个项目了,是可以用的,只是ADC的某个输入超过VDD的话可能ADC各个通道都会有问题。

出0入4汤圆

 楼主| 发表于 2024-2-27 13:52:14 来自手机 | 显示全部楼层
rei1984 发表于 2024-2-27 13:15
兄台你先用 万用表测量一下 ad 的pin 在说吧。。。   

感觉 又是一起乌龙

(引用自4楼)

确实测试过此处电压,电位器扭动时有变化,实际通道正确,与规格书核对过了。
电位器是两端分别接3.3v和接地,中间接ADC的pin

出110入26汤圆

发表于 2024-2-27 14:35:46 | 显示全部楼层
程序的锅,启动转换就马上读状态位肯定不准了。

出0入4汤圆

 楼主| 发表于 2024-2-27 14:37:59 来自手机 | 显示全部楼层
本帖最后由 kundi 于 2024-2-27 14:45 编辑
Elex 发表于 2024-2-27 13:49
你的电位器不会只接两个根线没有接电源或上拉吧?
用了几个项目了,是可以用的,只是ADC的某个输 ...

(引用自5楼)


确实接了,也用万用表测过了。两端接电源和接地,中间接到ADC的输入

出0入75汤圆

发表于 2024-2-27 14:50:55 | 显示全部楼层
Read_ADC()里面启动转换后马上读EOS,只判断了一次,没有等转换完。

出0入4汤圆

 楼主| 发表于 2024-2-27 15:26:04 来自手机 | 显示全部楼层
Doding 发表于 2024-2-27 14:50
Read_ADC()里面启动转换后马上读EOS,只判断了一次,没有等转换完。
(引用自9楼)

我把读EOS放在一个while(!);的循环里面了,读出来是1才跳出来干下面的事,现象还是一样

出0入75汤圆

发表于 2024-2-27 15:42:40 | 显示全部楼层
kundi 发表于 2024-2-27 15:26
我把读EOS放在一个while(!);的循环里面了,读出来是1才跳出来干下面的事,现象还是一样 ...
(引用自10楼)

把if(LL_ADC_IsActiveFlag_EOCS(ADC1))改为while(!(LL_ADC_IsActiveFlag_EOCS(ADC1))),while里面再加一个超时检测,EOS需要先用LL_ADC_REG_SetFlagEndOfConversion设置好。

出0入4汤圆

发表于 2024-2-27 18:24:14 | 显示全部楼层
我在用这个芯片,adc没有这种问题的,楼主直接跑例程试试呗

出0入4汤圆

 楼主| 发表于 2024-2-28 09:36:24 来自手机 | 显示全部楼层
carefree1986 发表于 2024-2-27 18:24
我在用这个芯片,adc没有这种问题的,楼主直接跑例程试试呗
(引用自12楼)

试了两块板,发现ADC有些例子程序不行,读外部ADC通道的就不行,包括ADC_SingleConversion_AWD,ADC_SingleConversion_TriggerTimerIT,灯该闪烁的不闪,串口无输出。但是测VCC电压和内部温度传感器的例子没问题。

出0入0汤圆

发表于 2024-2-28 09:53:18 | 显示全部楼层


为啥会这么自信?   

出0入4汤圆

 楼主| 发表于 2024-2-28 10:22:30 来自手机 | 显示全部楼层
Doding 发表于 2024-2-27 15:42
把if(LL_ADC_IsActiveFlag_EOCS(ADC1))改为while(!(LL_ADC_IsActiveFlag_EOCS(ADC1))),while里面再加一 ...
(引用自11楼)

我发现我用的库函数里面,没有找到你说的这个

出0入75汤圆

发表于 2024-2-28 10:31:25 | 显示全部楼层
kundi 发表于 2024-2-28 10:22
我发现我用的库函数里面,没有找到你说的这个
(引用自15楼)

我没有你的库,对着芯片手册,从头查一下初始化程序,时钟和管脚配置都要查。

出0入16汤圆

发表于 2024-2-28 11:33:23 | 显示全部楼层
kundi 发表于 2024-2-27 14:37
确实接了,也用万用表测过了。两端接电源和接地,中间接到ADC的输入
(引用自8楼)

看看你选择的通道是否正确。如果你设置了很多个通道顺序转换时,只看单次转换结果EOC而不是看EOSEQ位的话可能就只读到其他通道的转换值了
你可以每次转换只设置一个指定的通道看看

出0入4汤圆

 楼主| 发表于 2024-2-28 13:55:47 来自手机 | 显示全部楼层
本帖最后由 kundi 于 2024-2-28 14:01 编辑
Elex 发表于 2024-2-28 11:33
看看你选择的通道是否正确。如果你设置了很多个通道顺序转换时,只看单次转换结果EOC而不是看EOSEQ位的话 ...
(引用自17楼)


我发现只设置读一个通道的,初始化GPIO时也只有那一个通道的管脚设置为模拟模式,还是一样的现象。
我现在都想私底下改用STC的了,反正和WCH一样,都是国产老牌子,用得熟。8位的在这都够用了,要求实现的内容简单,速率要求低。

出0入16汤圆

发表于 2024-2-28 14:11:14 | 显示全部楼层
kundi 发表于 2024-2-28 13:55
我发现只设置读一个通道的,初始化GPIO时也只有那一个通道的管脚设置为模拟模式,还是一样的现象。
我现 ...
(引用自18楼)

没看到你怎么选择通道的代码,它这个通道是按位来选择的,不是一个STM32那样的序数,不要搞错了

出0入4汤圆

 楼主| 发表于 2024-2-28 16:09:37 来自手机 | 显示全部楼层
Elex 发表于 2024-2-28 14:11
没看到你怎么选择通道的代码,它这个通道是按位来选择的,不是一个STM32那样的序数,不要搞错了 ...
(引用自19楼)

图中CHECK_POWER1在前面已经通过宏定义,定义到了ADC6,即LL_ADC_CHANNEL_6

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入16汤圆

发表于 2024-2-28 22:07:54 | 显示全部楼层
kundi 发表于 2024-2-28 16:09
图中CHECK_POWER1在前面已经通过宏定义,定义到了ADC6,即LL_ADC_CHANNEL_6
(引用自20楼)

这个LL_ADC_CHANNEL_6是啥?不要拿STM32 CUBE的定义直接来用,0x40才是PY32的CH6,而不是STM32里定义的 0x06

出0入4汤圆

 楼主| 发表于 2024-2-29 09:02:45 来自手机 | 显示全部楼层
Elex 发表于 2024-2-28 22:07
这个LL_ADC_CHANNEL_6是啥?不要拿STM32 CUBE的定义直接来用,0x40才是PY32的CH6,而不是STM32里定义的 0 ...
(引用自21楼)

这个是库里面给的,看头文件里面定义如下:(ADC_CHANNEL_6_NUMBER | ADC_CHANNEL_6_BITBITFIELD)

出0入16汤圆

发表于 2024-2-29 09:28:53 | 显示全部楼层
kundi 发表于 2024-2-29 09:02
这个是库里面给的,看头文件里面定义如下:(ADC_CHANNEL_6_NUMBER | ADC_CHANNEL_6_BITBITFIELD) ...
(引用自22楼)

  你设置的不是单次转换而是连续转换,
  LL_ADC_REG_SetContinuousMode(ADC1,LL ADC REG CONV CONTINUOUS);

  如果ADC正在转换时(ADSTART)是改变不了通道选择的,你设置的连续转换可能一直在AD转换状态,所以你操作切换通道是无效的,采样回来还继续是别的通道的数值。 你可以把上面那句改成下面的设置看看。
  LL_ADC_REG_SetContinuousMode(ADC1, LL_ADC_REG_CONV_SINGLE);

出0入4汤圆

 楼主| 发表于 2024-2-29 10:36:04 来自手机 | 显示全部楼层
Elex 发表于 2024-2-29 09:28
你设置的不是单次转换而是连续转换,
  LL_ADC_REG_SetContinuousMode(ADC1,LL ADC REG CONV CONTINUOU ...

(引用自23楼)

之前就已经是在通道选定后才开始转换的,而且中间还加了延时。现在改成你的单次转换后,就发现上电复位后,程序跑完一圈就死机了,也就是只转换了一次。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出110入26汤圆

发表于 2024-2-29 10:49:19 | 显示全部楼层
730行也有bug

出0入0汤圆

发表于 2024-2-29 10:57:03 | 显示全部楼层
建议楼主下次取标题时,加上“疑问”、“请教”之类的词,表明是自己遇到疑问问题。看了楼主这个标题,我还以为是某个大牛经过验证,证明了这款芯片有重大BUG,叫大家以后避开这款芯片。

出0入4汤圆

 楼主| 发表于 2024-2-29 11:14:45 来自手机 | 显示全部楼层

后来只改成其中一个通道被初始化为模拟端口了

出0入0汤圆

发表于 2024-2-29 14:13:39 | 显示全部楼层
楼主做技术的这么浮躁?

出0入4汤圆

 楼主| 发表于 2024-3-6 10:15:26 来自手机 | 显示全部楼层
已经解决
1.查询法一次只读取一个通道adc数值,要单次模式
2.进入while(1)之前,对adc到了参数初始化之后,再选择通道,然后才使能adc,最后开始转换
3.在一个函数(假如叫A)里(特别是中断响应函数),调用读取adc参数的数值的函数LL_ADC_REG_ReadConversionData12()后,应该把读取的数值先放到全局变量中,并不能马上紧随其后就通过串口输出(有人说是时序矛盾问题)。而是在A调用完了之后,才可以通过串口输出其数值。

所以我之前发现拿到的demo程序,其实可以说“误人子弟”(其实我拿到的时候就没有编译过,需要自己按F7就行rebuld),需要按以上方法修改才可以正常运行。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-2 21:41

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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