硬汉嵌入式论坛

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

[有问必答] F405的跑168Mhz,ADC转换时间计算对不上?

[复制链接]

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2021-11-26 11:02:06 | 显示全部楼层 |阅读模式
本帖最后由 caicaptain2 于 2021-11-26 13:57 编辑

我的平台,F405,跑168Mhz,需要一个快速ADC转换,1M的采样频率。 ADC频率配置分频2,单通道转换,采样选15个周期。 理论上转换耗时27个时钟,大概是0.64us。足够满足。数据存储使用DMA。

可是,经过测试,采样选15个周期,检查ADC的结果,实际ADC转换只能达到0.5M的采样频率。
改为采样选3个时钟。检查ADC的结果,可以正常达到1M的采样频率。

这说明,理论的转换耗时不对?

ADC配置代码如下:
  1. hadc1.Instance = ADC1;
  2.   hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2; //ADC的源时钟为PCLK2=84MHz, 分频后最大36MHz.
  3.   hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  4.   hadc1.Init.ScanConvMode = ENABLE;
  5.   hadc1.Init.ContinuousConvMode = DISABLE;
  6.   hadc1.Init.DiscontinuousConvMode = DISABLE;
  7.   hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
  8.   hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T3_TRGO;
  9.   hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  10.   hadc1.Init.NbrOfConversion = 1;
  11.   hadc1.Init.DMAContinuousRequests = ENABLE;
  12.   hadc1.Init.EOCSelection = ADC_EOC_SEQ_CONV;
  13.   if (HAL_ADC_Init(&hadc1) != HAL_OK)
  14.   {
  15.     Error_Handler();
  16.   }

  17.   sConfig.Channel = ADC_CHANNEL_14;
  18.   sConfig.Rank = 1;
  19.   sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;// 配置3Cycle或者5Cycle
  20.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  21.   {
  22.     Error_Handler();
  23.   }
复制代码

问题已解决,由于ADC的模块共用一个时钟,这个ADC1的时钟分频参数,被ADC2的分频参数覆盖了。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
发表于 2021-11-26 11:22:15 | 显示全部楼层
你当前是定时器触发方式吗,可以不开定时器触发,看下15个时钟周期的实际采集效果。这个是他最大的极限。
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
 楼主| 发表于 2021-11-26 11:29:29 | 显示全部楼层
eric2013 发表于 2021-11-26 11:22
你当前是定时器触发方式吗,可以不开定时器触发,看下15个时钟周期的实际采集效果。这个是他最大的极限。

定时器触发的。 已经把定时器的信号通过IO输出来,查看过,确实是1MHz的方波。
我用一个持续300us的高电平信号让ADC采集。 出问题的时候,只有150个数据是高电平。 正常的情况下,是300个数据高电平。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
发表于 2021-11-26 11:48:23 | 显示全部楼层
caicaptain2 发表于 2021-11-26 11:29
定时器触发的。 已经把定时器的信号通过IO输出来,查看过,确实是1MHz的方波。
我用一个持续300us的高电 ...

不使用定时器触发,采集的效果怎么样。
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
 楼主| 发表于 2021-11-26 13:56:31 | 显示全部楼层
本帖最后由 caicaptain2 于 2021-11-26 13:58 编辑
eric2013 发表于 2021-11-26 11:48
不使用定时器触发,采集的效果怎么样。

经过你的这个提示,使用了全速ADC转换,反推ADC的时钟,发现它居然只有21Mhz。

原来,我用了2个ADC,其中第一个要求快速,用的分频系数是2,是超频使用的了;第二个ADC是普通速度,用的分频系数是4。

重点来了,但是,但是,MCU的3个ADC模块居然是公用的时钟。 刚才差了参考手册才知道。 代码中,先初始化了ADC1,然后再初始化ADC2,然后ADC的时钟就被固定在了4分频,也就是21MHz了。。。。
Snipaste_2021-11-26_13-56-18.jpg

评分

参与人数 1金币 +20 收起 理由
mangge2020 + 20

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106771
QQ
发表于 2021-11-26 14:42:17 | 显示全部楼层
caicaptain2 发表于 2021-11-26 13:56
经过你的这个提示,使用了全速ADC转换,反推ADC的时钟,发现它居然只有21Mhz。

原来,我用了2个ADC, ...

谢谢告知最终原因。
回复

使用道具 举报

1

主题

35

回帖

38

积分

新手上路

积分
38
发表于 2023-3-16 00:17:43 来自手机 | 显示全部楼层
感谢告知原因,遇到了同样的问题
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-5 14:53 , Processed in 0.292547 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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