打印

关于STM32 ADC用DMA采多通道时数据错位的问题New

[复制链接]
楼主: kingpower2018
手机看帖
扫描二维码
随时随地手机跟帖
41
kingpower2018|  楼主 | 2009-6-26 13:45 | 只看该作者 回帖奖励 |倒序浏览

ST公司解决不了的问题

ST公司解决不了的问题

使用特权

评论回复
42
wlq_9| | 2009-6-26 15:02 | 只看该作者

LZ自己都没整明白,别人怎么给你明白?
说真的,对LZ公司的研发能力表示怀疑.象这种干扰问题,如果整体设计上不把关,全部都压到CPU身上去,多半哪家的CPU都受不了.

使用特权

评论回复
43
ST_ARM| | 2009-6-26 16:12 | 只看该作者

我对顶楼的软件设计思路的理解。

楼主的描述:
DMA错位问题:
关于采样处理:
1.    小表采ADC1的三个通道CH1/ CH2/ CH3,用DMA1传送到缓冲区ADCRegValue[3] 中;
2.    然后用定进器Tim1定时中断(50*128 Hz)从ADCRegValue[3]读数据到数组ADC_ConvertedTEMP[3*128]中;
3.    当128次采完时启用DMA2将ADC_ConvertedTEMP[3*128]传到ADC_ConvertedValue[3*128]数组中用于计算;
4.    正常情况下,ADCRegValue [3]内的数据应为CH1/ CH2/ CH3
ADC_ConvertedTEMP[3*128] 内的数据应为CH1/ CH2/ CH3 / CH1/ CH2/ CH3…….
ADC_ ConvertedValue [3*128] 内的数据应为CH1/ CH2/ CH3 / CH1/ CH2/ CH3…….

我的个人看法,不是很成熟,望大家批评指正:
    第二步中,定时从ADCRegValue[3]读数据到数组ADC_ConvertedTEMP[3*128]中,楼主能保证CPU读取ADCRegValue[3]时,DMA肯定不从ADC读数据填写到该数组里吗?

    我的建议是省去这一步,使用DMA将数据直接存储到ADC_ConvertedTEMP[3*128]中,当128次转换结束时,生产DMA传输结束中断,在中断中再启用DMA2将ADC_ConvertedTEMP[3*128]传到ADC_ConvertedValue[3*128]数组中用于计算。这样省去中间多余操作可能引起的不可预知的问题。

另外:
    关于STM32受现场90kW电动机干扰的问题,肯定不存在,我支持的客户中将STM32用在电梯控制箱里,紧挨着500Kw的电动机,STM32的ADC、DMA、Timer、SPI、I2C也稳定运行,没有任何问题。

使用特权

评论回复
44
kingpower2018|  楼主 | 2009-6-29 17:26 | 只看该作者

此路不通呀

按楼上说的方法我也试过,一样出现问题,只要干扰就有了

使用特权

评论回复
45
freefish| | 2009-6-29 22:10 | 只看该作者

问题没说清楚

仪器的数值显示错误,是短时间闪一下马上恢复正常还是一直是错的,如果一直是错的,还能变化吗?你用了什么算法?不同的算法在相同的数据下输出是不同的,这些不讲明白,没人能帮你。
如果使用积分算法做滤波,ADC不能运转了,TIMER启动的DMA就读到固定值,滤波后就是一个直流分量,交流量为0。只要还有显示,还能变化,ADC就是运转的,ADC就是一个比较的过程,受干扰后结果变化几倍是不可能的。
看你的描述,ADC是在连续转换模式,此方式不推荐使用。首先是功耗上升,结果是晶片局部发热,半导体器件对温度是很敏感的。如果只是实验还可以。
软件问题:你的ADC速度设置多少?如果是1M,每1微秒就是一次DMA!那要占多少总线时间?你的算法必然操作RAM,那么DMA期间CPU在空转,每20毫秒还有一次大的DMA,这些要考虑在内。在没有以上DMA打扰的情况下,你测试过整个计算程序的时间消耗吗?128点的算法在20毫秒内能计算完吗?如果算不完下一个DMA2是否把你当前点后的数据修改了?如果算不完,计算过程中禁止过DMA2吗?整个运算中的数据定义有无问题?计算中有数据溢出吗?有除0错吗?
如果以上问题都不存在,那么请把一段用于计算的128点数据发送出来,才可以判断是否一定是ADC的问题。方法很简单,智能测控肯定有通讯,写个调试程序,事先定义一个按键,在出现错显示的情况下按一下,CPU接到此键后停止DMA1和2,把所有缓冲区的数据包括ADC的缓冲通过通讯线发送出来,用电脑收一下,存起来就可以了。如果发现确实是ADC的数据不正常,没有按波形变化,就可以向ST兴师问罪了,如果是程序问题,还是静下心来,好好研究吧。
可以说一下我的测试结果:2层板,严格按照EMC有关要求布板,中心电平提高到1/2VREF,在ADC后减2048恢复波形数据,在交流无输入时,IAR下随机打断运行,可以看到大部分数据刷新变红,但数值漂动在-1~1之间,几百次试验仅出现过两次漂到2,对ADC精度无任何意见。
使用过各种恶劣手段对付此CPU,包括阳光暴晒,摸腿,拔8M晶体,多次出现IWDG复位,但未出现ADC数据失常问题。
我遇到的WWDG问题已经解决,正如香水城所说,是没看到调试画面就RST了。在使能WWDG后很短时间内,把它的时钟关闭,就可以停到正确的断点上了。喂狗不成的主要原因是窗口太小,离0X40太近了,没喂到狗就先RST了。目前已经用在了设备的调试程序中,运转正常。
关于最近的调试收获,可以告诉大家两点:一是IIC操作24C16时,一定要给SDA和SCL充足的高电平时间,否则操作不能成功。二是IWDG和WWDG也是如此,其中WWDG要短一点,但是也要在上电后四万次空循环操作后才能稳定。

使用特权

评论回复
46
bhsdlmj| | 2009-6-30 11:12 | 只看该作者

(*^__^*) 嘻嘻……

DMA错位问题:
关于采样处理:
1.    小表采ADC1的三个通道CH1/ CH2/ CH3,用DMA1传送到缓冲区ADCRegValue [3] 中;
2.    然后用定进器Tim1定时中断(50*128 Hz)从ADCRegValue [3]读数据到数组ADC_ConvertedTEMP[3*128]中;
3.    当128次采完时启用DMA2将ADC_ConvertedTEMP[3*128]传到ADC_ConvertedValue[3*128]数组中用于计算;
4.    正常情况下,ADCRegValue [3]内的数据应为CH1/ CH2/ CH3
ADC_ConvertedTEMP[3*128] 内的数据应为CH1/ CH2/ CH3 / CH1/ CH2/ CH3…….
ADC_ ConvertedValue [3*128] 内的数据应为CH1/ CH2/ CH3 / CH1/ CH2/ CH3…….
================================
把后三部分的程序都删除
只留下第一部分

看看还能不能正确收到???

使用特权

评论回复
47
kq800| | 2009-6-30 23:01 | 只看该作者

我也遇到过,不过现在解决了.

我也是,只要停止a/d后再启动a/d,就有可能错位。即使停止a/d后,重新初始dma也没用。主要是要关断a/d的dma位,并且同时关断cont,在一条语句完成。我是用的ADC1->CR2&=0xfffffefd;才行。开启用ADC->CR2|=0X102;才能不错位。为这个事我用了一周的时间。不知道对楼主有没有帮助。

使用特权

评论回复
48
kingpower2018|  楼主 | 2009-7-6 17:28 | 只看该作者

谢谢50楼

其实我们在没有强干扰条件下,一切正常,只是在强干扰下才出现数据错位.

使用特权

评论回复
49
kingpower2018|  楼主 | 2009-7-6 17:32 | 只看该作者

其实ADC的稳定性值得考虑?

我们用像49楼的方法,用一路ADC在强干扰也出现数据错误,跟本不是我要的数据

使用特权

评论回复
50
kingpower2018|  楼主 | 2009-7-7 10:33 | 只看该作者

请求支招

请求支招,请高手支招解决此问题.

使用特权

评论回复
51
wolver| | 2009-7-7 13:11 | 只看该作者

这个就不用高手了,学过模拟电路的农民都知道...

不是CPU的A/D问题(因为不干扰的时候是正常的),想办法解决电路板被干扰的问题才是正道

就软件处理来讲,你那算法也不好,如果不是CPU快,早死了...
我曾用AVR单片机在7.3728MHZ的工作频率下做4路电机的PWM调速,每路采样计算点为64个...
我当时的算法基本思想是(这公式高中就学过):Sn=Sn-1 + An,所以,每采到一个样点,都能计算出一个新的64阶平均值的新点;不需要等到采样够64点才开始处理,那是最不好的做法...

使用特权

评论回复
52
kingpower2018|  楼主 | 2009-7-7 17:06 | 只看该作者

ST呀

ST呀,没反应?

使用特权

评论回复
53
bhsdlmj| | 2009-7-7 17:12 | 只看该作者

这个问题太难了吧 估计ST的人不会

使用特权

评论回复
54
ST_ARM| | 2009-7-7 17:13 | 只看该作者

不是ST没反应

从深圳同事反馈回来的信息是:我们的同事到现场,对你的电路板的设计提出了一些改进性建议,可楼主依然我行我素,如此行事,我们该如何应对呢?

使用特权

评论回复
55
kingpower2018|  楼主 | 2009-7-7 17:37 | 只看该作者

已经按你们的建议改了呀

已经按你们的建议改了呀,没多大效果,也没提出一些有效的建议,我们都改板了,我们想你们能从自身CPU的ADC抗干扰上提一些有效的解决建议

使用特权

评论回复
56
香水城| | 2009-7-7 18:22 | 只看该作者

实在对不起,可能确如楼主44楼说的:ST公司解决不了的问题

我们的工程师对如何使用芯片在行,但对如何消除外部的干扰不在行,尽管我们也尽所能提出了不少建议。


其实还是那句话,在强干扰下企望MCU能不出错是很难的,必须做好外部的保护。举个例子:假定人的身体最多只能承受40摄氏度的温度,如果不加保护用上百度的高温去烤一个人,恐怕谁也受不了,即使是受过特殊训练的人。做芯片也是一样,自身的修炼固然重要,但外部保护更加重要。

使用特权

评论回复
57
电子白菜| | 2009-7-7 18:25 | 只看该作者

我也吹两句吧:

1.    小表采ADC1的三个通道CH1/ CH2/ CH3,用DMA1传送到缓冲区ADCRegValue [3] 中;
2.    然后用定进器Tim1定时中断(50*128 Hz)从ADCRegValue [3]读数据到数组ADC_ConvertedTEMP[3*128]中;

这两步似乎感觉不怎么爽,你叫我说出这里会有问题么?我也不确定,但如果自己用的话,一般就不这样了.
我宁愿是定时器中断后,就启动一次DMA(突发模式),然后再等DMA中断后,把ADCRegValue [3]数据读到ADC_ConvertedTEMP[3*128]中.这样算下来,效果和楼主的也差不多吧.

反正DMA这东西,我用有个原则,就是永远别在DMA向RAM放数据的时候随机地读这个RAM.尽管某些芯片会宣称这个临界问题不存在.但偶就是不会这么用.

想想,这个的确算是个CRITICAL哦,虽然不是软件的,呵呵~

另外呢,ADC值应该需要滤波吧.而且是中值滤波,也就是去掉一头一尾的最大最小,再作平均.这样就可以排除一些因干扰问题引起的变态数据了.

使用特权

评论回复
58
kq800| | 2009-7-7 20:30 | 只看该作者

adc必须一直连续转换吗?

如果不是,这样用软件排除那1次的干扰.

使用特权

评论回复
59
freefish| | 2009-7-7 21:42 | 只看该作者

感觉楼主的公司开发能力一般

已经说过了,连问题都描述不清楚,谁能帮你?
如果是干扰的问题造成ADC不准,那么干扰源是在连续不断的发出干扰脉冲吗?
在电机启动完毕后,你的表显示正常了吗?
如果只是一个点受了干扰,那么即使是在影响最大的45°角出现的,造成的干扰如果是把0xFFF干扰成了0,那么产生的当点积分后数据变化是1.414*0xFFF,那么在此数据窗口内的这次计算将受影响,其对幅值的影响为1.414*0xFFF/128,变化量为45的数值,就看你的满量程为多少,就可以判断影响有多大。但是单点或连续上百点的数值错误也不过影响两周波,仅40毫秒,错误数据一闪而过。如果错了后再也恢复不了正常,但显示还在变化,那就说明ADC还在转换。此时有办法处理,但不是根本办法,而是旁门左道了。
具体如下:如果您能保证3.3V的VDD不出现大的偏差(这点保证不了就是神仙也没办法了),硬件设计上用一个ADC通道采集VDD电压,如果采集的数据出现严重偏差,如连3V也不到了,就要考虑重置ADC了,您可以简单的RST,但是LCD要闪一下。也可以停止ADC和DMA,重新初始化再采集,连续几次不成就来一下RST.
希望能帮到你。
但是应该找到根源,对症下药才是解决问题的正路。

使用特权

评论回复
60
kingpower2018|  楼主 | 2009-7-13 16:22 | 只看该作者

其它ST你们自已好研究一下这CPU的ADC的稳定性吧

其它ST你们自已好研究一下这CPU的ADC的稳定性吧,别在这搞人身攻击了,好好解决客户问题才是真,我是说过了既是在实验做干扰,用静电枪晃几下(8KV),数据就错乱了,需且是一旦出错就回不来,除非上电复位.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则