kundi 发表于 2024-2-27 11:58:52

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

本帖最后由 kundi 于 2024-2-27 13:55 编辑

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

初始化时的调用

1a2b3c 发表于 2024-2-27 12:23:52

描述一点不清楚
adc没变化是指一直为0还是某一个值不动了
照你说的接电位器不就是应该不动吗?除非你改变电位器位置,

kundi 发表于 2024-2-27 12:25:58

1a2b3c 发表于 2024-2-27 12:23
描述一点不清楚
adc没变化是指一直为0还是某一个值不动了
照你说的接电位器不就是应该不动吗?除非你改变电 ...
(引用自2楼)

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

rei1984 发表于 2024-2-27 13:15:50

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

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

感觉 又是一起乌龙

Elex 发表于 2024-2-27 13:49:07

你的电位器不会只接两个根线没有接电源或上拉吧?{:titter:}
用了几个项目了,是可以用的,只是ADC的某个输入超过VDD的话可能ADC各个通道都会有问题。

kundi 发表于 2024-2-27 13:52:14

rei1984 发表于 2024-2-27 13:15
兄台你先用 万用表测量一下 ad 的pin 在说吧。。。   

感觉 又是一起乌龙
(引用自4楼)

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

kinoko 发表于 2024-2-27 14:35:46

程序的锅,启动转换就马上读状态位肯定不准了。

kundi 发表于 2024-2-27 14:37:59

本帖最后由 kundi 于 2024-2-27 14:45 编辑

Elex 发表于 2024-2-27 13:49
你的电位器不会只接两个根线没有接电源或上拉吧?
用了几个项目了,是可以用的,只是ADC的某个输 ...
(引用自5楼)

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

Doding 发表于 2024-2-27 14:50:55

Read_ADC()里面启动转换后马上读EOS,只判断了一次,没有等转换完。

kundi 发表于 2024-2-27 15:26:04

Doding 发表于 2024-2-27 14:50
Read_ADC()里面启动转换后马上读EOS,只判断了一次,没有等转换完。
(引用自9楼)

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

Doding 发表于 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设置好。

carefree1986 发表于 2024-2-27 18:24:14

我在用这个芯片,adc没有这种问题的,楼主直接跑例程试试呗

kundi 发表于 2024-2-28 09:36:24

carefree1986 发表于 2024-2-27 18:24
我在用这个芯片,adc没有这种问题的,楼主直接跑例程试试呗
(引用自12楼)

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

womenhome 发表于 2024-2-28 09:53:18



为啥会这么自信?   {:lol:}

kundi 发表于 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楼)

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

Doding 发表于 2024-2-28 10:31:25

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

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

Elex 发表于 2024-2-28 11:33:23

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

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

kundi 发表于 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位的在这都够用了,要求实现的内容简单,速率要求低。

Elex 发表于 2024-2-28 14:11:14

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

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

kundi 发表于 2024-2-28 16:09:37

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

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

Elex 发表于 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

kundi 发表于 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)

Elex 发表于 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);

kundi 发表于 2024-2-29 10:36:04

Elex 发表于 2024-2-29 09:28
你设置的不是单次转换而是连续转换,
LL_ADC_REG_SetContinuousMode(ADC1,LL ADC REG CONV CONTINUOU ...
(引用自23楼)

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

kinoko 发表于 2024-2-29 10:49:19

730行也有bug

jemmy 发表于 2024-2-29 10:57:03

建议楼主下次取标题时,加上“疑问”、“请教”之类的词,表明是自己遇到疑问问题。看了楼主这个标题,我还以为是某个大牛经过验证,证明了这款芯片有重大BUG,叫大家以后避开这款芯片。

kundi 发表于 2024-2-29 11:14:45

kinoko 发表于 2024-2-29 10:49
730行也有bug
(引用自25楼)

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

bone 发表于 2024-2-29 14:13:39

楼主做技术的这么浮躁?

kundi 发表于 2024-3-6 10:15:26

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

所以我之前发现拿到的demo程序,其实可以说“误人子弟”(其实我拿到的时候就没有编译过,需要自己按F7就行rebuld),需要按以上方法修改才可以正常运行。
页: [1]
查看完整版本: PY32F002A的ADC有BUG,感觉像示波器交流耦合的,无法测直流