硬汉嵌入式论坛

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

[ADC] H7双重ADC+DMA,配置MPU,数据对齐后,DMA读取数据仍存在问题

[复制链接]

6

主题

21

回帖

39

积分

新手上路

积分
39
发表于 2019-9-20 10:49:39 | 显示全部楼层 |阅读模式
分享一个双重ADC+DMA采样的代码,整体工作都正常,但存在一个问题,好久了也一直没找到原因,求指点

1.首先配置了MPU

1.PNG

2.开启MPU
2.PNG

3.配置ADC与DMA部分
3.PNG

4.PNG

5.PNG
6.PNG
7.PNG
8.PNG
9.PNG
10.PNG
11.PNG
13.PNG

4.开启中断
12.PNG

5.中断回调
14.PNG

6.keil配置
16.PNG



以上就是程序部分,主要目的是采用双重ADC+DMA搬运,,每采样十次后进入DMA中断处理一次。基本工作正常,只有一个问题。
17.PNG
18.PNG
19.PNG
21.PNG

以上问题一直没有解决,也没有在网上查到答案。
MPU和数据对齐都做了,不知道问题在哪。
还有之前做独立ADC的时候也是差不多的情况,只有前16组数据能正常刷新,超出16组后都只能刷新一次。
有人知道问题出在哪里吗?谢谢

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2019-9-20 11:04:45 | 显示全部楼层
1、双重ADC不适合用定时器触发,双重的时间间隔配置后是固定的,而你的定时器触发是可调的,无法等分时间差。,所以我们应用中基本不使用默认支持的双重或者三重(H7不支持三重)

  一般的做法是独立配置ADC1和ADC3,然后使用同一个定时器的不同通道来触发即可,可以方便的实现同步采样或者交叉快速采样,这样的时间间隔才可以等分。

2、另外你用的D3域的SRAM,你却没有配置它的MPU属性,这个要配置的,要不处于上电默认状态。

3、其它的参考我们的例子,先实现下单ADC的溜溜。
http://www.armbbs.cn/forum.php?mod=viewthread&tid=86980&extra=page%3D1

QQ截图20190920110538.jpg
回复

使用道具 举报

6

主题

21

回帖

39

积分

新手上路

积分
39
 楼主| 发表于 2019-9-20 11:15:41 | 显示全部楼层
eric2013 发表于 2019-9-20 11:04
1、双重ADC不适合用定时器触发,双重的时间间隔配置后是固定的,而你的定时器触发是可调的,无法等分时间差 ...

谢谢指点!双重ADC不适合作定时器触发真是今天才知道,那我有方向了,感谢
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2019-9-20 14:49:40 | 显示全部楼层
样时代 发表于 2019-9-20 11:15
谢谢指点!双重ADC不适合作定时器触发真是今天才知道,那我有方向了,感谢

我们的一代和二代示波器都是这个方案
回复

使用道具 举报

2

主题

49

回帖

55

积分

初级会员

积分
55
发表于 2024-2-26 14:41:47 | 显示全部楼层
eric2013 发表于 2019-9-20 11:04
1、双重ADC不适合用定时器触发,双重的时间间隔配置后是固定的,而你的定时器触发是可调的,无法等分时间差 ...

您好,请教一下:
1.双重adc的时候,定时器不是触发adc master进行采集的吗?定时器触发可调是啥意思,定时器分频好以后不就是按指定频率去触发采集吗?
2.如果是adc1和3同时对一个通道采样,这样结果会不会相互影响?(待会我测一下看看)
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-2-26 15:57:12 | 显示全部楼层
风过不留痕 发表于 2024-2-26 14:41
您好,请教一下:
1.双重adc的时候,定时器不是触发adc master进行采集的吗?定时器触发可调是啥意思, ...

以双ADC快速交替采样为例,采用双ADC模式后,它们之间的采样间隔是固定的。没法和定时器触发速度匹配。

回复

使用道具 举报

2

主题

49

回帖

55

积分

初级会员

积分
55
发表于 2024-2-26 18:14:21 | 显示全部楼层
eric2013 发表于 2024-2-26 15:57
以双ADC快速交替采样为例,采用双ADC模式后,它们之间的采样间隔是固定的。没法和定时器触发速度匹配。
...

双快速交替采样的模式&双重adc,可以使用软件触发的方式采集吗?只触发一次,然后采满所需数据个数
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-2-27 08:01:44 | 显示全部楼层
风过不留痕 发表于 2024-2-26 18:14
双快速交替采样的模式&双重adc,可以使用软件触发的方式采集吗?只触发一次,然后采满所需数据个数

可以的,设置DMA为Normal模式。
回复

使用道具 举报

2

主题

49

回帖

55

积分

初级会员

积分
55
发表于 2024-2-27 10:45:42 | 显示全部楼层
eric2013 发表于 2024-2-27 08:01
可以的,设置DMA为Normal模式。

请教一下,高速adc采样还有啥性价比高的方案吗?
我之前设想的是双重adc交叉采集可以到9m的采样率(12bit,36mhz,h743,4.5m*2),如果定时器触发出来的数据不稳定的话,只能上外设了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-2-28 01:05:09 | 显示全部楼层
风过不留痕 发表于 2024-2-27 10:45
请教一下,高速adc采样还有啥性价比高的方案吗?
我之前设想的是双重adc交叉采集可以到9m的采样率(12bi ...

使用1个定时器的两个CC通道,分别触发两个ADC做快速交替采样即可。


回复

使用道具 举报

2

主题

49

回帖

55

积分

初级会员

积分
55
发表于 2024-2-28 15:57:29 | 显示全部楼层
eric2013 发表于 2024-2-28 01:05
使用1个定时器的两个CC通道,分别触发两个ADC做快速交替采样即可。

两个adc同时去采集同一个通道,不是会冲突吗?
回复

使用道具 举报

2

主题

49

回帖

55

积分

初级会员

积分
55
发表于 2024-2-28 18:52:58 | 显示全部楼层
风过不留痕 发表于 2024-2-28 15:57
两个adc同时去采集同一个通道,不是会冲突吗?

我现在配置成双重adc模式,软件触发采集,adc采样速率只有1m左右,已经配置成12bit+36mhz的时钟
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115490
QQ
发表于 2024-2-29 08:20:50 | 显示全部楼层
风过不留痕 发表于 2024-2-28 15:57
两个adc同时去采集同一个通道,不是会冲突吗?

不冲突。我们早期V5开发板的1代示波器就是这么搞的,用了同一个定时器的三个CC通道触发ADC1,ADC2和ADC3,引脚使用ADC123三路都可以复用的引脚。
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
发表于 2024-8-4 12:40:23 | 显示全部楼层
eric2013 发表于 2024-2-26 15:57
以双ADC快速交替采样为例,采用双ADC模式后,它们之间的采样间隔是固定的。没法和定时器触发速度匹配。
...

双重ADC+同步规则采样+采集6个通道的数据。6个通道分别是对应三组电流电压数据(相位一致)。这种模式适合定时器触发/定时器中断软件触发吗。在参考手册中没有看到说定时器不能触发双ADC的说法啊,请硬汉哥解析一下
回复

使用道具 举报

39

主题

1504

回帖

1626

积分

至尊会员

积分
1626
发表于 2024-8-5 08:51:22 | 显示全部楼层
除此之外,你这里还有一个问题,就是你这个ADC1出来的值比ADC2出来的要大一点,我目前也遇到这个问题
回复

使用道具 举报

6

主题

21

回帖

39

积分

新手上路

积分
39
 楼主| 发表于 2024-8-5 16:07:43 | 显示全部楼层
关于我遇到的问题,是当时没有配置以下部分。

/* 配置SRAM3的属性为Write through, read allocate,no write allocate */
    MPU_InitStruct.Enable           = MPU_REGION_ENABLE;
    MPU_InitStruct.BaseAddress      = 0x38000000;
    MPU_InitStruct.Size             = ARM_MPU_REGION_SIZE_64KB;       
    MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;
    MPU_InitStruct.IsBufferable     = MPU_ACCESS_NOT_BUFFERABLE;
    MPU_InitStruct.IsCacheable      = MPU_ACCESS_CACHEABLE;
    MPU_InitStruct.IsShareable      = MPU_ACCESS_NOT_SHAREABLE;
    MPU_InitStruct.Number           = MPU_REGION_NUMBER2;
    MPU_InitStruct.TypeExtField     = MPU_TEX_LEVEL0;
    MPU_InitStruct.SubRegionDisable = 0x00;
    MPU_InitStruct.DisableExec      = MPU_INSTRUCTION_ACCESS_ENABLE;

    HAL_MPU_ConfigRegion(&MPU_InitStruct);

另外,按我的理解,实际上H7的双重ADC采样主ADC被触发后从ADC并不是同时开始采样的,两者有时间差。导致数值有差异
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-29 03:30 , Processed in 0.349589 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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