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

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

[复制链接]
wenyangzeng 提问时间:2017-4-6 22:29 /
本帖最后由 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转换结果具有极高的分辨率和信噪比,如果用于数字表头产品是非常优秀的选择。







评分

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

查看全部评分

收藏 2 评论11 发布时间:2017-4-6 22:29

举报

11个回答
Bowen 回答时间:2017-4-7 16:30:39
不错,很给力!~
wenyangzeng 回答时间:2017-4-7 19:03:14
strang 发表于 2017-4-7 16:30
不错,很给力!~

谢谢支持
anywill 回答时间:2017-4-8 12:24:40
很强大且实用的一项功能,以后留意一下,本来想买16位的采集模块
wenyangzeng 回答时间:2017-4-8 13:02:18
anywill 发表于 2017-4-8 12:24
很强大且实用的一项功能,以后留意一下,本来想买16位的采集模块

这个系列芯片的这个功能应该是可以考虑选择的。
bjdj0000 回答时间:2018-10-1 18:00:35
过采样DMA传输函数是哪个呢?
小乐子531 回答时间:2018-10-30 14:48:04
楼主视频好像打不开了,能否再传一份?
wenyangzeng 回答时间:2018-10-30 16:24:55
本帖最后由 wenyangzeng 于 2018-10-30 16:27 编辑
yl19960531 发表于 2018-10-30 14:48
楼主视频好像打不开了,能否再传一份?
好像是社区网页的问题,破总能否帮助解决一下。@zero99
wenyangzeng 回答时间: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


小乐子531 回答时间:2018-12-11 16:22:41
请问这个采样频率是多少?辛苦楼主了
wenyangzeng 回答时间:2018-12-11 21:57:49
yl19960531 发表于 2018-12-11 16:22
请问这个采样频率是多少?辛苦楼主了

大概20KHZ左右,没有精确测量。
richer7688 回答时间:2020-12-5 17:12:11

请问这个采样频率是多少?采样频率不高吧

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版