梁工
发表于 2025-4-1 12:46:00
main 发表于 2025-4-1 12:10
这是去年初发现的问题。后来病了,直到现在。我现在也没有能力复现了,所以也不能肯定就是真的问题,只能 ...
每次触发ADC转换,完成后停止转换,完成标志置1,如果允许ADC中断,则会进入中断。
所以,ADC是转换一次,值会触发一次中断,不会少也不会多。
用户群那么庞大,目前只有您遇到这个问题。用户遇到的问题,应该是程序处理的问题,可以参考官方例子去测试。也可以添加这样测试:定时器触发ADC间隔1ms(频率1000Hz),每次触发TrigCnt+1,ADC中断里AdcCnt+1,然后计数到1000次就串口发送一次TrigCnt和AdcCnt的值,可以测试至少1000万次(大约3小时),看看是否触发和中断次数一样。
我大量使用ADC做各种各种各样的应用,从未发现有不触发ADC还能进中断的,也从未发现会少进或多进中断的。
main
发表于 2025-4-1 15:44:55
梁工 发表于 2025-4-1 12:46
每次触发ADC转换,完成后停止转换,完成标志置1,如果允许ADC中断,则会进入中断。
所以,ADC是转换一次, ...
如果目前的芯片没做改进的话,按我的方法(看我的贴图表述)试试就能发现。
您说的方法,我目前也没法试了(病没好利索).按您的方法也应该能复现问题。您可以试试。但中断函数里要用当前官方文档的ADC_CONTR &=~0x20;来清中断标志(而不是~0x60)。应该会发现问题,进一步再试试ADC的供电开关是不是像我在楼上贴图里说的那样。用户群庞大也不一定会很快有人反映,微软的windows不前年才发现了DOS年代遗留至今的问题。
我重新说一下您提出的测试过程(我完成不了了):
让一次“完整ADC周期”在0.1毫秒以内(或合理的尽量快)。定时器触发ADC间隔10ms(频率100Hz),每次触发TrigCnt+1,ADC中断里AdcCnt+1,然后计数到1000次就串口发送一次TrigCnt和AdcCnt的值,不用测试1000万次;10秒后看效果,看看是否触发和中断次数一样。
要用“当前官方文档”的ADC_CONTR &=~0x20;来清中断标志
而不是 ADC_CONTR &=~0x60;来清中断标志
还可以试试在跳出中断前 ADC_CONTR &=~0x80;关ADC,看看什么结果。
----------------------
稍后我请ECBM的作者也过来说一下,一是 他确实花费精力也验证过的;二是 如果是我说的不对,也别给他造成误解和库的错误。
梁工
发表于 2025-4-1 16:18:03
main 发表于 2025-4-1 15:44
如果目前的芯片没做改进的话,按我的方法(看我的贴图表述)试试就能发现。
您说的方法,我目前也没法试了( ...
“ADC的供电开关”,做ADC转换一定要先打开ADC电源并延时至少1ms才启动ADC转换。
不打开ADC电源就启动ADC导致的任何问题都不值得讨论,因为这是错误操作。
main
发表于 2025-4-1 17:07:50
梁工 发表于 2025-4-1 16:18
“ADC的供电开关”,做ADC转换一定要先打开ADC电源并延时至少1ms才启动ADC转换。
不打开ADC电源就启动ADC ...
确实看以前程序确实都没注意到这一点。也许满足这个条件后能解决问题吧,等恢复后试试。
--------------------------------
但手册样例,也没这样等1ms啊{:4_248:}
梁工
发表于 2025-4-1 18:59:02
main 发表于 2025-4-1 17:07
确实看以前程序确实都没注意到这一点。也许满足这个条件后能解决问题吧,等恢复后试试。
---------------- ...
等1ms是为了等待模拟电路正常后,第一个采样值就是正常的。
如果不等待,开启ADC电源后马上启动ADC,也不会有问题,
只是这次的ADC读数不准确,因为模拟电路未稳定,
但是不会出现你说的中断多少的问题。