417|1

2870

帖子

4

TA的资源

五彩晶圆(中级)

楼主
 

【NUCLEO H533RE】DAC测试与电压输出精度 [复制链接]

1、DAC测试介绍

dac输出的精度和带负载能力相互有关。本次测试使用STM32H533RE芯片集成的DAC1外设,由于NUCLEO H533RE的开发板设计原因。DAC1的通道1输出引脚PA4没有被引出来,虽然板子上面应该有空闲的接口引脚。希望ST公司在设计开发板时应该注意这一点。而且,CAN的引脚也没有引出来,SPI1的引脚也有冲突。

 

所以没有办法只好飞线了。通过SB3的引脚将PA4引出来。

 

测试的DAC负载使用20K的电阻作为负载。最大限流输出为电流0.16mA,应该不会影响芯片的精度变化。本次测试参考了同系列芯片STM32H563的“DAC_SignalsGeneration”例程。测量仪器为100M示波器。

2、硬件连接

测试负载20K欧姆电阻R,

GND        <===>  R 2pin

DAC PA4 <===>  R 1pin

 

3、参数配置

(1)系统时钟设置

  时钟源使用24MHZ外部晶振,系统时钟为250MHZ。

DAC外设时钟为250MHZ

 

时钟源使用HCLK。

(2)DAC参数设置

  DAC1的输出通道为CH1,输出外设引脚为PA4,Trigger触发源:时钟TIM1触发,启用GPDMA1通道。

(3)TIM1参数设置

  时钟设置为Internal clock,其它为默认,分频系数和计数都没有设置,这个我感到疑惑。

(4)GPDMA1参数设置

  循环模式打开, 通道设置为Channel3,DMA源 端口:Port1,Burst:1,Data Width:byte,

  目标端口为设备。Data width:word

4、程序分析与工作介绍

/**
  * [url=home.php?mod=space&uid=159083]@brief[/url] DAC Channel1 EscalatorConfig
  * @param  None
  * @retval None
  */
static void DAC_Ch1_EscalatorConfig(void)
{
  /*##-1- Initialize the DAC peripheral ######################################*/
  if (HAL_DAC_Init(&hdac1) != HAL_OK)
  {
    /* DAC initialization Error */
    Error_Handler();
  }
  
  /*##-2- Enable DAC selected channel and associated DMA ######################*/
  if (HAL_DAC_Start_DMA(&hdac1, DAC_CHANNEL_1, (uint32_t *)aEscalator8bit, 6, DAC_ALIGN_8B_R) != HAL_OK)
  {
    /* Start DMA Error */
    Error_Handler();
  }
}

/**
  * @brief  DAC Channel1 Triangle Configuration
  * @param  None
  * @retval None
  */
static void DAC_Ch1_TriangleConfig(void)
{
  /*##-1- Initialize the DAC peripheral ######################################*/
  if (HAL_DAC_Init(&hdac1) != HAL_OK)
  {
    /* DAC initialization Error */
    Error_Handler();
  }
  
  /*##-2- DAC channel2 Triangle Wave generation configuration ################*/
  if (HAL_DACEx_TriangleWaveGenerate(&hdac1, DAC_CHANNEL_1, DAC_TRIANGLEAMPLITUDE_1023) != HAL_OK)
  {
    /* Triangle wave generation Error */
    Error_Handler();
  }

  /*##-3- Enable DAC Channel1 ################################################*/
  if (HAL_DAC_Start(&hdac1, DAC_CHANNEL_1) != HAL_OK)
  {
    /* Start Error */
    Error_Handler();
  }

  /*##-4- Set DAC channel1 DHR12RD register ################################################*/
  if (HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 0x100) != HAL_OK)
  {
    /* Setting value Error */
    Error_Handler();
  }
}

/**
  * @brief EXTI line detection callbacks
  * @param GPIO_Pin: Specifies the pins connected EXTI line
  * @retval None
  */
void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)
{ 
  /* Change the wave */
  ubKeyPressed = 1;

  /* Change the selected waves forms */
  ubSelectedWavesForm = !ubSelectedWavesForm;
}

static void DAC_Ch1_TriangleConfig(void);定义修改触发控制
static void DAC_Ch1_EscalatorConfig(void);定义修改采样设置
 

/* -- Sample board code to send message over COM1 port ---- */
  printf("Welcome to STM32 world !\n\r");

  /* -- Sample board code to switch on leds ---- */
  BSP_LED_On(LED_GREEN);
  HAL_TIM_Base_Start(&htim1);
  /* USER CODE END BSP */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {

    /* -- Sample board code for User push-button in interrupt mode ---- */
    if (BspButtonState == BUTTON_PRESSED)
    {
      HAL_DAC_DeInit(&hdac1);
			/* Update button state */
      BspButtonState = BUTTON_RELEASED;
      /* -- Sample board code to toggle leds ---- */
      BSP_LED_Toggle(LED_GREEN);
      /* ..... Perform your action ..... */
			/* select waves forms according to the USER push-button status */
      if (ubSelectedWavesForm == 1)
      {
        /* The triangle wave has been selected */

        /* Triangle Wave generator -------------------------------------------*/
        DAC_Ch1_TriangleConfig();
      }
      else
      {
        /* The escalator wave has been selected */

        /* Escalator Wave generator -------------------------------------------*/
        DAC_Ch1_EscalatorConfig();
      }
    }

    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

主程序使用 HAL_TIM_Base_Start(&htim1);开始DAC的输出,通过按下User键控制是DMA中的const uint8_t aEscalator8bit[6] = {0x0, 0x33, 0x66, 0x99, 0xCC, 0xFF};的输出类型。

 

5、测试过程

测试开始将程序烧录到芯片

 

通过按键user改变输出,

 但是输出出现了信号不稳定的现象,信号经常的丢失和跳动

  6、总结

本次测试整个过程都很多不确定的地方,例如:信号除了0V时稳定,其它都不是很稳定。不会知道是不是因为设置的原因。stm32cubeMX的GPDMA设置代码无法找到设置的参数。

/**
  * @brief GPDMA1 Initialization Function
  * @param None
  * @retval None
  */
static void MX_GPDMA1_Init(void)
{

  /* USER CODE BEGIN GPDMA1_Init 0 */

  /* USER CODE END GPDMA1_Init 0 */

  /* Peripheral clock enable */
  __HAL_RCC_GPDMA1_CLK_ENABLE();

  /* GPDMA1 interrupt Init */
    HAL_NVIC_SetPriority(GPDMA1_Channel3_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(GPDMA1_Channel3_IRQn);

  /* USER CODE BEGIN GPDMA1_Init 1 */

  /* USER CODE END GPDMA1_Init 1 */
  /* USER CODE BEGIN GPDMA1_Init 2 */

  /* USER CODE END GPDMA1_Init 2 */

}

 

 

 

此帖出自stm32/stm8论坛
点赞 关注
 

回复
举报

2870

帖子

4

TA的资源

五彩晶圆(中级)

沙发
 

本次测试出现的问题我花费的较长时间也没有找到原因,主要怀疑是stm32cubeMx的GPDMA代码,本次将STM32H563和STM32H533的配置文件打包到一起,

dactest.zip (7.06 MB, 下载次数: 0)
此帖出自stm32/stm8论坛
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表