这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 行业应用 » 汽车电子 » 星允派(stm32f103)DAC实现波形

共1条 1/1 1 跳转至

星允派(stm32f103)DAC实现波形

高工
2025-08-27 20:08:20     打赏

针对STM32F103利用DAC通过PA4输出三角波的优化配置流程,整合硬件特性与CubeMX操作要点:


一、DAC模块核心特性

双通道独立输出

通道1(PA4)与通道2(PA5)可同时输出不同波形

12位分辨率

数字量0~4095对应模拟输出0~VREF+(典型值3.3V)

触发方式

支持软件触发(立即更新)、定时器触发(周期性更新)

输出缓冲

启用缓冲可增强驱动能力(默认关闭,需根据负载选择)


二、PA4引脚硬件配置要点

GPIO模式设置

在CubeMX中配置PA4为Analog模式(禁用数字上拉/下拉)

时钟使能

必须启用DAC时钟:RCC -> DAC1勾选

参考电压稳定性

确保VREF+引脚(VDDA)电压稳定(建议加0.1μF+10μF去耦电容)

三、CubeMX详细配置步骤

系统核心配置

SYS -> Debug:选择Serial Wire(便于后续调试)

RCC -> High Speed Clock:选择HSE(外部晶振,提高时钟精度)

DAC通道1配置

DAC -> DAC1:

勾选Enable

Output Buffer:Disable(低负载时关闭以减少误差)

Trigger:None(软件触发模式)

Wave Generation:Disable(手动生成波形)

定时器配置(可选)

若需定时更新波形,可配置TIM2:

Prescaler/Period:根据目标频率计算(如1kHz波形需设置自动重装载值)

Channel1:配置为PWM Generation,用于触发DAC更新

生成代码

点击GENERATE CODE,确保勾选Toolchain/IDE为对应开发环境


81a0c1b1ba004dada475f8d228f530d5.png

在 DAC Mode and Configuration 标题下,有两个主要部分,

OUT1 Configuration:这是一个复选框,当前已勾选。

Configuration:下方有多个子标签页,分别是

Reset Configuration

DMA Settings

Parameter Settings

GPIO Settings 和 User Constants,当前选中的是 Parameter Settings。

在 Parameter Settings 标签页下,有一个参数配置区域,标题为 Configure the below parameters 具体参数如下:

DAC Out1 Settings:

Output Buffer:Enable

Trigger:Timer 2 Trigger Out event

Wave generation mode:Triangle wave generation

Maximum Triangle Amp...:4095

这里主要是配置 PA4 引脚的输出模式:

e0e320abaf414f16b74abf7b0d6825a0.png

四、代码

初始化
void MX_DAC_Init(void)
{


  DAC_ChannelConfTypeDef sConfig = {0};

  hdac.Instance = DAC;
  if (HAL_DAC_Init(&hdac) != HAL_OK)
  {
    Error_Handler();
  }
  sConfig.DAC_Trigger = DAC_TRIGGER_T2_TRGO;
  sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
  if (HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_DACEx_TriangleWaveGenerate(&hdac, DAC_CHANNEL_1, DAC_TRIANGLEAMPLITUDE_4095) != HAL_OK)
  {
    Error_Handler();
  }
}

主函数
void MX_DAC_Init(void)
{

  /* USER CODE BEGIN DAC_Init 0 */

  /* USER CODE END DAC_Init 0 */

  DAC_ChannelConfTypeDef sConfig = {0};

  /* USER CODE BEGIN DAC_Init 1 */

  /* USER CODE END DAC_Init 1 */

  /** DAC Initialization
  */
  hdac.Instance = DAC;
  if (HAL_DAC_Init(&hdac) != HAL_OK)
  {
    Error_Handler();
  }

  /** DAC channel OUT1 config
  */
  sConfig.DAC_Trigger = DAC_TRIGGER_T2_TRGO;
  sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
  if (HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1) != HAL_OK)
  {
    Error_Handler();
  }

  /** Configure Triangle wave generation on DAC OUT1
  */
  if (HAL_DACEx_TriangleWaveGenerate(&hdac, DAC_CHANNEL_1, DAC_TRIANGLEAMPLITUDE_4095) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN DAC_Init 2 */

  /* USER CODE END DAC_Init 2 */

}


void HAL_DAC_MspInit(DAC_HandleTypeDef* dacHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(dacHandle->Instance==DAC)
  {
  /* USER CODE BEGIN DAC_MspInit 0 */

  /* USER CODE END DAC_MspInit 0 */
    /* DAC clock enable */
    __HAL_RCC_DAC_CLK_ENABLE();

    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**DAC GPIO Configuration
    PA4     ------> DAC_OUT1
    */
    GPIO_InitStruct.Pin = GPIO_PIN_4;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  /* USER CODE BEGIN DAC_MspInit 1 */

  /* USER CODE END DAC_MspInit 1 */
  }
}

void HAL_DAC_MspDeInit(DAC_HandleTypeDef* dacHandle)
{

  if(dacHandle->Instance==DAC)
  {
  /* USER CODE BEGIN DAC_MspDeInit 0 */

  /* USER CODE END DAC_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_DAC_CLK_DISABLE();

    /**DAC GPIO Configuration
    PA4     ------> DAC_OUT1
    */
    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4);

  /* USER CODE BEGIN DAC_MspDeInit 1 */

  /* USER CODE END DAC_MspDeInit 1 */
  }
}

五、实现效果

10e2fe4d300347efbbf114c3d3d1a8ec.png


共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]