打印

通道错位:阴魂不散,害人不浅

[复制链接]
5409|32
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
freefish|  楼主 | 2010-12-29 22:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
关于STM32的ADC在顺序扫描DMA传输模式下,容易出现通道错位的问题,已经是由来已久。在我做的产品中,由于用到7个通道,而注入模式只有4个寄存器(重点!),就采用了此模式。测试发现,在调试运行中打断运行后,重新开始运行的话非常容易出现通道错位。
看了坛子里的讨论,加上自己的总结,采取了自以为完美的措施:每次DMA传输结束后触发中断,计算结束后,对两个ADC都DEINIT,重新初始化和校准,然后对DMA也如法**制。为了避免抢资源,整个程序中只开了这一个中断。
经过几个月几千次的测试,没发现这个鬼影再出现。自以为得计,终于制服了这个阴魂。
昨天下午,来了位对我的东西极为感兴趣的客户经理,于是我给他讲:我的东西可以达到0.1%的测量精度,而且在一个通道满负荷时,不影响其他通道。那经理不相信我能用12位的ADC做到,于是拉出一匹来溜溜,看看是不是骡子。
经理要我加入零序电流通道,退出零序保护,把相电流保护动作值设定为2A电流0秒动作(满负荷100A),我很自信得照做了。当电流加到90A,数值显示稳定,其他三相电流没飘到0.02!刚要开口说话,继电器动作的声音出来了,LCD屏上立即跳出信息提示:C相速断保护动作,时间0.02秒。
登时被石化在当场!我很清楚,鬼影又出来了!C相上根本没接线,哪里来的电流啊。客户经理拍拍我,那眼神很分明:牛不是这么吹的 啊
杯具啊。窗外传来那英的歌:就这样被鬼征服,断送了自己的路,我的前景是模糊,我的选择是糊涂......
路还要走啊,查吧,很简单,在驱动继电器的语句上设定了断点,经过几十次试验就抓住了。果然,本该在零通道上的1866采样值,出现在了C上,而零通道上本该是1866的成了-1,经过滤波算法后,这个冲激值在全部频谱上叠加了一个等值的77(我的是24点算法),而且其影响要在24个采样点过后才消除,超过了设定值的三倍多,不动才怪!
改吧,顺序扫描是绝不能用了,继电保护的特点就是:出现一次问题,立即封门,再好也没人在买喽!
试着用注入通道,也很快改好了。可是跟UM上冲突的问题又来了:如前面重点所说,注入模式下只有四个DR寄存器,UM上的寄存器列表上也是四个,可测试中发现,ADC1和ADC2各有四个!如果总共有八个,昨天损失的客户,要冤死了哟!!!

究竟是几个,亲爱的ST啊,能清楚得说说吗???
沙发
freefish|  楼主 | 2010-12-29 22:41 | 只看该作者
经过示波器测量,DMA后的中断过程总共占据了245微秒的计算时间,而两次中断的时间间隔是833微秒 (20毫秒一个周波,采集24个点,两个点的间隔时间是833微秒)
因此不是因为中断过程重叠的原因。

使用特权

评论回复
板凳
香水城| | 2010-12-30 09:16 | 只看该作者
能给出一个测试程序可以重现你说的问题吗?

眼见为实,我想亲眼看看你说的情况。

使用特权

评论回复
地板
IJK| | 2010-12-30 10:25 | 只看该作者
能给出一个测试程序可以重现你说的问题吗?

眼见为实,我想亲眼看看你说的情况。
香水城 发表于 2010-12-30 09:16


对于这样的常见、悬而未决的问题(STM32 ADC DMA错位),建议香版给出1个可以工作的例子,应该比问客户要代码更加有效

使用特权

评论回复
5
freefish|  楼主 | 2010-12-30 11:05 | 只看该作者
不用贴代码这么麻烦了。

需要的答案是: 注入模式究竟有几个DR寄存器!!!ADC1和ADC2各有四个,还是这两个ADC公用这四个。根据UM说明,注入模式的JDR寄存器高十六位是无效的,只有低十六位有效,必然是无法跟顺序模式的那样ADC1用低16位,ADC2用高16位。

我的程序已经改了注入模式,再改回顺序模式去抓个图看看。
并不是经常错位,而是偶然的,很少出现。但出现一次就是难以挽回的后果。

使用特权

评论回复
6
午夜霓虹| | 2010-12-30 12:48 | 只看该作者
呵呵,这问题我以前也遇到过,不过后来没出现了,你的产品的编译器用的是哪个版本的,我现在倒是认为不是ST的问题,因为我升级编译器就没再出现了,而且以前出现是在调试的时候打断一下,然后再次扫描,就出现错位,呵呵。

在运行的时候还真是没碰到过。st的AD的精度做的确实不错,就是他的这个问题让人觉得不舒服,我把代码给过st的fae,但是等了好几个星期,都没有明确的答复。

楼主也就别再难为他们了。

使用特权

评论回复
7
午夜霓虹| | 2010-12-30 12:55 | 只看该作者
我觉得ST也应该有个说明,说明一下错位的原因和如何避免,楼主的代码也不妨再给他们分析分析,我那个给了没什么结果。

使用特权

评论回复
8
aueven| | 2010-12-30 16:05 | 只看该作者
请问楼主的ADC是用硬件触发还是软件触发的呢?
我现在也遇到这个问题,就是ADC的注入通道不够用。我想是DMA,就是怕通道错。

使用特权

评论回复
9
happya1| | 2010-12-30 16:14 | 只看该作者
关注,我也在用DMA ADC

使用特权

评论回复
10
午夜霓虹| | 2010-12-30 18:42 | 只看该作者
我看了一下,注入模式应该是两个ADC,分别有四个寄存器,不过我没实验,呵呵。

个人感觉还是楼主那里有问题,我用的也是DMA的模式,在正常仿真的时候确实出现过通过错位,但是真正的用起来还没出现过。

使用特权

评论回复
11
xsgy123| | 2010-12-30 18:52 | 只看该作者
楼主的标题挺吓人的:lol

使用特权

评论回复
12
freefish|  楼主 | 2010-12-30 19:40 | 只看该作者
本帖最后由 freefish 于 2010-12-30 19:44 编辑

如果是指示仪表,确实是发现不了的,仅仅一个数据异常,马上就过去了,也就是几十毫秒的事情,眼睛发现不了。但是这种保护设备是隐瞒不成的,它会立即动作,并记录下动作过程和所有数据来。
如十楼说说,ADC精度确实很高,很强大。但不知道为啥非要用这种怪异的方式。TI的DSP里ADC通道和寄存器是一一对应的,用了好多从没这等怪事。
不管怎样,DMA是坚决不用了,注入通道有几个算几个,先用上。进入ADC的JOE中断后,再重新设置ADC,把另外的通道设置上,软件触发一次,在等待ADC完成的过程中,计算刚才得到的数据。估算过,时间损失不了太多,也就是20个微秒吧。

注入通道究竟几个寄存器,ST的客服是不知道,是不愿说,还是要保密啊

使用特权

评论回复
13
ST_ARM| | 2010-12-31 09:29 | 只看该作者
C相上根本没接线-----是指对应的STM32引脚是悬空的吗?

ST的客服是不知道-----哪里的客服?深圳、上海、北京?

不过好像ST好像没有客服,只有FAE吧。

使用特权

评论回复
14
freefish|  楼主 | 2010-12-31 11:29 | 只看该作者
不是STM32引脚悬空,而是没接外加的电流量,STM32的板子是好的,只要把外接的电流量加上就正常了。

没知道的就算了,自己试吧。现在发现与买的不同批次的芯片有关系!上次演示用的设备继续不定时的错位,但是换了一台不同次购买的芯片做的设备,测试了几百次还没出问题。

纵观做保护的,国内比较大的南瑞继保,第一代第二代产品使用了INTEL芯片(80196和80296),最新的一代使用的是ADI的BF系列DSP;北京四方,第一代是日本三菱芯片,第二代是MOTOLOLA的MC68332,最新一代是飞思卡尔的冷火。国外的,法国ALSTOM使用的是TI的TMS320VC33

使用特权

评论回复
15
zhousd| | 2010-12-31 13:29 | 只看该作者
楼主用的是官方库?
ST的官方库有不少的BUG。
俺一开始使用STM32库的时候就中了招。后来把不得不把手册上的奇存器查了个底朝天。
核对ARM官方的手册,发觉ST数据手册上同样有一些让人不解的寄存器地址错误。
这过程浪费不少时间。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
freefish + 1
16
freefish|  楼主 | 2010-12-31 21:49 | 只看该作者
是用的官方库。本以为能快点上手呢。以前用TI的TMS320F2808也是用的TI的库,没任何问题。
谢谢楼上的朋友!

使用特权

评论回复
17
zhousd| | 2011-1-3 18:04 | 只看该作者
stm32官方库从2。0版到最新的3。4版,所提供的comtex-M3公共部分的底层驱动设置都存在一些问题。
但是这好象跟ST官方的关系不大。那些CM3的公共部分是每个用MCU的编程人员都必需掌握的技术。

在此忠告一下:不喜欢底层寄存器编程的人肯定会掉进那个有可能至命的BUG。

使用特权

评论回复
18
jinjing999| | 2011-1-4 09:57 | 只看该作者
楼主为什么不用规则通道?上电就配好DMA采集,以后运行就不用操作DMA,只需要采集够点数,直接进中断,把缓存区解析数据解析出来就可以。我也发现注入通道会出现错位问题。我采集10通道12800HZ的采集率,没有发现什么问题。

使用特权

评论回复
19
airwill| | 2011-1-4 11:53 | 只看该作者
这个问题, 半年之前, 我就提出了. 为什么过去这么长时间了, 还在要代码?
为什么还在要代码?
就库里提供的代码例子, 就可以测试呀.
问题是这个毛病是来得很突然! 我一直怀疑是 DMA 与总线仲裁的问题. 如果真是 MCU 内部设计问题, 我们应用人员是不容易给出准确重现的测试代码来的.

使用特权

评论回复
20
freefish|  楼主 | 2011-1-4 20:44 | 只看该作者
目前使用注入通道,进入定时器中断后软件启动ADC,一次采集4个,再重新改ADC的通道设置后启动再采集4个,没发现问题。至于四个还是八个,我可经不住折腾了,不再冒险做试验。等产品定型了,有空余时间再来测试吧。
19楼的朋友,注入通道一对一的寄存器,没用DMA, 也错位?真要这样,我这项目就死翘翘啦

使用特权

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

本版积分规则

21

主题

190

帖子

0

粉丝