你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F3 ADC外部触发采样达不到7.2MSPS

[复制链接]
黑皮男 提问时间:2018-3-23 18:21 /
悬赏30ST金币未解决
本帖最后由 黑皮男 于 2018-3-27 11:11 编辑

STM32F3的ADC在8bit模式理论可以达到7.2M的采样频率,但是在外部信号触发的情况下,采样速率一直不太理想。目前最多达到5M。下面是我的代码,求大神指点。以下代码都是经过测试的,只是外部触发信号的触发频率不能超过5Mhz,外部触发信号为EXTI_LINE_11。超过5Mhz,缓冲区的数据就会出错,6M的话,数据基本都为0xFFADC初始化部分
  1.     LL_ADC_SetCommonClock(__LL_ADC_COMMON_INSTANCE(ADC1), LL_ADC_CLOCK_SYNC_PCLK_DIV1);
  2.     LL_ADC_SetResolution(ADC1, LL_ADC_RESOLUTION_8B);
  3.     LL_ADC_SetDataAlignment(ADC1, LL_ADC_DATA_ALIGN_RIGHT);
  4.     LL_ADC_SetLowPowerMode(ADC1, LL_ADC_LP_MODE_NONE);
  5.     //LL_ADC_SetCommonPathInternalCh(__LL_ADC_COMMON_INSTANCE(ADC1), LL_ADC_PATH_INTERNAL_TEMPSENSOR);
  6.     //LL_ADC_REG_SetTriggerSource(ADC1, LL_ADC_REG_TRIG_SOFTWARE);
  7.     LL_ADC_REG_SetTriggerSource(ADC1, LL_ADC_REG_TRIG_EXT_EXTI_LINE11);
  8.    
  9.     LL_ADC_REG_SetTriggerEdge(ADC1, LL_ADC_REG_TRIG_EXT_RISING);
  10.     //LL_ADC_REG_SetTriggerEdge(ADC1, LL_ADC_REG_TRIG_EXT_FALLING);
  11.    
  12.     LL_ADC_REG_SetContinuousMode(ADC1, LL_ADC_REG_CONV_SINGLE);
  13.    
  14.     //LL_ADC_REG_SetSequencerDiscont(ADC1, LL_ADC_REG_SEQ_DISCONT_1RANK);
  15.    
  16.     LL_ADC_REG_SetDMATransfer(ADC1, LL_ADC_REG_DMA_TRANSFER_LIMITED);
  17.    
  18.     LL_ADC_REG_SetOverrun(ADC1, LL_ADC_REG_OVR_DATA_OVERWRITTEN);
  19.    
  20.     //LL_ADC_REG_SetSequencerLength(ADC1, LL_ADC_REG_SEQ_SCAN_ENABLE_16RANKS);
  21.     LL_ADC_REG_SetSequencerLength(ADC1, LL_ADC_REG_SEQ_SCAN_DISABLE);
  22.    
  23.     //LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_1, LL_ADC_CHANNEL_TEMPSENSOR);
  24.    
  25.     LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_1, LL_ADC_CHANNEL_3);
  26. /*    LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_2, LL_ADC_CHANNEL_3);
  27.     LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_3, LL_ADC_CHANNEL_3);
  28.     LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_4, LL_ADC_CHANNEL_3);
  29.     LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_5, LL_ADC_CHANNEL_3);
  30.     LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_6, LL_ADC_CHANNEL_3);
  31.     LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_7, LL_ADC_CHANNEL_3);
  32.     LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_8, LL_ADC_CHANNEL_3);
  33.     LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_9, LL_ADC_CHANNEL_3);
  34.     LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_10, LL_ADC_CHANNEL_3);
  35.     LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_11, LL_ADC_CHANNEL_3);
  36.     LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_12, LL_ADC_CHANNEL_3);
  37.     LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_13, LL_ADC_CHANNEL_3);
  38.     LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_14, LL_ADC_CHANNEL_3);
  39.     LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_15, LL_ADC_CHANNEL_3);
  40.     LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_16, LL_ADC_CHANNEL_3);
  41.     */
  42.    
  43.     LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_3, LL_ADC_SAMPLINGTIME_1CYCLE_5);
  44.     LL_ADC_SetChannelSingleDiff(ADC1, LL_ADC_CHANNEL_3, LL_ADC_SINGLE_ENDED);
  45.    
  46.     LL_ADC_Enable(ADC1);

  47.     while(LL_ADC_IsActiveFlag_ADRDY(ADC1)==0)
  48.     {
  49.         
  50.     }

复制代码
DMA初始化部分
  1.     NVIC_SetPriority(DMA1_Channel1_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),6, 0));
  2.     NVIC_EnableIRQ(DMA1_Channel1_IRQn);
  3.    
  4.     LL_DMA_ConfigTransfer(DMA1,
  5.                             LL_DMA_CHANNEL_1,
  6.                             LL_DMA_DIRECTION_PERIPH_TO_MEMORY|
  7.                             LL_DMA_PERIPH_NOINCREMENT       |
  8.                             LL_DMA_MEMORY_INCREMENT         |
  9.                             LL_DMA_PDATAALIGN_BYTE               |
  10.                             LL_DMA_MDATAALIGN_HALFWORD      |
  11.                             LL_DMA_PRIORITY_VERYHIGH            );
  12.                            
  13.     LL_DMA_ConfigAddresses(DMA1,
  14.                             LL_DMA_CHANNEL_1,
  15.                             LL_ADC_DMA_GetRegAddr(ADC1, LL_ADC_DMA_REG_REGULAR_DATA),
  16.                             0,
  17.                             LL_DMA_DIRECTION_PERIPH_TO_MEMORY);
  18.     LL_DMA_SetDataLength(DMA1,
  19.                         LL_DMA_CHANNEL_1,
  20.                         0);
  21.     LL_DMA_EnableIT_TC(DMA1,
  22.                         LL_DMA_CHANNEL_1);
  23.     LL_DMA_DisableChannel(DMA1,
  24.                         LL_DMA_CHANNEL_1);
复制代码
触发信号初始化
  1.     LL_EXTI_DisableEvent_0_31(EXTI_LINE);
  2.     LL_EXTI_EnableRisingTrig_0_31(EXTI_LINE);
复制代码


时钟初始化
  1.     LL_RCC_SetADCClockSource(LL_RCC_ADC1_CLKSRC_HCLK);
  2.     LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_ADC1);
  3.     LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOA);
  4.     LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_GPIOB);
  5.     LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMA1);
复制代码
启动转换
  1.     LL_EXTI_DisableEvent_0_31(EXTI_LINE);
  2.     LL_DMA_DisableChannel(DMA1, LL_DMA_CHANNEL_1);
  3.     LL_ADC_ClearFlag_EOC(ADC1);
  4.     LL_ADC_ClearFlag_EOS(ADC1);
  5.     LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_1, addr);//addr为缓冲区地址
  6.     LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_1, nSize);//nSize为缓冲区大小
  7.     LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_1);
  8.     LL_EXTI_EnableEvent_0_31(EXTI_LINE);
  9.     LL_ADC_REG_StartConversion(ADC1);
复制代码



收藏 评论5 发布时间:2018-3-23 18:21

举报

5个回答
黑皮男 最优答案 回答时间:2018-3-27 11:09:22
在使能前需要把voltage regulator打开,参考手册中有说,但是不知道voltage regulator的具体作用,有哪位大神指点一下
捕获.PNG
MrJiu 回答时间:2018-3-24 09:57:06
LL库啊。。。。。现在搞得是HAL库。。。打不达到要求还不简单。。。。首先看看ADC的时钟频率,然后算一下,先从理论上来说是否达到这个速度。。。这些就需要看参考手册了。。。还有,搞设计或者量产的东西,一般都不会直接使用到官方给的最大值。。。个人建议,对了顺带问一下,你使用LL库的FLASH和RAM占用情况咋样,如果可以的话,可否贴个map文件。。。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

黑皮男 回答时间:2018-3-24 10:44:41
本帖最后由 黑皮男 于 2018-3-24 10:47 编辑
MrJiu 发表于 2018-3-24 09:57
LL库啊。。。。。现在搞得是HAL库。。。打不达到要求还不简单。。。。首先看看ADC的时钟频率,然后算一下, ...

资源有限,64K的片子,跑了个FreeRTOS, 之前用公司的平台,资源扛不住,就一切从简了,选了LL库。8bit模式理论值是7.2MSPS, 虽然不要求达到7.2M,但也要尽量接近,5M的速度是差的有点远。整个的文件无法贴出,文件中的命令会有点敏感,毕竟是公司的东西。目前基本框架完成,优化等级选用了最高。
  28 334 bytes of readonly  code memory
   1 339 bytes of readonly  data memory
  15 156 bytes of readwrite data memory
ssht428 回答时间:2018-9-22 13:29:10
给后面的人参考:
外部触发的确是不能最高速。
要使用“ContinuousMode"+DMA才可以。
比如:
LL_ADC_REG_SetContinuousMode(ADC1, LL_ADC_REG_CONV_CONTINUOUS);

然后其他的相应修改。。。。。
mvvm 回答时间:2019-11-8 23:15:32
楼主你好,采样率这么高你得数据是怎么样处理的呢?我现在也要做高速采样,采样率设置为1M,采出来的波形就不对了。

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版