硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1356|回复: 11
收起左侧

[ADC] 双路独立ADC多通道+dma,采样值有时出现前后两点相同

[复制链接]

0

主题

6

回帖

6

积分

新手上路

积分
6
发表于 2022-1-17 21:02:00 | 显示全部楼层 |阅读模式
借鉴了硬汉的教程,双ADC独立,加两个dma流,设置单次采样,ADC配DMA循环模式,DMA配循环模式,DMA放在SRAM4里,MPU配置not shareable,not buffable,只有cacheable. 在1ms的定时器中断里不断重置ADC1_START和ADC2_START寄存位,相当于1ms采一次。CLK 9M。DMA地址对齐:

下载.png


第一路DMA流设置:
下载 (1).png

第一路ADC设置,开了4个通道没问题。
下载 (2).png

启动传输:
下载 (3).png

第二路DMA配置:
下载 (4).png
第二路ADC配置,也是四个通道,未修改部分与第一路相同。
下载 (5).png
启动传输:
下载 (6).png

获得采样数据的函数,定期再1ms中断周期里调用。
下载 (7).png
MPU配置:
下载 (8).png
下载 (9).png

波形出来是这样,时不时有连续两个点相同然后8个通道都在同一时刻出现。
下载 (10).png
有大神能来分析一下不。


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2022-1-18 10:30:00 | 显示全部楼层
这种配置方式,你的分散加载问题配置没。
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2022-1-18 14:56:20 | 显示全部楼层
eric2013 发表于 2022-1-18 10:30
这种配置方式,你的分散加载问题配置没。


SCT这么配的
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2022-1-18 15:37:37 | 显示全部楼层
本帖最后由 shushan137 于 2022-1-18 15:53 编辑

EMMM图片显示有点问题?直接粘贴过来好像显示不出来。

SCT图片

SCT图片
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2022-1-20 10:13:30 | 显示全部楼层
shushan137 发表于 2022-1-18 15:37
EMMM图片显示有点问题?直接粘贴过来好像显示不出来。

貌似知道问题了,你当前是不是没有采用DMA双缓冲方式读取。

使用DMA双缓冲方式,容易保证连续。如果你是直接在主程序里面读取DMA缓冲不容易保证缓冲里面数据是同一轮DMA采集。
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2022-1-20 16:19:57 | 显示全部楼层
eric2013 发表于 2022-1-20 10:13
貌似知道问题了,你当前是不是没有采用DMA双缓冲方式读取。

使用DMA双缓冲方式,容易保证连续。如果你 ...

采样开始和DMA数据读取都在同一个1ms中断里,这个数据也不多也不快呀,也会有这个问题吗?发现在AD_START后加一个延迟再取DMA,延迟越多反而波形更差了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2022-1-21 11:00:01 | 显示全部楼层
shushan137 发表于 2022-1-20 16:19
采样开始和DMA数据读取都在同一个1ms中断里,这个数据也不多也不快呀,也会有这个问题吗?发现在AD_START ...

推荐用双缓冲,可以有效避免这种问题。
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2022-1-21 13:36:25 | 显示全部楼层
eric2013 发表于 2022-1-21 11:00
推荐用双缓冲,可以有效避免这种问题。

看了下双缓冲的需求,主要是为了在CPU取数据的时候DMA也能正常工作两者不干扰。我这个是直接采样8个通道,DMA工作完CPU工作,然后下一个中断,采样,DMA,cpu。,1ms内就传送8个数据。有没有什么能够监视DMA转换4个通道完成的标志呢?按说在AD_START后加上足够的延时再ADCGETVALUES()可以避免这种情况,但是现在加上大延迟反而效果更差了连着两个点相同的情况更多了有点搞不明白了。
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2022-1-21 16:05:38 | 显示全部楼层
eric2013 发表于 2022-1-21 11:00
推荐用双缓冲,可以有效避免这种问题。

另外我看了下32字节对齐分配出来的空间,UINT16的数组8个元素只占了32个字节,按照理解应该是每32个字节分配一个数组元素吧?这个是ALIGN有问题?
align.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2022-1-22 10:49:42 | 显示全部楼层
shushan137 发表于 2022-1-21 13:36
看了下双缓冲的需求,主要是为了在CPU取数据的时候DMA也能正常工作两者不干扰。我这个是直接采样8个通道 ...

不行就开个DMA半传输完成中断和传输完成中断吧,还省点事,也双缓冲的效果,让DMA和ADC一直采集不停止,这样处理还省点事。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2022-1-22 10:50:38 | 显示全部楼层
shushan137 发表于 2022-1-21 16:05
另外我看了下32字节对齐分配出来的空间,UINT16的数组8个元素只占了32个字节,按照理解应该是每32个字节 ...

这个要看下map文件实际分配的地址。
回复

使用道具 举报

0

主题

6

回帖

6

积分

新手上路

积分
6
 楼主| 发表于 2022-2-9 16:50:21 | 显示全部楼层
eric2013 发表于 2022-1-22 10:50
这个要看下map文件实际分配的地址。

再骚扰硬汉哥一下,不死心的直接用了多通道+DMA的例程,然后再采样处加正弦波,然后每个SYSTICK中断取一次值,发现存在连着两个点相同的情况,然后直接每个SYSTICK(1ms)读ADC的DR寄存器,systick提到最高优先级。发现也存在连着两个相同的现象,10来秒出现一次,然后已一出现就会短时间出现3,4个连着两个相同的点(每两个点之间不相连)。这个感觉解释不通啊,ADC在例程里是连续采样,例程就只改了ADC的口。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-16 05:33 , Processed in 0.224616 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表