硬汉嵌入式论坛

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

[ADC] ST的骚操作重现江湖,H7的新版HAL直接修改代码参数,不考虑兼容性,群友反馈H7的ADC过采样有问题

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
发表于 2020-4-7 08:00:05 | 显示全部楼层 |阅读模式


现象:

H750的HAL V1.7和V1.8的ADC过采样开启和不开启的采集数据有6%左右偏差的, V1.6不存在这个问题。

解决办法:

AdcHandle_1.Init.Oversampling.Ratio。这个参数,以前16倍过采样的时候要写成15,现在要写成16才行
回复

使用道具 举报

18

主题

321

回帖

375

积分

高级会员

积分
375
发表于 2020-4-7 08:44:14 | 显示全部楼层
多谢指出问题
回复

使用道具 举报

23

主题

1406

回帖

1475

积分

至尊会员

积分
1475
发表于 2020-4-7 11:58:17 | 显示全部楼层
防不胜防
代码不规范,亲人两行泪!
回复

使用道具 举报

13

主题

223

回帖

262

积分

高级会员

积分
262
发表于 2020-4-7 12:55:36 | 显示全部楼层
这个问题以前反馈过 老大
回复

使用道具 举报

11

主题

135

回帖

168

积分

初级会员

积分
168
发表于 2020-4-7 13:23:10 | 显示全部楼层
能分享下这种问题解决思路吗,要是我肯定拷贝相关外设的所有寄存器,然后对着手册一个一个排查,感觉头都要秃了。然后也未必能找到问题
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
 楼主| 发表于 2020-4-7 13:24:59 | 显示全部楼层
miaoqiongb 发表于 2020-4-7 12:55
这个问题以前反馈过 老大

还真是,以前你反馈我没有注意。

反馈的人多了,看来真是个坑。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
 楼主| 发表于 2020-4-7 13:34:34 | 显示全部楼层
exp_exp 发表于 2020-4-7 13:23
能分享下这种问题解决思路吗,要是我肯定拷贝相关外设的所有寄存器,然后对着手册一个一个排查,感觉头都要 ...

函数一个一个排查的,比较耗时间的。
回复

使用道具 举报

1

主题

9

回帖

12

积分

新手上路

积分
12
发表于 2020-6-11 15:21:46 | 显示全部楼层
之前参考了V7的代码,发现过采样的ADC值偏小,当时想的是可能还有哪里没配置好就先放下了,
今天搜了一下ADC过采样数值偏小的原因,才发现是这个原因,被ST的这个版本hal库坑了
回复

使用道具 举报

5

主题

519

回帖

534

积分

金牌会员

积分
534
发表于 2020-6-11 16:10:44 | 显示全部楼层
标记一下。。。。。。。
回复

使用道具 举报

19

主题

310

回帖

367

积分

高级会员

积分
367
发表于 2020-6-15 11:19:15 | 显示全部楼层
升级库,还是要用代码对比工具,看看到底是不是有 新出炉的bug
回复

使用道具 举报

4

主题

74

回帖

86

积分

初级会员

积分
86
发表于 2020-9-28 16:34:25 | 显示全部楼层
MARK一下,给力!
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2020-10-4 18:37:37 | 显示全部楼层
有没有多通道ADC DMA 过采样的代码?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
 楼主| 发表于 2020-10-4 18:40:56 | 显示全部楼层
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2020-10-5 08:20:56 | 显示全部楼层
eric2013 发表于 2020-10-4 18:40
http://www.armbbs.cn/forum.php?m ... 6980&extra=page%3D1

好的。谢谢。我看了一下例程。没看明白如何实现26bit分辨率采样?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
 楼主| 发表于 2020-10-5 08:30:05 | 显示全部楼层
hzhmcu 发表于 2020-10-5 08:20
好的。谢谢。我看了一下例程。没看明白如何实现26bit分辨率采样?

1024倍硬件过采样。
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2020-10-9 18:56:39 | 显示全部楼层
eric2013 发表于 2020-10-5 08:30
1024倍硬件过采样。

是不是需要设置DMA的值为32bit?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
 楼主| 发表于 2020-10-9 20:51:53 | 显示全部楼层
hzhmcu 发表于 2020-10-9 18:56
是不是需要设置DMA的值为32bit?

不需要。
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2020-10-11 21:38:48 | 显示全部楼层

那如何做呢?ADC只有16bit. 有demo吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
 楼主| 发表于 2020-10-12 00:13:41 | 显示全部楼层
hzhmcu 发表于 2020-10-11 21:38
那如何做呢?ADC只有16bit. 有demo吗?

V7-021就是DMA过采样。

http://www.armbbs.cn/forum.php?m ... 6980&extra=page%3D1



回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2020-10-15 23:40:40 | 显示全部楼层
eric2013 发表于 2020-10-12 00:13
V7-021就是DMA过采样。

http://www.armbbs.cn/forum.php?m ... 6980&extra=page%3D1

是16bit还是26bit?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
 楼主| 发表于 2020-10-16 09:46:33 | 显示全部楼层

26
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2020-10-18 13:11:28 | 显示全部楼层

uint16_t ADCxValues[4];
DMA_Handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;   /* 外设数据传输位宽选择半字,即16bit */     
DMA_Handle.Init.MemDataAlignment    = DMA_MDATAALIGN_HALFWORD;   /* 存储器数据传输位宽选择半字,即16bit */

这些都是16bit,如何实现26bit。是不是需要改成:
uint32_t ADCxValues[4];
DMA_Handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD;   /* 外设数据传输位宽选择半字,即32bit */     
DMA_Handle.Init.MemDataAlignment    = DMA_PDATAALIGN_WORD;   /* 存储器数据传输位宽选择半字,即32bit */
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
 楼主| 发表于 2020-10-18 14:23:10 | 显示全部楼层
hzhmcu 发表于 2020-10-18 13:11
uint16_t ADCxValues[4];
DMA_Handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;   /* 外设 ...

不用改,ADC过采样会直接把最终结果发出来。无需用户再做多余的操作。

这个例子就是直接可以使用的。
回复

使用道具 举报

0

主题

8

回帖

8

积分

新手上路

积分
8
发表于 2020-10-18 22:25:48 | 显示全部楼层
eric2013 发表于 2020-10-18 14:23
不用改,ADC过采样会直接把最终结果发出来。无需用户再做多余的操作。

这个例子就是直接可以使用的。

ADCxValues 只有16bit.如何变成26bit??
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106997
QQ
 楼主| 发表于 2020-10-19 12:43:11 | 显示全部楼层
hzhmcu 发表于 2020-10-18 22:25
ADCxValues 只有16bit.如何变成26bit??

不需要,STM32的过采样是硬件实现的,直接将平均后的数值给ADC的寄存器了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 08:09 , Processed in 0.511948 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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