硬汉嵌入式论坛

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

[ADC] 奇怪的问题:H723的ADC3,开启过采样后,数值大了一倍

[复制链接]

5

主题

11

回帖

31

积分

新手上路

积分
31
发表于 2023-11-9 08:37:32 | 显示全部楼层 |阅读模式
本帖最后由 regsofweb 于 2023-11-9 08:39 编辑

ADC3,基准使用内部2.048V,采样外部4个通道,内部一个通道(Vbat/4),DMA环形缓冲

----------------------------------------------------

如果不开过采样
1.jpg

结果
2.jpg

基本对的上,
[1]是5V,经过1/16的电阻分压,VBAT稍微小一点

----------------------------------------------------
开过采样
a.jpg

结果
b.jpg

[1]和Vbat都大了一倍

----------------------------------------------------

16次过采样,4bit位移,结果应该一致才对。想不通
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2023-11-9 12:54:22 | 显示全部楼层
看下HAL库的源码,是不是你用的这个版本,4个偏移实际处理了3bit
回复

使用道具 举报

5

主题

11

回帖

31

积分

新手上路

积分
31
 楼主| 发表于 2023-11-9 15:02:23 | 显示全部楼层
找到问题了,HAL初始化,太TM坑了
ADC3和ADC1/2不一样,初始化程序里面对ADC3做了特殊处理

cubemx设oversampling ratio为16
对应的程序为:
  hadc3.Init.Oversampling.Ratio = 16;

然后在HAL_StatusTypeDef HAL_ADC_Init(ADC_HandleTypeDef *hadc)这个函数里面,有一段是设置oversampling的
        if (hadc->Instance == ADC3)
        {
          /* Configuration of Oversampler:                                      */
          /*  - Oversampling Ratio                                              */
          /*  - Right bit shift                                                 */
          /*  - Triggered mode                                                  */
          /*  - Oversampling mode (continued/resumed)                           */
          MODIFY_REG(hadc->Instance->CFGR2,
                     ADC_CFGR2_OVSR  |
                     ADC_CFGR2_OVSS  |
                     ADC_CFGR2_TROVS |
                     ADC_CFGR2_ROVSM,
                     ADC_CFGR2_ROVSE                       |
                     hadc->Init.Oversampling.Ratio         |
                     hadc->Init.Oversampling.RightBitShift |
                     hadc->Init.Oversampling.TriggeredMode |
                     hadc->Init.Oversampling.OversamplingStopReset
                    );
        }
按照我的配置,执行完,ADC_CFGR2的值是0x00000091

Ratio=16(0b10000)这个值直接被写到ADC_CFGR2的bit【4:0】,而这个寄存器的bit【4:2】就是控制ratio的
手册上
Bits 4:2 OVSR[2:0]: Oversampling ratio
This bitfield is set and cleared by software to define the oversampling ratio.
000: 2x
001: 4x
010: 8x
011: 16x
100: 32x
101: 64x
110: 128x
111: 256x

写16进去,实际对应的ratio是32,所以我得到的结果大一倍

如果我设置ratio为32,完蛋了,ADC_CFGR2的值是0x000000A1,完全不对

如果想设ratio=16,要在cubemx设置为0x0C

在cubemx的设置:
x.jpg

回复

使用道具 举报

13

主题

89

回帖

128

积分

初级会员

积分
128
发表于 2023-11-9 20:49:02 | 显示全部楼层
哇这个是巨坑啊!!!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106685
QQ
发表于 2023-11-10 08:32:18 | 显示全部楼层
regsofweb 发表于 2023-11-9 15:02
找到问题了,HAL初始化,太TM坑了
ADC3和ADC1/2不一样,初始化程序里面对ADC3做了特殊处理

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-29 13:44 , Processed in 0.170600 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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