打印

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

[复制链接]
15664|25
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kingpower2018|  楼主 | 2009-4-7 09:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我们现在用到STM32的两种CPU STM32F101C8T6 和 STM32F103都出现相同的问题,ADC采样用DMA方式采集多个通道时出现数据通道错位的问题,一般情况下都是正常的,我们在实验室测试也没有问题,但是在客户现场用上一个多月后就会出现这种现象,我们的产品主要是电力测控,出现这种问题就很严重了,可能出现很大的事故,希望ST公司的的技术人员能及时给予我们帮助.

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…….


急!急!急!  (邱工13652373631)
沙发
computer00| | 2009-4-7 09:41 | 只看该作者

应该用定时器中断(或定时器事件触发)启动采样,DMA完成中断

使用特权

评论回复
板凳
香水城| | 2009-4-7 12:37 | 只看该作者

你的问题好像与硬件无关,应该是软件处理的问题

我有几个问题:

1)ADC的采样速率是多少?为什么要用定进器中断把数据从ADCRegValue[3]搬到ADC_ConvertedTEMP[3*128]中?这一步应该使用DMA1传送结束中断实现才对。

2)如果用定进器中断实现数据从ADCRegValue[3]传送到ADC_ConvertedTEMP[3*128]中,如何保证数据传送过程中没有正在进行的ADC采样?

3)如何保证DMA2将ADC_ConvertedTEMP[3*128]传到ADC_ConvertedValue[3*128]数组的过程中(你的描述3),没有正在进行的ADC采样(你的描述1),并且没有正在进行的定进器中断搬运数据(你的描述2)?

4)非正常情况下错位的结果是什么样的?


请问你在哪个城市?ST或ST代理商的哪个FAE负责支持你的?你可以通过站内短信高速我,谢谢。

使用特权

评论回复
地板
kingpower2018|  楼主 | 2009-4-7 14:54 | 只看该作者

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

ADC的时钟频率为9MHz,第个通道的采样时间为ADC_SampleTime_41Cycles5,为什么要用定进器中断把数据从ADCRegValue[3]搬到ADC_ConvertedTEMP[3*128]中呢?是因为我要根据外界的频率不断来调整我的定时器时间来采取数据,外界的频率不一定是50Hz,有可能为40Hz~70Hz的任意值,但我要保证一个周期采样128个点.
2、对于用定进器中断实现数据从ADCRegValue[3]传送到ADC_ConvertedTEMP[3*128]中,数据传送过程中没有正在进行的ADC采样,我不用管它,因为数据都是一样的,不管它是新的数据,还是上一次的数据。
3、如何保证DMA2将ADC_ConvertedTEMP[3*128]传到ADC_ConvertedValue[3*128]数组的过程中(你的描述3),没有正在进行的ADC采样(你的描述1),并且没有正在进行的定进器中断搬运数据(你的描述2),我们也不用管它,只要它在相同的地方,数据就是一样的,我也不用管它是新的数据,还是上一次的数据。

 

使用特权

评论回复
5
kingpower2018|  楼主 | 2009-4-7 14:57 | 只看该作者

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

我们是深圳的公司

使用特权

评论回复
6
computer00| | 2009-4-7 15:02 | 只看该作者

有点无语……这真是一个奇特的采样方法...

使用特权

评论回复
7
kingpower2018|  楼主 | 2009-4-7 15:04 | 只看该作者

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

非正常情况下错位的结果是ADCRegValue [3]内的数据为 CH2/ CH3/CH1 或 CH3/CH1/CH2
ADC_ConvertedTEMP[3*128] 内的数据应为CH2/ CH3/CH1/ CH2/ CH3/CH1…….
或 CH3/CH1/ CH2/ CH3/CH1/CH2/…….

使用特权

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

这2个DMA通道的优先级是如何设置的?

DMA1相对DMA2应该具有较高的优先级,这里是不是设置错误。怀疑是在DMA2传送数据时,正好碰上ADC采样需要DMA1的操作,但因为优先级的问题,ADC的数据没有及时地传送到ADCRegValue[3]中,造成了错位。


另外,根据5楼的描述,DMA1应该使用循环模式,连续不断地从ADC获取采样数据。同时DMA1可以直接把从ADC获取的数据传送到ADC_ConvertedTEMP[3*128]缓冲区中,省掉ADCRegValue[3]这个中间环节。最后定时地把ADC_ConvertedTEMP[3*128]的内容拷贝到ADC_ConvertedValue[3*128]数组中进行计算。

使用特权

评论回复
9
McuPlayer| | 2009-4-8 11:32 | 只看该作者

小板凳,学习

DMA是个好东西,我把原来的一些东西改到DMA下面。
CPU的空余时间更多了,得再多给些活给它干,不能让它闲着。

使用特权

评论回复
10
zouweichina| | 2009-4-8 13:41 | 只看该作者

回复Netjob

楼上,很明显吗?你是不是看出哪的问题了?分享下嘛

使用特权

评论回复
11
jinjing999| | 2009-4-8 15:28 | 只看该作者

呵呵,你的处理太复杂了

即使要用DMA,为什么还要用定时器中断去读数据,128点采样,你可以通过DMA放到一个数据空间里,用DMA传输完毕后,再去分解数据。如果你要不想停AD,再定义一个比较大的空间采样就可以了吗?
还有你要跟频率,直接用定时器捕捉频率就可以了,根据上个周期的电网信号频率来定下个电网频率的周期。况且电网信号一般不会很快波动,即时波动也只是测误差相对大一点。如果你是电网保护设备,这点波动根本是没有关系的

使用特权

评论回复
12
kingpower2018|  楼主 | 2009-4-8 16:05 | 只看该作者

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

不用定时器去读数据,我怎么样在一个周期波上采样均等的128个点呢?如果不用定时间器,我用DMA直接传128个采样数据不一定的我要的采样点数据,而且这128个采样点的时间周期是要根据输入的电网信号频率改变需改变的.

使用特权

评论回复
13
kingpower2018|  楼主 | 2009-4-8 16:11 | 只看该作者

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

不用定时器去读数据,我怎么样在一个周期波上采样均等的128个点呢?如果不用定时间器,我用DMA直接传128个采样数据不一定的我要的采样点数据,而且这128个采样点的时间周期是要根据输入的电网信号频率改变而改变的.
我的产品在一般情况下是正常的,而且在实验室通过了所有需要的测试项目,但在客户现场用上几个月后就出现数据错位

使用特权

评论回复
14
kingpower2018|  楼主 | 2009-4-8 16:18 | 只看该作者

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

现在基本要确认是干拢产生的数据通道错位,我们在实验室用20KV的静电水平耦合,大概几秒钟就出现数据通道错位.

使用特权

评论回复
15
computer00| | 2009-4-8 16:20 | 只看该作者

ADC的数据不是你去读的时候才采样的呀,控制时间的是启动

建议你参考我的程序吧,我直接用DMA加定时器采样的,44.1KBps的。
我的这个芯片是可以直接将定时器的比较信号启动ADC的。如果你的没有这个功能,那么在定时器中断中启动ADC即可。
启动后它就开始转换了,这时才是真正的采样,转换完成后,它会自动去触发DMA去读数据。当指定的数据个数达到时,
DMA会产生中断(或者你去查询也得),这时候就可以去处理这一些数据了。当然在数据处理之前,你可以先设置好
DMA,指向另外一个缓冲区,同时又采样了。

你要搞清楚这个关系:定时器是用来启动ADC的,而不是用来去读数据。ADC转换完毕会自动触发DMA读数据,DMA数据足够后,产生中断,处理数据。

https://bbs.21ic.com/club/bbs/showEssence.asp?id=10676

使用特权

评论回复
16
ijk| | 2009-4-8 17:11 | 只看该作者

出错情况要分清楚

  出错情况要分清楚:是只在在施加干扰时出错,还是干扰消失后仍然出错。
前一种情况或许可以忍受,后一种情况不能忍受、必须修正。

使用特权

评论回复
17
香水城| | 2009-4-8 22:23 | 只看该作者

16楼给出的信息是楼主位没有提到的,而这是一个非常关键的

18楼的问题是个实质问题,楼主如何看待这个问题呢?

使用特权

评论回复
18
jinjing999| | 2009-4-10 08:58 | 只看该作者

你说的意识是不是找不到一个周期数据啊?

采样数据后,只能说明你采集了电网信号数据,但是处理有好多种方法,你每次都从过零点计算,找过零点,不就是判断你的采样数据吗?
还有好多种方法,画一个正弦波,仔细找找规律,会有好多种方法。

使用特权

评论回复
19
smallfishyjt| | 2009-4-12 01:05 | 只看该作者

楼主的程序有问题的

我同意17楼的采样触发顺序
我也是做电力行业的
我也用过STM32的DMA 我是用DMA来传SPI数据到指定的SPI口
刚开始也是出现数据错位的问题 检查程序后发现是触发DMA出错,DMA的触发要等到一切准备就绪后再去触发他 这个触发是可以自己去控制的
楼主的现象像是在DMA传输的过程中已经启动了第二次的采样,而等你第二次启动DMA传输数据时实际上传输的已经不是第二次采样的数据了!应该按照17楼的顺序用AD的转换结束来触发传输就可以解决问题了
 还有就是记住DMA是有频率限制的 好像最大是18M

使用特权

评论回复
20
kingpower2018|  楼主 | 2009-4-13 19:13 | 只看该作者

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

STM32 的ADC 施加干扰时应该是ADC的配置参数丢失了,所以数据会放错误,而一旦错误就一直错下去(即使干扰消失),除非重新上电复位,重新初始化ADC,现在我只能在每个周波20ms重新初始化ADC,这样再加干扰时就不会出现数据错位,产品的问题得以解决,但多少还会影响我的采样精度,问题得以解决,感谢ST的技术支持,但我觉得STM32 的ADC不够稳定.希望以后得以改进.

使用特权

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

本版积分规则

4

主题

58

帖子

0

粉丝