硬汉嵌入式论坛

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

[ADC] STM32H7的HAL库ADC线性度校准溢出时间设计小了,否则校准不成功,要特别注意!

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106553
QQ
发表于 2019-2-21 10:13:03 | 显示全部楼层 |阅读模式
简单的修改,64000后面先添加几个0测试就行:
  1. /* Fixed timeout value for ADC calibration.                                   */
  2. /* Values defined to be higher than worst cases: low clock frequency,         */
  3. /* maximum prescalers.                                                        */
  4. /* Ex of profile low frequency : f_ADC at 0.35 MHz (minimum value             */
  5. /* according to Data sheet), calibration_time MAX = 112 / f_ADC               */
  6. /*           112 / 350,000 = 0.32 ms                                           */
  7. /* At maximum CPU speed (200 MHz), this means                                  */
  8. /*    0.8 ms * 200 MHz = 64000 CPU cycles                                      */
  9. #define ADC_CALIBRATION_TIMEOUT         ((uint32_t) 64000)   /*!< ADC calibration time-out value */
复制代码

偏移校准没问题:

  1. if (HAL_ADCEx_Calibration_Start(&AdcHandle, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED) != HAL_OK)
  2. {
  3.         Error_Handler(__FILE__, __LINE__);
  4. }
复制代码


但是线性度校准,这个溢出时间小了:
  1. if (HAL_ADCEx_Calibration_Start(&AdcHandle, ADC_CALIB_OFFSET_LINEARITY, ADC_SINGLE_ENDED) != HAL_OK)
  2. {
  3.       Error_Handler(__FILE__, __LINE__);
  4. }
复制代码

评分

参与人数 2金币 +40 收起 理由
木兰花 + 20
byccc + 20 很给力!

查看全部评分

回复

使用道具 举报

36

主题

2039

回帖

2147

积分

至尊会员

积分
2147
发表于 2019-2-21 10:36:47 | 显示全部楼层
赞一下,之前也发现这个问题了,但是没有做更多的检查。
Ever tried. Ever failed. No matter. Try Again. Fail again. Fail better.
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106553
QQ
 楼主| 发表于 2019-2-22 02:21:06 | 显示全部楼层
byccc 发表于 2019-2-21 10:36
赞一下,之前也发现这个问题了,但是没有做更多的检查。

这个问题也是隔了很长时间才觉得测试一下。
回复

使用道具 举报

6

主题

53

回帖

71

积分

初级会员

积分
71
发表于 2019-2-22 08:37:13 | 显示全部楼层
这个偏移校准和线性度校准中,基准电压是咋样的?固定的还是可调节?
回复

使用道具 举报

29

主题

514

回帖

606

积分

金牌会员

积分
606
QQ
发表于 2019-2-22 09:00:29 | 显示全部楼层
出了ADC校准,我前段时间碰到诡异的现象,觉得ADC的瞬间内耗应该也不小。  如果上了系统,函数穿插运行,衔接的其他函数刚好时间比较长比较重要还不够健壮,最终就会导致一些小概率的异常现象。
回复

使用道具 举报

29

主题

514

回帖

606

积分

金牌会员

积分
606
QQ
发表于 2019-2-22 09:07:15 | 显示全部楼层
廷润 发表于 2019-2-22 09:00
出了ADC校准,我前段时间碰到诡异的现象,觉得ADC的瞬间内耗应该也不小。  如果上了系统,函数穿插运行,衔 ...

最开始简单测试时把ADC的初始化地方,拖到后面再初始化,异常的概率减小了。

最后多方面搞压力测试,定位到是emWin 跟我的硬件I2C从设备通信抢资源导致的概率问题。刚好ADC的通信在抢资源的争斗中添了一点点乱。她两工作时间在调度多2ms问题解决。

回归主题。ADC日常工作没什么问题,但是压力测试过程中,会发现她有很短暂的内耗抢占能力。
(注:只是个人产品运行测试观察发现,不同平台和运行的代码会有区别)
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106553
QQ
 楼主| 发表于 2019-2-23 01:02:42 | 显示全部楼层
Tresordie 发表于 2019-2-22 08:37
这个偏移校准和线性度校准中,基准电压是咋样的?固定的还是可调节?

是自动校准。

校准期间基准电压固定。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106553
QQ
 楼主| 发表于 2019-2-23 01:05:22 | 显示全部楼层
廷润 发表于 2019-2-22 09:07
最开始简单测试时把ADC的初始化地方,拖到后面再初始化,异常的概率减小了。

最后多方面搞压力测试, ...

一般使用ADC,推荐加上DMA。由于总线矩阵的存在,一般复杂的应用都可以处理的过来。
回复

使用道具 举报

29

主题

514

回帖

606

积分

金牌会员

积分
606
QQ
发表于 2019-2-26 09:09:49 | 显示全部楼层
eric2013 发表于 2019-2-23 01:05
一般使用ADC,推荐加上DMA。由于总线矩阵的存在,一般复杂的应用都可以处理的过来。

感谢指导。又积累了一个技术词汇“总线矩阵”。
回复

使用道具 举报

12

主题

134

回帖

170

积分

初级会员

积分
170
发表于 2019-2-26 09:13:57 | 显示全部楼层
学习了,记号!
回复

使用道具 举报

3

主题

14

回帖

23

积分

新手上路

积分
23
发表于 2020-2-12 10:38:10 | 显示全部楼层
现在STM32H7Cube库已经修改了溢出时间,看起来是够了

/* Ex of profile low frequency : f_ADC at 0.125 Mhz (minimum value              */
/* according to Data sheet), calibration_time MAX = 165010 / f_ADC              */
/*           165010 / 125000 = 1.32s                                            */
/* At maximum CPU speed (480 MHz), this means                                   */
/*    1.32 * 480 MHz = 633600000 CPU cycles                                     */
#define ADC_CALIBRATION_TIMEOUT         (633600000U)   /*!< ADC calibration time-out value */
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106553
QQ
 楼主| 发表于 2020-2-12 16:20:00 | 显示全部楼层
碧云天书 发表于 2020-2-12 10:38
现在STM32H7Cube库已经修改了溢出时间,看起来是够了

/* Ex of profile low frequency : f_ADC at 0.125 ...

看来新版比之前好了不少。
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2020-5-18 20:38:44 | 显示全部楼层
微信截图_20200518203321.png
手册中关于线性度校准讲到,1. 出厂校准过了。2. 校准条件有要求(fADC  Vref)
但是实际应用发现说的也不对啊,大家有没有发现。
1. 出厂校准个鬼啊,线性度还是略差的
2. 我fADC 25MHz  Vref 2.5V 校准线性度,结果很OK啊。
再就是有个疑问啊,每次上电都要校准下么,还是存起来,上电读到校准系数寄存器。话说这个线性度的校准系数读写好麻烦的。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106553
QQ
 楼主| 发表于 2020-5-18 22:08:03 | 显示全部楼层
jingyes239 发表于 2020-5-18 20:38
手册中关于线性度校准讲到,1. 出厂校准过了。2. 校准条件有要求(fADC  Vref)
但是实际应用发现说的也 ...

1、没看懂你要表示什么。
2、要的。
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2020-5-24 12:11:43 | 显示全部楼层
eric2013 发表于 2020-5-18 22:08
1、没看懂你要表示什么。
2、要的。

谢谢!
我想表达的是,手册中说出厂已经对线性度校准过了,而且线性度校准有条件要求。那么开发者就会理所当然的理解为,无需再初始化时进行线性度校准,只需要进行offset校准。
但是我实际应用发现,买到的片子,80%以上线性度都不好。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106553
QQ
 楼主| 发表于 2020-5-25 11:36:17 | 显示全部楼层
jingyes239 发表于 2020-5-24 12:11
谢谢!
我想表达的是,手册中说出厂已经对线性度校准过了,而且线性度校准有条件要求。那么开发者就会理 ...

还是每次都做一下靠谱。
回复

使用道具 举报

13

主题

86

回帖

125

积分

初级会员

积分
125
发表于 2020-5-25 23:51:32 | 显示全部楼层
jingyes239 发表于 2020-5-18 20:38
手册中关于线性度校准讲到,1. 出厂校准过了。2. 校准条件有要求(fADC  Vref)
但是实际应用发现说的也 ...

不知道是不是我程序问题,第一次校准存起来 重新上电恢复参数发现线性度是比较差的远比不上校准那次。不知道你有没有试过这个方式?感觉这个芯片发热量太大了温度变化太大,不好做采集,我始终只能做到100000字0.05%的精度。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106553
QQ
 楼主| 发表于 2020-5-26 00:15:54 | 显示全部楼层
lg676041036 发表于 2020-5-25 23:51
不知道是不是我程序问题,第一次校准存起来 重新上电恢复参数发现线性度是比较差的远比不上校准那次。不 ...

支持硬件过采样,效果很棒。我们H7-TOOL一直在用。对于提升信噪比效果极其明显。
回复

使用道具 举报

57

主题

88

回帖

259

积分

高级会员

积分
259
发表于 2021-6-30 18:07:02 | 显示全部楼层
请教:

ADC1初始化好以后,做校准:
  if (HAL_ADCEx_Calibration_Start(&hadc1, ADC_CALIB_OFFSET, ADC_SINGLE_ENDED) != HAL_OK)
  {
          Error_Handler();
  }

长时间不能退出来,可能会是什么原因。

谢谢!
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106553
QQ
 楼主| 发表于 2021-7-1 10:35:49 | 显示全部楼层
twodiamond 发表于 2021-6-30 18:07
请教:

ADC1初始化好以后,做校准:

就是我楼主位的问题。
回复

使用道具 举报

10

主题

17

回帖

47

积分

新手上路

积分
47
发表于 2022-4-2 16:40:18 | 显示全部楼层
又踩坑了,去年有个产品改过这个地方,今天在调其它产品时一直在出错,找了好久,最后对比了两个产品的库,才发现这个问题,居然忘记了
回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
发表于 2022-5-20 20:03:16 | 显示全部楼层
eric2013 发表于 2020-2-12 16:20
看来新版比之前好了不少。

  之前使用都没有问题  但Cube H7的库用最新的V1.10.0 好像读不到芯片温度了 硬汉能使一下么
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106553
QQ
 楼主| 发表于 2022-5-21 09:06:20 | 显示全部楼层
oneV 发表于 2022-5-20 20:03
之前使用都没有问题  但Cube H7的库用最新的V1.10.0 好像读不到芯片温度了 硬汉能使一下么

好的,后面试试。
回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
发表于 2022-5-21 15:23:36 | 显示全部楼层
eric2013 发表于 2022-5-21 09:06
好的,后面试试。

哦 找到原因了 CubeMX(V6.5.0)应该是有bug 它更改了RCC时钟代码的位置 以前是在main里面 现在外设的时钟代码放到了各自生成的独立.c文件里面  但是adc的唯独没有 也顺手在官方论坛上发了个帖子等待他们确认 rcc.png
回复

使用道具 举报

0

主题

19

回帖

19

积分

新手上路

积分
19
发表于 2022-6-24 23:09:16 | 显示全部楼层
oneV 发表于 2022-5-21 15:23
哦 找到原因了 CubeMX(V6.5.0)应该是有bug 它更改了RCC时钟代码的位置 以前是在main里面 现在外设的时钟 ...

的确,用6.5生成的库,程序运行直接在ADC初始化卡死,加了这句后,程序就可以运行了。6.5真坑啊
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-24 23:52 , Processed in 0.243976 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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