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

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);

然后其他的相应修改。。。。。
Love_ST 回答时间:2019-11-8 23:15:32
楼主你好,采样率这么高你得数据是怎么样处理的呢?我现在也要做高速采样,采样率设置为1M,采出来的波形就不对了。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版