社区导航

 

搜索
查看: 361|回复: 2

[原创] NUCLEO-G431RB评测->DAC评测

[复制链接]

35

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2019-9-22 21:28 | 显示全部楼层 |阅读模式
本帖最后由 elike 于 2019-9-22 21:39 编辑

NUCLEO-G431RB评测

此芯片中的DAC12位的DAC,总共有4DAC接口,能从GPIO输出的有两个通道的DAC 如下图所示。

image.png

要想控制此DAC正常工作,首先需要了解的就是它的端口情况。文档中已经给出端口描述

image.png

从中可知,两个DAC的输入数据都是16bit,而系统寄存器是32位的,所以在作为DAC用的时候,有相应的截取位,对于单通道输出的DAC来说,数据截取格式如下:

image.png

需要注意的是,当DAC的输入时钟dac_hclk>80MHz的时候,HFSEL就必须要做出相应的设置,来延迟DAC_DHRx寄存器的输出传输到DAC_DORx,为了留给DAC足够的建立时间。

整个DAC的输出电压公式如下

image.png

基本编程配置如下

  sConfig.DAC_HighFrequency = DAC_HIGH_FREQUENCY_INTERFACE_MODE_AUTOMATIC;
  sConfig.DAC_DMADoubleDataMode = DISABLE;
  sConfig.DAC_SignedFormat = DISABLE;
  sConfig.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_DISABLE;
  sConfig.DAC_Trigger = DAC_TRIGGER_T2_TRGO;
  sConfig.DAC_Trigger2 = DAC_TRIGGER_T6_TRGO;
  sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
  sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_DISABLE;
  sConfig.DAC_UserTrimming = DAC_TRIMMING_FACTORY;

从以下程序中可以看出,用了两个触发器DAC_TRIGGER_T2_TRGODAC_TRIGGER_T6_TRGO,分别实现对每一帧数据和整个周期数据的控制。这两个触发器相当于一个分频器,有关于两个触发器的基本配置如下: 

 
  htim2.Instance = TIM2;
  htim2.Init.Prescaler = 149;
  htim2.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim2.Init.Period = 999;
  htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
  htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;

表明这个触发器的分频数为(150*500

  htim6.Instance = TIM6;
  htim6.Init.Prescaler = 0;
  htim6.Init.CounterMode = TIM_COUNTERMODE_UP;
  htim6.Init.Period = 2499;
  htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;

这个触发器的分频数为(1*2500

而整个系统的时钟配置如下

  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;
  RCC_OscInitStruct.PLL.PLLM = RCC_PLLM_DIV4;
  RCC_OscInitStruct.PLL.PLLN = 75;
  RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;
  RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;
  RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  /** Initializes the CPU, AHB and APB busses clocks 
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

image.png
 

所以系统加到触发器上的时钟频率为

16MHz/4*75/2/1/1/1=150MHz

而两个触发器的分频数分别为(150*10002500)对应输出频率为(1kHz60kHz),所以输出信号的周期为1kHz

在输出端连上示波器,可从示波器上观察得到,波形如下

image.png

按下USER按钮,显示出正弦波

image.png

 

对其中的正弦波导出到MATLAB中,做FFT分析,如下图

image.png

从图中可以看出,波形输出没有问题,但是杂波的影响,高次谐波带来的失真还是比较严重的,且在频率为~60kHz的时候内部高频采样时钟泄露相对于输入达到了-39dB

为了再次确认结果,我直接将输入数字信号取出

uint16_t sinewave[60] = {
0x07ff,0x08cb,0x0994,0x0a5a,0x0b18,0x0bce,0x0c79,0x0d18,0x0da8,0x0e29,0x0e98,0x0ef4,0x0f3e,0x0f72,0x0f92,0x0f9d,
0x0f92,0x0f72,0x0f3e,0x0ef4,0x0e98,0x0e29,0x0da8,0x0d18,0x0c79,0x0bce,0x0b18,0x0a5a,0x0994,0x08cb,0x07ff,0x0733,
0x066a,0x05a4,0x04e6,0x0430,0x0385,0x02e6,0x0256,0x01d5,0x0166,0x010a,0x00c0,0x008c,0x006c,0x0061,0x006c,0x008c,
0x00c0,0x010a,0x0166,0x01d5,0x0256,0x02e6,0x0385,0x0430,0x04e6,0x05a4,0x066a,0x0733};

MATLAB中重复17个周期,然后对该理想信号做FFT,看其频谱分布,

image.png

发现采用改数字信号对正弦波的模拟类似程度较高,没有偶次谐波,剩下的主要是奇次谐波。

 

当我将输出正弦波频率降低时,降低到500Hz。波形输出结果如下图所示

image.png

同样导入MATLAB分析

image.png

谐波会好一些,但是时钟注入的杂波还是影响较大,没有变化。

当输出频率升高时,上升到5kHz,示波器上的结果如下图

image.png

 

image.png

 

 也可以通过改变输入信号的值来改变波形,如果将输入数值变为以下内容时,

uint16_t sinewave[60] = {
0x07ff,0x08cb,0x0994,0x0a5a,0x0b18,0x0bce,0x0c79,0x0d18,0x0da8,0x0e29,0x0e98,0x0ef4,0x0f3e,0x0f72,0x0f92,0x0f9d,
0x0f92,0x0f72,0x0f3e,0x0ef4,0x0e98,0x0e29,0x0da8,0x0d18,0x0c79,0x0bce,0x0b18,0x0a5a,0x0994,0x08cb,0x07ff,0x07ff,
0x07ff,0x07ff,0x07ff,0x07ff,0x07ff,0x07ff,0x07ff,0x07ff,0x07ff,0x07ff,0x07ff,0x07ff,0x07ff,0x07ff,0x07ff,0x07ff,
0x07ff,0x07ff,0x07ff,0x07ff,0x07ff,0x07ff,0x07ff,0x07ff,0x07ff,0x07ff,0x07ff,0x07ff};

输出如图所示

image.png



此内容由EEWORLD论坛网友elike原创,如需转载或用于商业用途需征得作者同意并注明出处

来源:EEWorld stm32/stm8板块,转载请附上链接


回复

使用道具 举报

2923

TA的帖子

1

TA的资源

版主

Rank: 6Rank: 6

测评达人

发表于 2019-9-24 09:04 | 显示全部楼层

不错。顶一下! 



回复

使用道具 举报

1766

TA的帖子

1

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

发表于 2019-9-25 15:53 | 显示全部楼层

详细,就是图太小。

人已离开,无事别找,找也找不到。


回复

使用道具 举报

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

关闭

站长推荐上一条 /6 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2019-10-15 06:34 , Processed in 0.143757 second(s), 17 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表