5601|2

9791

帖子

24

TA的资源

版主

楼主
 

【NUCLEO-L4R5ZI评测】STM32的ADC原来可以超频? [复制链接]

先使用TIM1输出160KHz 50%占空比的方波
然后将PWM输出连接到ADC的输入
用STM32L4R5的ADC测量PWM信号
下边是用示波器测量的PWM输出
配置ADC
AdcHandle.Init.ClockPrescaler=ADC_CLOCK_SYNC_PCLK_DIV1; AdcHandle.Init.Resolution= ADC_RESOLUTION_12B;  
sConfig.SamplingTime =ADC_SAMPLETIME_2CYCLES_5;
  1. [/size][/font][/align][font=微软雅黑][size=5]  /* ### - 1 - Initialize ADC peripheral #################################### */

  2.   AdcHandle.Instance          = ADCx;

  3.   if (HAL_ADC_DeInit(&AdcHandle) != HAL_OK)

  4.   {

  5.     /* ADC de-initialization Error */

  6.     Error_Handler();

  7.   }



  8.   AdcHandle.Init.ClockPrescaler        = ADC_CLOCK_SYNC_PCLK_DIV1;      /* Synchronous clock mode, input ADC clock divided by 2*/

  9.   AdcHandle.Init.Resolution            = ADC_RESOLUTION_12B;            /* 12-bit resolution for converted data */

  10.   AdcHandle.Init.DataAlign             = ADC_DATAALIGN_RIGHT;           /* Right-alignment for converted data */

  11.   AdcHandle.Init.ScanConvMode          = DISABLE;                       /* Sequencer disabled (ADC conversion on only 1 channel: channel set on rank 1) */

  12.   AdcHandle.Init.EOCSelection          = ADC_EOC_SINGLE_CONV;           /* EOC flag picked-up to indicate conversion end */

  13.   AdcHandle.Init.LowPowerAutoWait      = DISABLE;                       /* Auto-delayed conversion feature disabled */

  14.   AdcHandle.Init.ContinuousConvMode    = ENABLE;                        /* Continuous mode enabled (automatic conversion restart after each conversion) */

  15.   AdcHandle.Init.NbrOfConversion       = 1;                             /* Parameter discarded because sequencer is disabled */

  16.   AdcHandle.Init.DiscontinuousConvMode = DISABLE;                       /* Parameter discarded because sequencer is disabled */

  17.   AdcHandle.Init.NbrOfDiscConversion   = 1;                             /* Parameter discarded because sequencer is disabled */

  18.   AdcHandle.Init.ExternalTrigConv      = ADC_SOFTWARE_START;            /* Software start to trig the 1st conversion manually, without external event */

  19.   AdcHandle.Init.ExternalTrigConvEdge  = ADC_EXTERNALTRIGCONVEDGE_NONE; /* Parameter discarded because software trigger chosen */

  20.   AdcHandle.Init.DMAContinuousRequests = ENABLE;                        /* ADC DMA continuous request to match with DMA circular mode */

  21.   AdcHandle.Init.Overrun               = ADC_OVR_DATA_OVERWRITTEN;      /* DR register is overwritten with the last conversion result in case of overrun */

  22.   AdcHandle.Init.OversamplingMode      = DISABLE;                       /* No oversampling */

  23.   /* Initialize ADC peripheral according to the passed parameters */

  24.   if (HAL_ADC_Init(&AdcHandle) != HAL_OK)

  25.   {

  26.     Error_Handler();

  27.   }





  28.   /* ### - 2 - Start calibration ############################################ */

  29.   if (HAL_ADCEx_Calibration_Start(&AdcHandle, ADC_SINGLE_ENDED) !=  HAL_OK)

  30.   {

  31.     Error_Handler();

  32.   }



  33.   /* ### - 3 - Channel configuration ######################################## */

  34.   sConfig.Channel      = ADCx_CHANNEL;                /* Sampled channel number */

  35.   sConfig.Rank         = ADC_REGULAR_RANK_1;          /* Rank of sampled channel number ADCx_CHANNEL */

  36.   sConfig.SamplingTime = ADC_SAMPLETIME_2CYCLES_5;   /* Sampling time (number of clock cycles unit) */

  37.   sConfig.SingleDiff   = ADC_SINGLE_ENDED;            /* Single-ended input channel */

  38.   sConfig.OffsetNumber = ADC_OFFSET_NONE;             /* No offset subtraction */

  39.   sConfig.Offset = 0;                                 /* Parameter discarded because offset correction is disabled */

  40.   if (HAL_ADC_ConfigChannel(&AdcHandle, &sConfig) != HAL_OK)

  41.   {

  42.     Error_Handler();

  43.   }



  44.   /* ### - 4 - Start conversion in DMA mode ################################# */

  45.   if (HAL_ADC_Start_DMA(&AdcHandle,

  46.                         (uint32_t *)aADCxConvertedData,

  47.                         ADC_CONVERTED_DATA_BUFFER_SIZE

  48.                        ) != HAL_OK)

  49.   {

  50.     Error_Handler();

  51.   }
复制代码
添加DMA中断,断点打在__NOP();上,在__NOP();之前一定要先关掉ADC,否则读取的数据会中篡位的
  1. void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *AdcHandle)

  2. {

  3.   HAL_ADC_Stop_DMA(AdcHandle);

  4.   __NOP();

  5.   /* ### - 4 - Start conversion in DMA mode ################################# */

  6.   if (HAL_ADC_Start_DMA(AdcHandle,

  7.                         (uint32_t *)aADCxConvertedData,

  8.                         ADC_CONVERTED_DATA_BUFFER_SIZE

  9.                        ) != HAL_OK)

  10.   {

  11.     Error_Handler();

  12.   }

  13. }
复制代码
将ADC输入和PWM输出短接
编译、运行然后查看aADCxConvertedData变量的数据
数一下低电平的数量(小于20的数)平均23个左右
高电平的数量(大于4080的数)平均24个左右
160KHz*(23+24) = 7.52MSPS
将AdcHandle.Init.Resolution改为 ADC_RESOLUTION_6B;
使用6位模式
编译运行,计数高低电平数量平均40个左右
160KHz*(40+40)= 12.8MSPS
数据手册中12位的采样率是5.33,6位采样率是8.88,实际采样率怎么会比数据手册还高?
看到数据手册中ADC clock frequency是80MHz,可能是我的例程里使用了120MHz的时钟?
如果按照80MHz时钟计算,结果和数据手册接近
160KHz*(23+24) = 7.52MSPS/120MHz * 80MHz =5.01MSPS
160KHz*(40+40)= 12.8MSPS /120MHz* 80MHz=8.53MSPS
难道ADC也能超频?或者是我计算错了?
为了验证我的计算,我在STM32L496ZG的板子上跑了一下相同的例程,12位模式下高低电平的数量分别为17左右,6位模式下高低电平分别为27左右
160KHz*(17+17)=5.44MSPS
160KHZ*(27+27)=8.64MSPS
因为STM32L496主频最高为80MHz,这个结果和数据手册接近

从目前的测试来看,STM32L4R5的ADC主频貌似可以在120MHz时运行
不过使用120MHz的ADC时钟时会对测量出来的结果造成多大影响
以及是否会对ADC造成不可逆转的损坏还不得而知

下边把两个板子的测试工程放出来,欢迎网友一起来测试
STM32L4R5ZI-Nucleo ADC_DMA_Transfer.rar (131.53 KB, 下载次数: 22)
STM32L496ZG-Nucleo ADC_DMA_Transfer.rar (124.18 KB, 下载次数: 5)

此帖出自stm32/stm8论坛

最新回复

误差变大了!  详情 回复 发表于 2018-1-25 09:54
点赞 关注
个人签名虾扯蛋,蛋扯虾,虾扯蛋扯虾
 

回复
举报

3416

帖子

0

TA的资源

纯净的硅(高级)

沙发
 
沙发,只要能配置,哪个clock都能oc.
人有多大胆,地有多大产
此帖出自stm32/stm8论坛
 
 

回复

26

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
误差变大了!
此帖出自stm32/stm8论坛
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表