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

查看: 3722|回复: 10

[STM32L496] 【NUCLEO-L496ZG评测】评测5:过采样ADC

[复制链接]

68

主题

3266

回帖

82

蝴蝶豆

社区小助手

最后登录
2020-12-9
发表于 2017-4-6 22:29:08 | 显示全部楼层 |阅读模式
本帖最后由 wenyangzeng 于 2018-10-30 16:35 编辑

【NUCLEO-L469ZG评测】评测1:编译环境建立
【NUCLEO-L469ZG评测】评测2:Coremark跑分
【NUCLEO-L469ZG评测】评测3:低功耗测试
【NUCLEO-L469ZG评测】评测4:USB_FS_OTG
【NUCLEO-L496ZG评测】评测5:过采样ADC
【NUCLEO-L496ZG评测】评测6:可编程运放PGA



    STM32L496的又一个亮点是具有过采样ADC功能。
  通过配置最大过采样率(ADC_OVERSAMPLING_RATIO_128)其ADC转换结果为0xFFF * 128 = 0x7FF80,居然可以达到19位的精度。
硬件连接:
SCH.png
  电位器连接开发板的A_VDD和A_GND,抽头接PA4(ADC_CHANNEL_9),PC8-PC11用于驱动OLED屏显示转换结果。

软件:
    在STM32Cube_FW_L4_V1.7.0\Projects\STM32L496ZG-Nucleo\Examples\ADC\ADC_OverSampler提供了过采样ADC的演示软件包。可以直接应用,在工程中添加了OLED.C文件。在main()函数中添加调用OLED显示的函数。

无标题.png

  1. #include "main.h"
  2. #include "OLED.h"
  3. ADC_HandleTypeDef        AdcHandle;
  4. ADC_ChannelConfTypeDef   sConfig;
  5. uint32_t                 uwConvertedValue;
  6. uint32_t                 uwInputVoltage;
  7. void SystemClock_Config(void);
  8. static void Error_Handler(void);
  9. uint8_t disp_buf[7];
  10. int main(void)
  11. {
  12.   HAL_Init();
  13.   SystemClock_Config();
  14.   BSP_LED_Init(LED1);
  15.   OLED_Init()  ;
  16.   OLED_Print(0, 0,"  STM32L469ZG",TYPE16X16,TYPE8X16);
  17.   OLED_Print(0, 16, "ADC_OVERSAMPLING",TYPE16X16,TYPE8X16);
  18.   AdcHandle.Instance          = ADCx;
  19.   if (HAL_ADC_DeInit(&AdcHandle) != HAL_OK)
  20.    {
  21.     Error_Handler();
  22.    }
  23.   AdcHandle.Init.ClockPrescaler        = ADC_CLOCK_ASYNC_DIV1;  
  24.   AdcHandle.Init.Resolution            = ADC_RESOLUTION_12B;
  25.   AdcHandle.Init.DataAlign             = ADC_DATAALIGN_RIGHT;
  26.   AdcHandle.Init.ScanConvMode          = DISABLE;
  27.   AdcHandle.Init.EOCSelection          = ADC_EOC_SINGLE_CONV;
  28.   AdcHandle.Init.LowPowerAutoWait      = DISABLE;
  29.   AdcHandle.Init.ContinuousConvMode    = ENABLE;restart after each conversion) */
  30.   AdcHandle.Init.NbrOfConversion       = 1;
  31.   AdcHandle.Init.DiscontinuousConvMode = DISABLE;
  32.   AdcHandle.Init.NbrOfDiscConversion   = 1;
  33.   AdcHandle.Init.ExternalTrigConv      = ADC_SOFTWARE_START;
  34.   AdcHandle.Init.ExternalTrigConvEdge  = ADC_EXTERNALTRIGCONVEDGE_NONE;
  35.   AdcHandle.Init.DMAContinuousRequests = DISABLE;
  36.   AdcHandle.Init.Overrun               = ADC_OVR_DATA_OVERWRITTEN;
  37.   AdcHandle.Init.OversamplingMode      = ENABLE;
  38.   AdcHandle.Init.Oversampling.Ratio                 = OVERSAMPLING_RATIO;
  39.   AdcHandle.Init.Oversampling.RightBitShift         = RIGHTBITSHIFT;
  40.   AdcHandle.Init.Oversampling.TriggeredMode         = TRIGGEREDMODE;
  41.   AdcHandle.Init.Oversampling.OversamplingStopReset = OVERSAMPLINGSTOPRESET;
  42.   if (HAL_ADC_Init(&AdcHandle) != HAL_OK)
  43.     {
  44.     Error_Handler();
  45.     }
  46.   if (HAL_ADCEx_Calibration_Start(&AdcHandle, ADC_SINGLE_ENDED) != HAL_OK)
  47.    {
  48.     Error_Handler();
  49.    }
  50.   sConfig.Channel      = ADCx_CHANNEL;
  51.   sConfig.Rank         = ADC_REGULAR_RANK_1;
  52.   sConfig.SamplingTime = ADC_SAMPLETIME_6CYCLES_5;
  53.   sConfig.SingleDiff   = ADC_SINGLE_ENDED;
  54.   sConfig.OffsetNumber = ADC_OFFSET_NONE;
  55.   sConfig.Offset = 0;
  56.   if (HAL_ADC_ConfigChannel(&AdcHandle, &sConfig) != HAL_OK)
  57.   {
  58.     Error_Handler();
  59.   }

  60.   if (HAL_ADC_Start(&AdcHandle) != HAL_OK)
  61.   {
  62.     Error_Handler();
  63.   }

  64.   while (1)
  65.   {   
  66.     if (HAL_ADC_PollForConversion(&AdcHandle, 10) != HAL_OK)
  67.     {
  68.       Error_Handler();
  69.     }
  70.     uwConvertedValue = HAL_ADC_GetValue(&AdcHandle);
  71.     uwInputVoltage = uwConvertedValue * 3300;  
  72.     uwInputVoltage = uwInputVoltage / 0xFFF0;

  73.     disp_buf[0]=uwInputVoltage%10000/1000+0x30;
  74.     disp_buf[1]='.';
  75.     disp_buf[2]=uwInputVoltage%1000/100+0x30;        
  76.     disp_buf[3]=uwInputVoltage%100/10+0x30;        
  77.     disp_buf[4]=uwInputVoltage%10+0x30;
  78.     disp_buf[5]=' ';
  79.     disp_buf[6]='V';  
  80.     OLED_Print(36, 40, disp_buf,TYPE16X16,TYPE8X16);
  81.    
  82.   }
  83. }

  84. void SystemClock_Config(void)
  85. {
  86.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
  87.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  88.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_MSI;
  89.   RCC_OscInitStruct.MSIState = RCC_MSI_ON;
  90.   RCC_OscInitStruct.MSIClockRange = RCC_MSIRANGE_6;
  91.   RCC_OscInitStruct.MSICalibrationValue = RCC_MSICALIBRATION_DEFAULT;
  92.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  93.   RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_MSI;
  94.   RCC_OscInitStruct.PLL.PLLM = 1;
  95.   RCC_OscInitStruct.PLL.PLLN = 40;
  96.   RCC_OscInitStruct.PLL.PLLR = 2;
  97.   RCC_OscInitStruct.PLL.PLLP = 7;
  98.   RCC_OscInitStruct.PLL.PLLQ = 4;
  99.   if(HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  100.   {
  101.     while(1);
  102.   }

  103.   RCC_ClkInitStruct.ClockType = (RCC_CLOCKTYPE_SYSCLK | RCC_CLOCKTYPE_HCLK | RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2);
  104.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  105.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  106.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;  
  107.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;  
  108.   if(HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK)
  109.   {
  110.     while(1);
  111.   }
  112. }
  113. static void Error_Handler(void)
  114. {
  115.   BSP_LED_On(LED1);
  116.   while (1)
  117.   {
  118.   }
  119. }
复制代码
编译下载运行.
http://player.youku.com/player.php/sid/XMjY5MTE3NTg2NA==/v.swf



https://v.youku.com/v_show/id_XMjY5MTE3NTg2NA==.html?spm=a2hzp.8253869.0.0

注:读数出现变化时是因为正在调整电位器
    运行结果令人满意,本评测的ADC转换电压范围是0.000-3.300V,分辨率为1mV,ADC转换结果未作任何滤波处理,当电位器调整到某个位置不动后,读数最后一位数居然纹丝不动。可见该方案的ADC转换结果具有极高的分辨率和信噪比,如果用于数字表头产品是非常优秀的选择。







评分

参与人数 1ST金币 +20 收起 理由
zero99 + 20 很给力!

查看全部评分

<
回复

使用道具 举报

7

主题

1426

回帖

42

蝴蝶豆

论坛元老

最后登录
2020-8-11
发表于 2017-4-7 16:30:39 | 显示全部楼层
不错,很给力!~
回复 支持 反对

使用道具 举报

68

主题

3266

回帖

82

蝴蝶豆

社区小助手

最后登录
2020-12-9
 楼主| 发表于 2017-4-7 19:03:14 | 显示全部楼层
strang 发表于 2017-4-7 16:30
不错,很给力!~

谢谢支持
回复 支持 反对

使用道具 举报

61

主题

1071

回帖

17

蝴蝶豆

论坛元老

最后登录
2020-12-9
发表于 2017-4-8 12:24:40 来自手机 | 显示全部楼层
很强大且实用的一项功能,以后留意一下,本来想买16位的采集模块
回复 支持 反对

使用道具 举报

68

主题

3266

回帖

82

蝴蝶豆

社区小助手

最后登录
2020-12-9
 楼主| 发表于 2017-4-8 13:02:18 | 显示全部楼层
anywill 发表于 2017-4-8 12:24
很强大且实用的一项功能,以后留意一下,本来想买16位的采集模块

这个系列芯片的这个功能应该是可以考虑选择的。
回复 支持 反对

使用道具 举报

2

主题

10

回帖

0

蝴蝶豆

初级会员

最后登录
2019-8-23
发表于 2018-10-1 18:00:35 | 显示全部楼层
过采样DMA传输函数是哪个呢?
回复 支持 反对

使用道具 举报

4

主题

3

回帖

0

蝴蝶豆

新手上路

最后登录
2019-4-3
发表于 2018-10-30 14:48:04 | 显示全部楼层
楼主视频好像打不开了,能否再传一份?
回复 支持 反对

使用道具 举报

68

主题

3266

回帖

82

蝴蝶豆

社区小助手

最后登录
2020-12-9
 楼主| 发表于 2018-10-30 16:24:55 | 显示全部楼层
本帖最后由 wenyangzeng 于 2018-10-30 16:27 编辑
yl19960531 发表于 2018-10-30 14:48
楼主视频好像打不开了,能否再传一份?
好像是社区网页的问题,破总能否帮助解决一下。@zero99
回复 支持 反对

使用道具 举报

68

主题

3266

回帖

82

蝴蝶豆

社区小助手

最后登录
2020-12-9
 楼主| 发表于 2018-10-30 16:29:43 | 显示全部楼层
本帖最后由 wenyangzeng 于 2018-10-30 16:33 编辑
yl19960531 发表于 2018-10-30 14:48
楼主视频好像打不开了,能否再传一份?
https://v.youku.com/v_show/id_XMjY5MTE3NTg2NA==.html?spm=a2hzp.8253869.0.0


回复 支持 反对

使用道具 举报

4

主题

3

回帖

0

蝴蝶豆

新手上路

最后登录
2019-4-3
发表于 2018-12-11 16:22:41 | 显示全部楼层
请问这个采样频率是多少?辛苦楼主了
回复 支持 反对

使用道具 举报

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