打印

ok,问题解决 ,数据采集速度375k采样率

[复制链接]
3196|22
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 gurong60 于 2013-9-13 12:26 编辑

之前做了adc采集,用了定时中断,后来听坛子里大侠说用dma,我也改用dma
可是问题来了,我开了俩个dma,一个接收,一个固定发送,接收的dma中断里面搞了两个缓存选择,具体细节如附件这篇** 基于stm32的双缓冲的实现.zip (216 KB)
而今出现了一个怪现象,dma中断正常,中断如下
void DMA1_Channel2_IRQHandler(void)
{

        if(DMA_GetFlagStatus(DMA1_FLAG_TC2)!= RESET)
        {
                DMA_ClearFlag(DMA1_FLAG_TC2);
                mark=0;

                if( mark_R==0 )
        {   
                //        GPIO_SetBits(GPIOB, GPIO_Pin_8);
                        DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SPI1_Buffer_Rx0;
            DMA_Init(DMA1_Channel2, &DMA_InitStructure);
            mark_R=1;
                        for(i=0;i<32;i++)
                        {
                                adc_out_b[2*i]=(((SPI1_Buffer_Rx1[3*i])<<3)&0xf8)+(((SPI1_Buffer_Rx1[3*i+1])>>5)&0x07);
                                adc_out_b[2*i+1]=(((SPI1_Buffer_Rx1[3*i+1])<<3)&0xf8)+(((SPI1_Buffer_Rx1[3*i+2]>>5))&0x07);
                                
                        }
                        

        }
        else if( mark_R == 1 )
        {
                //        GPIO_ResetBits(GPIOB, GPIO_Pin_8);
                DMA_InitStructure.DMA_MemoryBaseAddr = (u32)SPI1_Buffer_Rx1;
            DMA_Init(DMA1_Channel2, &DMA_InitStructure);
            mark_R=0;
                        for(i=0;i<32;i++)
                        {
                                adc_out_a[2*i]=(((SPI1_Buffer_Rx0[3*i])<<3)&0xf8)+(((SPI1_Buffer_Rx0[3*i+1])>>5)&0x07);
                                adc_out_a[2*i+1]=(((SPI1_Buffer_Rx0[3*i+1])<<3)&0xf8)+(((SPI1_Buffer_Rx0[3*i+2]>>5))&0x07);
                                
                        }
               
        }

        }

}
红色为我加的调试指示灯,结果是周期,稳定性,高低脉宽都正常,说明数据采集没有问题
但在主函数里面调试的指示灯就不正常,出现断续连接不上,usb接收到的数据用示波器看有丢数据,

可以肯定是数据发送没有跟得上
                                while(1)        
                                {
                                       
                                        while(mark==1);
                                       
                                                mark=1;
                                                if(mark_R==0)
                                                {
                                                        GPIO_SetBits(GPIOB, GPIO_Pin_8);
                                                        
                                                        USB_SIL_Write(EP1_IN, &adc_out_a[0],64);
                                                }
                                                else  if(mark_R==1)
                                                {
                                                        GPIO_ResetBits(GPIOB, GPIO_Pin_8);
                                                        
                                                        USB_SIL_Write(EP1_IN, &adc_out_b[0],64);
                                                }
                                       
                                                
                                                
                                }
帮忙分析分析,采样率93k左右,16位ad,数据量应该是93k*2    目前分析到问题是USB数据发送导致主函数的判断出现间断性不连续  设置DMA中断优先级为最高,中断中调试GPIOB-9脚波形正常,主函数里面的GPIO-8脚的波形应该跟9脚一致,但是出现间断性不连续,USB发送一包的耗时最大应该在100us(根据USB bulk的传输,640k/s的数据没有问题,我在主函数里面循环发送最高可到718k/s,)DMA中断之间间隔为三百多us,USB发送中断不会影响DMA中断。根据usb的bulk的速度,我想采样率达到300k也应该没有问题,可现在不知道这个问题时在哪里 @香水城            @王紫豪    @airwill
  





   
沙发
airwill| | 2013-8-15 17:31 | 只看该作者
DMA中断的时间肯定超过采样周期了.
接收的dma中断里面搞了两个缓存选择, 是解决数据覆盖的好办法.
有没有可能出现 缓冲还没有切换, 新来的数据就到了呢?
有没有可能缓冲交换的问题呢?

使用特权

评论回复
板凳
gurong60|  楼主 | 2013-8-15 22:23 | 只看该作者
airwill 发表于 2013-8-15 17:31
DMA中断的时间肯定超过采样周期了.
接收的dma中断里面搞了两个缓存选择, 是解决数据覆盖的好办法.
有没有 ...

1.如果谈到切换缓存时间,跟采集时间对比,中断里切换缓存时间应该小于采集时间,我采用的是spi连续采集,也就是采集时间为1/93k。至于里面的数据转换可能会耗时一点,不过也是us级别的时间,而且在中断标志清除和缓存切换后面进行数据转换应该不会影响dma再次采集数据
2.现在主要头疼的地方是,我在中断里面的切换标志,到主函数里面判断时,会出现间隔的不连续,大概会在20ms左右,不知道这个 不规律的动作是哪里来的,明天再试试,把usb发送先去掉,直接看切换标志是否正确,如果正确,那么有可能是usb中断在搞鬼

使用特权

评论回复
地板
gurong60|  楼主 | 2013-8-20 15:17 | 只看该作者
好吧,现在问题找到了,是usb中断和dma中断冲突,请问版主这个有什么好的办法解决

使用特权

评论回复
5
zeluo| | 2013-8-20 21:00 | 只看该作者
问题解决了就好   呵呵  

使用特权

评论回复
6
zeluo| | 2013-8-20 21:01 | 只看该作者
电子工程师   本身就是发现问题   解决问题  

使用特权

评论回复
7
gurong60|  楼主 | 2013-8-20 21:55 | 只看该作者
USB_SIL_Write(EP1_IN, &adc_out_b[0],64);
这条语句发送的时间应该小于dma中断时间间隔,不知道为什么还冲突,香主在不在,@香水城

使用特权

评论回复
8
gurong60|  楼主 | 2013-8-21 11:08 | 只看该作者
顶起

使用特权

评论回复
9
gurong60|  楼主 | 2013-8-21 20:01 | 只看该作者
顶起

使用特权

评论回复
10
gurong60|  楼主 | 2013-8-21 20:01 | 只看该作者
每日一顶

使用特权

评论回复
11
mmuuss586| | 2013-8-21 21:00 | 只看该作者

使用特权

评论回复
12
gurong60|  楼主 | 2013-8-22 09:24 | 只看该作者
签到

使用特权

评论回复
13
gurong60|  楼主 | 2013-8-22 16:44 | 只看该作者
顶起

使用特权

评论回复
14
gurong60|  楼主 | 2013-8-22 20:41 | 只看该作者
看来大神都去睡觉了

使用特权

评论回复
15
afei8856| | 2013-8-23 11:12 | 只看该作者
帮顶 刚刚开始用STM32

使用特权

评论回复
16
gurong60|  楼主 | 2013-8-29 22:06 | 只看该作者
airwill 发表于 2013-8-15 17:31
DMA中断的时间肯定超过采样周期了.
接收的dma中断里面搞了两个缓存选择, 是解决数据覆盖的好办法.
有没有 ...

问题找到了,上位机在取走数据的时候需要花费时间,这是下位机还在往上数数据,如果缓存满了,usb还没取走,则无法继续进行操作,所以会出现阶段性不连续,
如果想不丢数据,那么上位机取走时间必须要小于下位机每包发送数据的时间
不知道分析的对不对,
如果这个问题成立,那么如果解决这个数据冲突问题

使用特权

评论回复
17
knight_21ic| | 2013-8-29 22:23 | 只看该作者
上位机 开一个单独的线程,一直循环取数据

使用特权

评论回复
18
airwill| | 2013-8-30 08:44 | 只看该作者
gurong60 发表于 2013-8-29 22:06
问题找到了,上位机在取走数据的时候需要花费时间,这是下位机还在往上数数据,如果缓存满了,usb还没取 ...

这个可能性也很大, 那就用独立的接收线程. 增加缓存空间来解决吧

使用特权

评论回复
19
gurong60|  楼主 | 2013-8-30 13:56 | 只看该作者
knight_21ic 发表于 2013-8-29 22:23
上位机 开一个单独的线程,一直循环取数据

如何操作呢,我是用labview来搞的

使用特权

评论回复
20
gurong60|  楼主 | 2013-9-12 15:15 | 只看该作者
好吧,现在还是回到中断100k采样率,缓冲开了20k目前没有丢,开dma会有个问题,缓冲浅了肯定会丢

使用特权

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

本版积分规则

个人签名:对手,队友

179

主题

1307

帖子

4

粉丝