硬汉嵌入式论坛

 找回密码
 立即注册
12
返回列表 发新帖
楼主: eric2013
收起左侧

[ADC] STM32H7的ADC过采样功能立竿见影,效果的确不错

  [复制链接]

0

主题

26

回帖

26

积分

新手上路

积分
26
发表于 2022-2-28 00:51:09 | 显示全部楼层
硬汉兄,请教两个问题,谢谢了
1:就是H750使用DMA过采样测电压,我主频只设为144Mhz,这时候,我不配置MPU,不开启Cache,这样程序会有问题嘛
2:我要10K的采集频率,如果使用32倍的过采样,相当于320K,64.5+8.5的采样周期,就相当于需要23.36M的ADC的时钟频率,之前听网上说,ADC配置大于14M以上,就不准了,那我这样是不是有问题了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115569
QQ
 楼主| 发表于 2022-2-28 05:11:44 | 显示全部楼层
梦幻的帅帅 发表于 2022-2-28 00:51
硬汉兄,请教两个问题,谢谢了
1:就是H750使用DMA过采样测电压,我主频只设为144Mhz,这时候,我不配置MP ...

1、直接配置关闭读写Cache是最好的。
使用STM32H7的AXI SRAM,SRAM1到SRAM4对应的Cache最高性能和最低性能配置
https://www.armbbs.cn/forum.php?mod=viewthread&tid=99322

2、没问题。
回复

使用道具 举报

81

主题

491

回帖

734

积分

金牌会员

积分
734
发表于 2022-3-3 17:25:30 | 显示全部楼层
16倍过采样,ad转换出来的数据需要取16个做平均吗?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115569
QQ
 楼主| 发表于 2022-3-4 00:44:26 | 显示全部楼层
tangqianfeng 发表于 2022-3-3 17:25
16倍过采样,ad转换出来的数据需要取16个做平均吗?

不需要,是已经平均好的。
回复

使用道具 举报

0

主题

26

回帖

26

积分

新手上路

积分
26
发表于 2022-3-8 12:28:35 | 显示全部楼层
eric2013 发表于 2022-3-4 00:44
不需要,是已经平均好的。

硬汉兄,再请教一个问题,我用H750 DMA实现ADC多通道采样,发现一个问题,就是刚采集低电压时,采集值比实际值大一点,然后随着实际电压值的升高,采集值比实际值大的越来越多,电压再升高时,到了一个死区,实际电压值加大,采集出来的值不变,慢慢的采集值就比实际电压值小了,随着实际电压值的继续增大,采集值比实际值小的越来越多,然后又到了一个死区,电压值增大,采集值先是不变,然后就直接跳到和实际电压值相同的值,然后死区过了,采集值又慢慢的比实际值大了,然后就不停地循环刚才的过程
这是因为MCU内部校准的缘故嘛
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115569
QQ
 楼主| 发表于 2022-3-9 03:33:00 | 显示全部楼层
梦幻的帅帅 发表于 2022-3-8 12:28
硬汉兄,再请教一个问题,我用H750 DMA实现ADC多通道采样,发现一个问题,就是刚采集低电压时,采集值比 ...

你现在的ADC稳压基准是用的外置的吗,看下这个稳压基准的波形是否有问题。感觉有可能是这个有问题,如果这里没有问题的话,估计就是软件配置问题了。
回复

使用道具 举报

0

主题

26

回帖

26

积分

新手上路

积分
26
发表于 2022-3-9 12:03:17 | 显示全部楼层
eric2013 发表于 2022-3-9 03:33
你现在的ADC稳压基准是用的外置的吗,看下这个稳压基准的波形是否有问题。感觉有可能是这个有问题,如果 ...

用的电源基准芯片,ADC误差大的时候也基本是在1%的精度以内,但是就是不知道什么原因导致的,我用的是STM32 CUBEMX配置的
回复

使用道具 举报

0

主题

26

回帖

26

积分

新手上路

积分
26
发表于 2022-3-9 15:28:10 | 显示全部楼层
梦幻的帅帅 发表于 2022-3-9 12:03
用的电源基准芯片,ADC误差大的时候也基本是在1%的精度以内,但是就是不知道什么原因导致的,我用的是STM ...

这是我的STM32CUBE配置图,程序里没有使能CACHE,没配置mpu
%_0Y_[Q`N9A6IBDHFQON33N.png
{V~~F6@%D]8OJRK(]GK)B~L.png
1YNIWGEZWW(2O_@37NG`530.png
YO`9J%IQ1G0FC3EB{T1BUXN.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115569
QQ
 楼主| 发表于 2022-3-10 00:48:24 | 显示全部楼层
梦幻的帅帅 发表于 2022-3-9 15:28
这是我的STM32CUBE配置图,程序里没有使能CACHE,没配置mpu

方便的话,分享下你的工程到百度云网盘,我看下。
回复

使用道具 举报

0

主题

26

回帖

26

积分

新手上路

积分
26
发表于 2022-3-10 16:17:27 | 显示全部楼层
eric2013 发表于 2022-3-10 00:48
方便的话,分享下你的工程到百度云网盘,我看下。

链接:https://pan.baidu.com/s/1v50kfBPKPyTyvONFR6lqCw
提取码:1234
--来自百度网盘超级会员V3的分享
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115569
QQ
 楼主| 发表于 2022-3-11 09:34:05 | 显示全部楼层
梦幻的帅帅 发表于 2022-3-10 16:17
链接:https://pan.baidu.com/s/1v50kfBPKPyTyvONFR6lqCw
提取码:1234
--来自百度网盘超级会员V3的 ...

1、降低下ADC的时钟速度。
2、这里仅勾选下面这个:
image.png

3、读取ADC数据前,调用下这个函数:
SCB_CleanInvalidateDCache
回复

使用道具 举报

0

主题

26

回帖

26

积分

新手上路

积分
26
发表于 2022-3-11 20:00:01 | 显示全部楼层
eric2013 发表于 2022-3-11 09:34
1、降低下ADC的时钟速度。
2、这里仅勾选下面这个:

都试过了,还是不行,我测了一下,死区大概是0.4mv,意思就是ADC输入有0.4mV的电压变化ADC没测出来,每隔固定的一段电压值就会出现一次,我需要测200mV-50V电压,2.5V的基准,(0.4/2500)*50000=8mV,相当于换算过来这边就有个8mV的误差了,测低压的时候已经影响测量精度了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115569
QQ
 楼主| 发表于 2022-3-12 10:46:26 | 显示全部楼层
梦幻的帅帅 发表于 2022-3-11 20:00
都试过了,还是不行,我测了一下,死区大概是0.4mv,意思就是ADC输入有0.4mV的电压变化ADC没测出来,每隔 ...

难道硬件有问题,硬件问题排查过没。
回复

使用道具 举报

0

主题

26

回帖

26

积分

新手上路

积分
26
发表于 2022-3-13 00:10:42 | 显示全部楼层
eric2013 发表于 2022-3-12 10:46
难道硬件有问题,硬件问题排查过没。

硬件没问题,我用表测过的,实际运放输出是有0.4mv的变化的,但是ADC就是测不出来,现在CH7 HC8 CH19我换了ADC2测了,现在没有这个问题了,我现在准备用例程的自适应滤波,看到了有“原始波形由任意波形+ 高斯分布白噪声 + 均匀分布白噪声组成,滤除高斯分布白噪声 + 均匀分布白噪声” ,还有“原始波形200Hz + 50Hz正弦波,滤除200Hz正弦波”,我想“原始波形由任意波形或者恒压+ 50Hz工频干扰+ 高斯分布白噪声 + 均匀分布白噪声组成,滤除高斯分布白噪声 + 均匀分布白噪声+ 50Hz工频干扰” ,硬汉兄,这样可行嘛
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115569
QQ
 楼主| 发表于 2022-3-13 12:42:50 | 显示全部楼层
梦幻的帅帅 发表于 2022-3-13 00:10
硬件没问题,我用表测过的,实际运放输出是有0.4mv的变化的,但是ADC就是测不出来,现在CH7 HC8 CH19我换 ...

只要你有想要滤除实现的参考波形效果就可以。
回复

使用道具 举报

0

主题

26

回帖

26

积分

新手上路

积分
26
发表于 2022-3-13 22:39:33 | 显示全部楼层
eric2013 发表于 2022-3-13 12:42
只要你有想要滤除实现的参考波形效果就可以。

关键就是没有参考波,我是电流转为电压值测量,正常情况是恒流,但是有时候会出现1Khz的尖峰电流,也需要测出来,现在测量受到50hz工频和均分分布噪声干扰,想滤除掉
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115569
QQ
 楼主| 发表于 2022-3-14 11:00:10 | 显示全部楼层
梦幻的帅帅 发表于 2022-3-13 22:39
关键就是没有参考波,我是电流转为电压值测量,正常情况是恒流,但是有时候会出现1Khz的尖峰电流,也需要 ...

有参考波形才方便。
回复

使用道具 举报

1

主题

7

回帖

10

积分

新手上路

积分
10
发表于 2022-5-14 16:27:16 | 显示全部楼层
硬总,请问这个26位是怎么算的,最大不是只有65535吗
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115569
QQ
 楼主| 发表于 2022-5-15 14:06:25 | 显示全部楼层
tiuhui 发表于 2022-5-14 16:27
硬总,请问这个26位是怎么算的,最大不是只有65535吗

过采样,本质上就是求平均。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2023-7-19 16:26:41 | 显示全部楼层
这里有个问题,哥,过采样不是用于提高信号分辨率的吗,为什么信号的精度(稳定性)也会被提高呢,我的理解就是过采样技术可以提高位数,增加分辨率,去分辨更微弱的信号
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115569
QQ
 楼主| 发表于 2023-7-20 11:23:50 | 显示全部楼层
c610 发表于 2023-7-19 16:26
这里有个问题,哥,过采样不是用于提高信号分辨率的吗,为什么信号的精度(稳定性)也会被提高呢,我的理解 ...

ST这个过采样实现本质就是做了个平均,比如1024倍过采样,就是1024个采样率求平均。
回复

使用道具 举报

13

主题

89

回帖

128

积分

初级会员

积分
128
发表于 2023-8-9 08:54:13 | 显示全部楼层
学到了,这就开启过采样
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2023-9-19 02:11:39 | 显示全部楼层
eric2013 发表于 2020-6-28 14:03
我的意思是:让你测试一波,走起。

你好, 我也是用H7系列做多通道ADC+DMA採集, 反復檢查設置應該沒錯, 但是就是BUFFER輸出都是0, 那是什麼原因? 怎麼破?謝謝
回复

使用道具 举报

0

主题

78

回帖

78

积分

初级会员

积分
78
发表于 2024-8-1 14:46:41 | 显示全部楼层
在H7上遇到这样一个问题,当ADC分辨率不是16bit时,比如12bit。如果使能过采样,那么设置数据左对齐还是右对齐就不起作用了,好像固定为右对齐。当然这个不影响最后的结果。只是发现有这么个情况。不知大家有没有遇到。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115569
QQ
 楼主| 发表于 2024-8-2 00:44:27 | 显示全部楼层
艾那的小强 发表于 2024-8-1 14:46
在H7上遇到这样一个问题,当ADC分辨率不是16bit时,比如12bit。如果使能过采样,那么设置数据左对齐还是右 ...

这个没留意过,一直用的16bit分辨率。
回复

使用道具 举报

0

主题

26

回帖

26

积分

新手上路

积分
26
发表于 2024-12-2 09:15:33 | 显示全部楼层
eric2013 发表于 2019-2-15 13:53
用在采用速度不是很快的场合,非常合适。

问一下,H7系列的ADC3(共3路同时采集,且需同步和考虑功耗,所以需同时ADC123采集),是不是无法完成持续高频采集(5M/S/12bit)?比如工频信号采集一个周期20ms,看数据手册对应H743(H743)/RAM/D3/64K,采集一个周期的数据量=(5M/50)*2Byte = 200KB >>64KB了。即使半周期也是100KB了--------而且我这实际是要边采集便计算,持续1s,准备10msADC/DMA采集完,接下来的10msADC/DMA采集的同时完成相应计算,如此循环50次/1s。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115569
QQ
 楼主| 发表于 2024-12-2 12:02:12 | 显示全部楼层
ck123 发表于 2024-12-2 09:15
问一下,H7系列的ADC3(共3路同时采集,且需同步和考虑功耗,所以需同时ADC123采集),是不是无法完成持续 ...

可以用axi sram有512KB
回复

使用道具 举报

0

主题

26

回帖

26

积分

新手上路

积分
26
发表于 2024-12-2 16:20:35 | 显示全部楼层
eric2013 发表于 2024-12-2 12:02
可以用axi sram有512KB

AXISRAM512K给 ADC12(要3相同采)用了(5M/50/2(半周期10ms)*12BIT(2B)*2路= 200K,另外需边ADC边际计算,也就是要*2= 400K了).  剩下的112K+64也小于ADC3 200K了?而且也不能这么夸寄存器字段用吧---------Eric2013,如果想用H7高频同采3路,是不是只能QSPI/RAM或外扩SDRAM了?(板子限定了只LQFP100)
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115569
QQ
 楼主| 发表于 2024-12-3 09:50:32 | 显示全部楼层
ck123 发表于 2024-12-2 16:20
AXISRAM512K给 ADC12(要3相同采)用了(5M/50/2(半周期10ms)*12BIT(2B)*2路= 200K,另外需边ADC边际计算, ...

我认为不应该一次性占用这么大,应该使用DMA双缓冲方式,一个存储时候,一个处理。这样可以认为是无限大。
回复

使用道具 举报

0

主题

26

回帖

26

积分

新手上路

积分
26
发表于 2024-12-3 10:39:41 | 显示全部楼层
eric2013 发表于 2024-12-3 09:50
我认为不应该一次性占用这么大,应该使用DMA双缓冲方式,一个存储时候,一个处理。这样可以认为是无限大 ...

我就是使用的双缓冲(ADC12的数据正常200K/10ms才需要400K了,其中200K参与计算计算,200K继续用于ADC采集存储,根据中断200K数组彼此切换存储、计算). 然后ADC3/200K还是无处调用RAM了?----还是我理解错你的意思了?--------1.双缓冲时应该是需要单缓存ADC12/200K/10ms的2倍RAM数组吧,那还是一样是400K(ADC12)? 2.改成5ms间隔采集处理(RAM占用减半=200K(ADC12)+100K(ADC3)),这样这样到时RMA=300K<512,但工频信号切割太多(4段),不利于提取有用信号。3.使用5ms,然后存储,因为RAM占用非常大,只能外部RAM存储了
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115569
QQ
 楼主| 发表于 2024-12-4 08:36:40 | 显示全部楼层
ck123 发表于 2024-12-3 10:39
我就是使用的双缓冲(ADC12的数据正常200K/10ms才需要400K了,其中200K参与计算计算,200K继续用于ADC采 ...

你这里是200K,比如你设置20K,这样也能保证实时采集,不会漏掉任何信号,关键的地方就是你的计算必须每次200K计算一次吗,如果是这样的话,那确实不太行了。
回复

使用道具 举报

0

主题

26

回帖

26

积分

新手上路

积分
26
发表于 2024-12-4 09:11:21 | 显示全部楼层
eric2013 发表于 2024-12-4 08:36
你这里是200K,比如你设置20K,这样也能保证实时采集,不会漏掉任何信号,关键的地方就是你的计算必须每 ...

嗯,需保证边采集边计算(采集间隔内计算完)。。。。。是否可以通过QSPI扩展RAM,比如接VTI7064(64Mb= 8MB)或者XT70F64B64A(64MB);然后 1.边3路ADC采集(比如5ms间隔)边存储,最终存储1s后的数据到外部RAM,然后再分别取1相/20ms/200K进行50次计算? 2.还是QSPI外接RAM可以直接内部地址映射?我看QSPI只能flash内存映射,没找到QSPI/RAM地址映射.-----3.还是说只能外扩SDRAM才可以地址映射满足要求;ADC采集速率是5M/S,3路同时,持续1s采集。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115569
QQ
 楼主| 发表于 2024-12-5 08:43:22 | 显示全部楼层
ck123 发表于 2024-12-4 09:11
嗯,需保证边采集边计算(采集间隔内计算完)。。。。。是否可以通过QSPI扩展RAM,比如接VTI7064(64Mb= 8 ...

RAM也可以QSPI,就不知道内存映射后是否支持写操作,Flash是不支持。

不支持也没关系,可以使用MDMA写,这个速度也非常快
回复

使用道具 举报

0

主题

26

回帖

26

积分

新手上路

积分
26
发表于 2024-12-6 09:52:26 | 显示全部楼层
本帖最后由 ck123 于 2024-12-6 15:54 编辑
eric2013 发表于 2024-12-5 08:43
RAM也可以QSPI,就不知道内存映射后是否支持写操作,Flash是不支持。

不支持也没关系,可以使用MDMA写 ...

再问一下,可不可以ADC3的数组使用AXI的200K(这个应该可以满足),ADC3使用AXI的200K(这个应该没有问题),ADC12的1路缓存使用D1_AXI的另外200K(总共=400<512K),另一路缓存使用其对应的RAM_D2/200K;这样错开,就可以了
即     
uint32_t ADC00Values[50000] @D1_AXISRAM_BASE;//200K
uint32_t ADC01Values[50000] @D2_AHBSRAM_BASE;//200K
uint16_t ADC30Values[100000] @D1_AXISRAM_BASE;//200K
---------------------

HAL_DMAEx_MultiBufferStart_IT(&hdma_adc1, (uint32_t) & (ADC12_COMMON->CDR), (uint32_t)&ADC00Values[0], (uint32_t)&ADC01Values[0], (50000));

------------
HAL_DMAEx_MultiBufferStart_IT(&hdma_adc3, (uint32_t) & (ADC3->DR), (uint32_t)&ADC30Values[0], (uint32_t)&ADC30Values[50000], (50000));
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115569
QQ
 楼主| 发表于 2024-12-7 08:22:48 | 显示全部楼层
ck123 发表于 2024-12-6 09:52
再问一下,可不可以ADC3的数组使用AXI的200K(这个应该可以满足),ADC3使用AXI的200K(这个应该没有问题),A ...

行,可以。
回复

使用道具 举报

18

主题

93

回帖

147

积分

初级会员

积分
147
QQ
发表于 2024-12-16 22:40:54 | 显示全部楼层
请问我这个ADC开启了过采样然后配合DMA 咋采出来数据不对?ADC-16bit然后DMA配置单次传输并且HALFWORD,过采样1024,右移10位,然后ADC时钟是CUBEMX设置的最大100Mhz,他内部应该有二分频是50Mhz。

uint16_t g_adc3_dma_data1[ADC_DATA_LENGTH];//定义adc3采集数据存放数组


hadc3.Instance = ADC3;
  hadc3.Init.Resolution = ADC_RESOLUTION_16B;
  hadc3.Init.ScanConvMode = ADC_SCAN_DISABLE;
  hadc3.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
  hadc3.Init.LowPowerAutoWait = DISABLE;
  hadc3.Init.ContinuousConvMode = DISABLE;
  hadc3.Init.NbrOfConversion = 1;
  hadc3.Init.DiscontinuousConvMode = DISABLE;
  hadc3.Init.ExternalTrigConv = ADC_SOFTWARE_START;
  hadc3.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
  hadc3.Init.ConversionDataManagement = ADC_CONVERSIONDATA_DMA_ONESHOT;
  hadc3.Init.Overrun = ADC_OVR_DATA_OVERWRITTEN;
  hadc3.Init.LeftBitShift = ADC_LEFTBITSHIFT_NONE;
  hadc3.Init.OversamplingMode = ENABLE;
  hadc3.Init.Oversampling.Ratio = 1024;
  hadc3.Init.Oversampling.RightBitShift = ADC_RIGHTBITSHIFT_10;
  hadc3.Init.Oversampling.TriggeredMode = ADC_TRIGGEREDMODE_SINGLE_TRIGGER;
  hadc3.Init.Oversampling.OversamplingStopReset = ADC_REGOVERSAMPLING_CONTINUED_MODE;




hdma_adc3.Instance = DMA1_Stream0;
    hdma_adc3.Init.Request = DMA_REQUEST_ADC3;
    hdma_adc3.Init.Direction = DMA_PERIPH_TO_MEMORY;
    hdma_adc3.Init.PeriphInc = DMA_PINC_DISABLE;
    hdma_adc3.Init.MemInc = DMA_MINC_ENABLE;
    hdma_adc3.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
    hdma_adc3.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
    hdma_adc3.Init.Mode = DMA_NORMAL;
    hdma_adc3.Init.Priority = DMA_PRIORITY_VERY_HIGH;

    hdma_adc3.Init.FIFOMode = DMA_FIFOMODE_DISABLE;




回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115569
QQ
 楼主| 发表于 2024-12-17 08:49:32 | 显示全部楼层
不吃鱼的猫大人 发表于 2024-12-16 22:40
请问我这个ADC开启了过采样然后配合DMA 咋采出来数据不对?ADC-16bit然后DMA配置单次传输并且HALFWORD,过 ...

直接测试我分享的这个例子试试。
回复

使用道具 举报

15

主题

50

回帖

95

积分

初级会员

积分
95
发表于 2024-12-26 09:59:54 | 显示全部楼层
单片ADC多通道,通道间的干扰,采样率高了特别明显
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-4 23:21 , Processed in 0.474059 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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