5100|3

527

帖子

1

TA的资源

一粒金砂(高级)

楼主
 

【 ST NUCLEO-H743ZI测评】(3)ADC功能测试 [复制链接]

本帖最后由 supermiao123 于 2019-3-7 23:16 编辑

    这篇测评带来H7的ADC功能测试,主要带来ADC的DMA采集,采集的是H7的自带DA的输出波形,通过示波器和TFT分别来展示DA输出的波形和AD采集的波形。    由于采集波形,ADC和DAC需要等间隔采集也要等间隔获取,最好的方式就是DMA,用计算好的波形数据给DA输出,AD采集好的数据直接存入数组,最后通过数据转换显示到TFT屏上。这就是大概本次测评的原理。
    说到DMA,H7和以往系列的不同在于H7比之前更灵活了,DMA源先通过DMAMUX分配到指定通道,再进入DMA控制器,而之前的DMA应该都是指定通道只能是某几种外设的DMA。


代码生成继续之前的测评,在之前的基础上加上ADC的初始化

加上ADC的DMA

配置DAC

加上DAC的DMA

代码按上图初始化就好了,还有就是记得中断都打开,有可能会用到,不用放着也不碍事。

  1. __HAL_RCC_VREF_CLK_ENABLE();
  2.         VREFBUF->CSR =0x2;
  3.         
  4.         
  5.         ADC1->CR |= ADC_CR_ADEN;        
  6.         
  7.         __HAL_RCC_DMA1_CLK_ENABLE();        
  8.         
  9.         DMA1_Stream1->CR |= 0x00012D1E;
  10.         DMA1_Stream1->FCR |= DMA_SxFCR_FEIE ;
  11.         DMA1_Stream1->NDTR =ADC_BUF_SIZE;
  12.         DMA1_Stream1->PAR =(uint32_t)&(ADC1->DR);
  13.         DMA1_Stream1->M0AR =(uint32_t)adc_data;
  14.         DMA1_Stream1->CR |=1;
  15.         ADC1->CR |= ADC_CR_ADSTART;
复制代码

生成好初始化代码后增加上面的代码,START后就开始采集,我选用的DMA模式是ONE_SHOT,就是采完一个序列后就停止,然后刷屏,之后再开始。H7的REF别忘了使能,这里使用的是电源电源做参考。

电压转换如上图所示。
ADC的采样率看DS上写着16位可以3.6MSPS

ADC的时钟框图如下,本程序设置的是17MHz时钟输入不分频。

ADC的速度配置如下图

管脚速度如下图


DAC的用户代码如下所示
  1.         __HAL_RCC_VREF_CLK_ENABLE();
  2.         VREFBUF->CSR =0x2;
  3.         __HAL_RCC_TIM1_CLK_ENABLE();        
  4.         TIM1->CR1 = TIM_CR1_ARPE ;
  5.         TIM1->CR2 = TIM_CR2_MMS2_1 | TIM_CR2_MMS_1;
  6.         TIM1->SMCR |= TIM_SMCR_SMS_1 | TIM_SMCR_SMS_2;
  7.         TIM1->DIER |= TIM_DIER_TDE |TIM_DIER_UDE |TIM_DIER_UIE;
  8.         TIM1->EGR |= TIM_EGR_TG;
  9.         TIM1->ARR = 50;
  10.         TIM1->CR1 = TIM_CR1_CEN ;
  11.         
  12.         __HAL_RCC_DMA1_CLK_ENABLE();
  13.         
  14.         DMA1_Stream2->CR = 0x00012D40;
  15.         DMA1_Stream2->FCR |= DMA_SxFCR_FEIE;
  16.         DMA1_Stream2->NDTR =10000;
  17.         DMA1_Stream2->PAR =(uint32_t)&(DAC1->DHR12R1);
  18.         DMA1_Stream2->M0AR =(uint32_t)dac_data;
  19.         

  20.         
  21.         DAC1->CR  |= DAC_CR_DMAEN1 |DAC_CR_TEN1|DAC_CR_TSEL1_0|DAC_CR_TSEL2_0;
  22.         DAC1->CR |= DAC_CR_EN1 ;
  23.         
  24.         DMA1_Stream2->CR |=1;
复制代码


除了要注意基准外,DAC的DMA时钟需要TIM提供。
DA的速度可达1MHz。

除此以外DAC需要波形数据,再运行前先生成数据。
  1. for(int i=0;i<10000;i++)
  2.         {
  3.                 dac_data[i]=(float)da_amp/100*((sin(6.28/100*i)*0x800))+0x800;
  4.         }
复制代码



最后就是将采集到的数据显示到TFT上了
  1. void UserADCReadChart(unsigned char mode,float range,float offset ,unsigned char samples)
  2. {
  3.         
  4.         float fcnt=0.0;
  5.         float f_max=0.0;
  6.         float f_min=0.0;
  7.         unsigned int temp=0;
  8.         unsigned char tdata[100]={0};
  9.         unsigned short ADC_RESOLUTION= 0;
  10.                 f_max=0;
  11.                 f_min=10;

  12.         if(DMA_OK)
  13.         {
  14.                 DMA_OK=0;
  15.                 temp=ADC1->CFGR;
  16.         temp&=0x1C;
  17.         temp>>=2;
  18.         switch(temp)
  19.         {
  20.                 case 0:
  21.                         display_STR(0,120,"ADC_RESOLUTION_16B");
  22.                         ADC_RESOLUTION=0xffff;
  23.                 break;
  24.                 case 1:
  25.                         display_STR(0,120,"ADC_RESOLUTION_14B");
  26.                         ADC_RESOLUTION=0x3fff;
  27.                 break;
  28.                 case 2:
  29.                         display_STR(0,120,"ADC_RESOLUTION_12B");
  30.                         ADC_RESOLUTION=0xfff;
  31.                 break;
  32.                 case 3:
  33.                         display_STR(0,120,"ADC_RESOLUTION_10B");
  34.                         ADC_RESOLUTION=0x3ff;
  35.                 break;
  36.                 case 4:
  37.                         display_STR(0,120,"ADC_RESOLUTION_8B");
  38.                         ADC_RESOLUTION=0xff;
  39.                 break;

  40.         }               
  41.         for(int ii=1;ii<ADC_BUF_SIZE;ii++)
  42.                 {
  43.                         chartdata[ii-1]=(float)((float)adc_data[ii]/(float)ADC_RESOLUTION)*3.3;
  44.                         if(f_max<chartdata[ii-1])f_max=chartdata[ii-1];
  45.                         if(f_min>chartdata[ii-1])f_min=chartdata[ii-1];
  46.                 }
  47.                 display_STR(0,80,"VPP(V):");
  48.                
  49.         switch(mode)
  50.         {
  51.                 case AutoRange:
  52.                         
  53.                 tft_chart(0,0,128,80,(f_max-f_min),chartdata,f_min,samples);
  54.                 display_float(0,90,(f_max-f_min));
  55.                 display_STR(0,100,"OffSet(V):");
  56.                 display_float(0,110,(f_max+f_min)/2);
  57.                 break;
  58.                 case SetRange:
  59.                 tft_chart(0,0,128,80,range,chartdata,offset,samples);        
  60.                 display_float(0,90,range);
  61.                 break;
  62.         }

  63.         

  64.                         ADC1->CR |= ADC_CR_ADSTART;
  65. }
  66. }
复制代码

上面是TFT显示的部分代码。下面是采集的实际照片。

16位采集大幅度(对焦示波器)

16位采集大幅度(对焦TFT)

8位采集大幅度(对焦示波器)

8位采集大幅度(对焦TFT)

16位采集小幅度(对焦示波器)

16位采集小幅度(对焦TFT)

8位采集小幅度(对焦示波器)

8位采集小幅度(对焦TFT)

以上图片分别展示了相同配置下大幅度波形输出时候和小幅度波形输出时16位与8位的波形对比。
1、通过图片可以看到,波形形态差别不大。
2、通过图片可以看到,波形形态差别很大。
以上主要由于8位在采小信号时分辨率不足导致。
3、通过上面图片可以看到,16位显示波形比8位显示的波形多。
由此可以验证下面的图,精度越低采样率越高。

4、通过图片可以看到,H7的ADC采集到的VPP和示波器的VPP大致范围基本一致,由于示波器是定性分析,而H7也未校准,看个大概不偏离太多即可。

    本篇测评到此结束,之后有机会把ADC的速度和精度做个详细测评。谢谢观看!!
此内容由EEWORLD论坛网友supermiao123原创,如需转载或用于商业用途需征得作者同意并注明出处


此帖出自stm32/stm8论坛

最新回复

学习了,感谢群主分享~~  详情 回复 发表于 2019-3-8 10:10
点赞 关注(2)
 

回复
举报

1368

帖子

6

TA的资源

版主

沙发
 
屏上画的波形很漂亮,用的哪个GUI还是自己写的
此帖出自stm32/stm8论坛

点评

谢谢,自己写的  详情 回复 发表于 2019-3-8 17:35
 
个人签名专注智能产品的研究与开发,专注于电子电路的生产与制造……QQ:2912615383,电子爱好者群: void
 

回复

935

帖子

1

TA的资源

禁止发言

板凳
 
学习了,感谢群主分享~~
此帖出自stm32/stm8论坛
 
个人签名存储芯片/MCU/SRAM/PSRAM/DDR/FLASH/MRAM。web.www.sramsun.com  QQ3161422826 TEL:13751192923
 

回复

527

帖子

1

TA的资源

一粒金砂(高级)

4
 
懒猫爱飞 发表于 2019-3-7 23:49
屏上画的波形很漂亮,用的哪个GUI还是自己写的

谢谢,自己写的
此帖出自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-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表