关于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啊,能清楚得说说吗??? |