这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » NUCLEO-U083RC学习历程27-低功耗下实现DAC功能

共4条 1/1 1 跳转至

NUCLEO-U083RC学习历程27-低功耗下实现DAC功能

助工
2025-02-15 15:40:42     打赏

之前和大家分享了STM32U083RC的DAC的经验,今天和大家分享一下在低功耗下DAC的输出功能。

首先继续和大家分享一下DAC的一些知识

一:DAC的触发来源

1.1如果TENx位被置1,DAC转换可以由某外部事件触发(定时器计数器、外部中断线)。配置控制位TSELx[2:0]可以选择8个触发事件之一触发DAC转换。

0205-2.png

每次DAC接口侦测到来自选中的定时器TRGO输出,或者外部中断线9的上升沿,最近存放在寄存器DAC DHRx中的数据会被传送到寄存器DAC DORx中。在3个APB1时钟周期后,寄存器DAC DORx更新为新值。

如果选择软件触发,一旦SWTRIG位置’1’,转换即开始。在数据从DAC DHRx寄存器传送到DAC DORx寄存器后,SWTRIG位由硬件自动清'0'。

1.2 DAC输出电压

数字输入经过DAC被线性地转换为模拟电压输出,其范围为0到VREF+。任-DAC通道引脚上的输出电压满足下面的关系:DAC输出=VREFx(DOR/4095)。

1.3 使能DAC通道

将DAC CR寄存器的ENx位置’1’即可打开对DAC通道x的供电。经过一段启动时间twAKEUP,DAC通道x即被使能。

ENx位只会使能DAC通道x的模拟部分,即便该位被置0,DAC通道x的数字部分仍然工作

1.4 使能DAC输出缓存

DAC集成了2个输出缓存,可以用来减少输出阻抗,无需外部运放即可直接驱动外部负载。每个DAC通道输出缓存可以通过设置DAC CR寄存器的BOFFx位来使能或者关闭。

这里 STM32 的 DAC 输出缓存做的有些如果使能的话,虽然输出能力强一点,但是输出没法到 0,所以我们不使用输出缓存。

二:DAC通道1的相关寄存器

DAC控制寄存器 DAC_CR

DAC软件触发寄存器DAC_SWTRIGR

DAC通道1的12位右对齐数据保持寄存器DAC_DHR12R1

DAC通道1的12位左对齐数据保持寄存器DAC_DHR12L1

DAC通道1的8位右对齐数据保持寄存器DAC_DHR8R1

DAC通道1数据输出寄存器DAC_DOR1

2.1 DAC控制寄存器DAC_CR

0215-2.png

2.2 DAC通道1的12位右对齐数据保持寄存器DAC_DHR12R1

0215-3.png

2.3 DAC通道1的12位左对齐数据保持寄存器DAC_DHR12L1

0215-4.png

2.4 DAC通道1的8位右对齐数据保持寄存器DAC_DHR8R1

0215-5.png

2.5 DAC通道1数据输出寄存器DAC_DOR1

0215-6.png

三:软件编写步骤如下所示:

3.1 开始PA口的时钟,同时设置PA4为输入模式

3.2 使能DAC1时钟(由STM32cube 软件自动开启)

3.3  等待外部按键按下后,初始化DAC功能,同时设置DAC的工作模式

3.4  使能DAC的转换通道、设置DAC的输出值、DAC开始输出

3.5    设定程序进入睡眠模式

四:软件代码如下所示:

  if (HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_8B_R, 0xFF) != HAL_OK)
  {
    /* Setting value Error */
    Error_Handler();
  }

  if (HAL_DAC_Start(&hdac1, DAC_CHANNEL_1) != HAL_OK)
  {
    /* Start Error */
    Error_Handler();
  }
  while (UserButtonStatus == 0)
  {
  }
  UserButtonStatus = 0;  

  RCC_OscInitStruct_LSI.OscillatorType = RCC_OSCILLATORTYPE_LSI;
  RCC_OscInitStruct_LSI.LSIState       = RCC_LSI_ON;
  RCC_OscInitStruct_LSI.PLL.PLLState   = RCC_PLL_NONE;
  HAL_RCC_OscConfig(&RCC_OscInitStruct_LSI);

  if (HAL_DAC_Stop(&hdac1, DAC_CHANNEL_1) != HAL_OK)
  {
    /* Start Error */
    Error_Handler();
  }
  if (HAL_DAC_DeInit(&hdac1) != HAL_OK)
  {
    /* Initialization Error */
    Error_Handler();
  }
  if (HAL_DAC_Init(&hdac1) != HAL_OK)
  {
    /* Initialization Error */
    Error_Handler();
  }
  sConfig.DAC_SampleAndHold = DAC_SAMPLEANDHOLD_ENABLE;
  sConfig.DAC_Trigger = DAC_TRIGGER_NONE;  
  sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
  sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_INTERNAL;
  sConfig.DAC_UserTrimming = DAC_TRIMMING_FACTORY;
  sConfig.DAC_SampleAndHoldConfig.DAC_SampleTime = 20;
  sConfig.DAC_SampleAndHoldConfig.DAC_HoldTime = 10;
  sConfig.DAC_SampleAndHoldConfig.DAC_RefreshTime = 5;
  if (HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_1) != HAL_OK)
  {
    /* Channel configuration Error */
    Error_Handler();
  }
  if (HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_8B_R, 0xFF) != HAL_OK)
  {
    /* Setting value Error */
    Error_Handler();
  }
  if (HAL_DAC_Start(&hdac1, DAC_CHANNEL_1) != HAL_OK)
  {
    /* Start Error */
    Error_Handler();
  }
  HAL_SuspendTick();
  while (1)
  {
    /* USER CODE END WHILE */

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

外部中断PC13 处理函数如下所示:

/* USER CODE BEGIN 4 */
/**
  * @brief  EXTI line detection callbacks
  * @param  GPIO_Pin: Specifies the pins connected EXTI line
  * @retval None
  */
void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
{
  if (GPIO_Pin == BUTTON_USER_PIN)
  {
    UserButtonStatus = 1;
  }
}

实物验证如下所示:

0215-2.jpg





关键词: NUCLEO-U083RC     睡眠模式     DAC功能    

专家
2025-02-15 21:15:41     打赏
2楼

感谢分享


专家
2025-02-15 21:17:32     打赏
3楼

感谢分享


专家
2025-02-15 21:19:25     打赏
4楼

感谢分享


共4条 1/1 1 跳转至

回复

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