你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

stm32g431cbu6,dac无法输出

[复制链接]
知更鸟 提问时间:2024-3-8 13:24 / 未解决

一个很简单的问题,我的 DAC DAC_CHANNEL_1无法输出电压。

1.首先我的ioc配置界面如下:

image.png

image.png

image.png

image.png

2.初始化代码如下:

/ USER CODE BEGIN Header /

/**


  • @file dac.c

  • @brief This file provides code for the configuration

  • of the DAC instances.

  • @attention

  • Copyright (c) 2024 STMicroelectronics.

  • All rights reserved.

  • This software is licensed under terms that can be found in the LICENSE file

  • in the root directory of this software component.

  • If no LICENSE file comes with this software, it is provided AS-IS.


*/

/ USER CODE END Header /

/ Includes ------------------------------------------------------------------/

include "dac.h"

/ USER CODE BEGIN 0 /

/ USER CODE END 0 /

DAC_HandleTypeDef hdac1;

/ DAC1 init function /

void MX_DAC1_Init(void)

{

/ USER CODE BEGIN DAC1_Init 0 /

/ USER CODE END DAC1_Init 0 /

DAC_ChannelConfTypeDef sConfig = {0};

/ USER CODE BEGIN DAC1_Init 1 /

/ USER CODE END DAC1_Init 1 /

/** DAC Initialization

*/

hdac1.Instance = DAC1;

if (HAL_DAC_Init(&hdac1) != HAL_OK)

{

Error_Handler(); }

/** DAC channel OUT1 config

*/

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_NONE;

sConfig.DAC_Trigger2 = DAC_TRIGGER_NONE;

sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_DISABLE;

sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_EXTERNAL;

sConfig.DAC_UserTrimming = DAC_TRIMMING_FACTORY;

if (HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_1) != HAL_OK)

{

Error_Handler(); }

/ USER CODE BEGIN DAC1_Init 2 /

HAL_DAC_Start(&hdac1, DAC_CHANNEL_1);

HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 0);

/ USER CODE END DAC1_Init 2 /

}

void HAL_DAC_MspInit(DAC_HandleTypeDef* dacHandle)

{

GPIO_InitTypeDef GPIO_InitStruct = {0};

if(dacHandle->Instance==DAC1)

{

/ USER CODE BEGIN DAC1_MspInit 0 /

/ USER CODE END DAC1_MspInit 0 /

/ DAC1 clock enable /

__HAL_RCC_DAC1_CLK_ENABLE();

__HAL_RCC_GPIOA_CLK_ENABLE();

/**DAC1 GPIO Configuration

PA4 ------> DAC1_OUT1

*/

GPIO_InitStruct.Pin = GPIO_PIN_4;

GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;

GPIO_InitStruct.Pull = GPIO_NOPULL;

HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

/ DAC1 interrupt Init /

HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 0, 0);

HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn); / USER CODE BEGIN DAC1_MspInit 1 /

/ USER CODE END DAC1_MspInit 1 /

}

}

void HAL_DAC_MspDeInit(DAC_HandleTypeDef* dacHandle)

{

if(dacHandle->Instance==DAC1)

{

/ USER CODE BEGIN DAC1_MspDeInit 0 /

/ USER CODE END DAC1_MspDeInit 0 /

/ Peripheral clock disable /

__HAL_RCC_DAC1_CLK_DISABLE();

/**DAC1 GPIO Configuration

PA4 ------> DAC1_OUT1

*/

HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4);

/ DAC1 interrupt Deinit /

HAL_NVIC_DisableIRQ(TIM6_DAC_IRQn); / USER CODE BEGIN DAC1_MspDeInit 1 /

/ USER CODE END DAC1_MspDeInit 1 /

}

}

/ USER CODE BEGIN 1 /

/ USER CODE END 1 /

3.main函数:

int main(void)

{

/ USER CODE BEGIN 1 /

/ USER CODE END 1 /

/ MCU Configuration--------------------------------------------------------/

/ Reset of all peripherals, Initializes the Flash interface and the Systick. /

HAL_Init();

/ USER CODE BEGIN Init /

/ USER CODE END Init /

/ Configure the system clock /

SystemClock_Config();

/ USER CODE BEGIN SysInit /

/ USER CODE END SysInit /

/ Initialize all configured peripherals /

MX_GPIO_Init();

MX_DMA_Init();

MX_TIM1_Init();

MX_USART1_UART_Init();

MX_TIM2_Init();

MX_TIM4_Init();

MX_DAC1_Init();

/ USER CODE BEGIN 2 /

__HAL_TIM_CLEAR_IT(&htim1,TIM_IT_UPDATE);//清除中断标志位

HAL_TIM_Base_Start_IT(&htim1);

HAL_DAC_Start(&hdac1, DAC_CHANNEL_1);

/ USER CODE END 2 /

/ Infinite loop /

/ USER CODE BEGIN WHILE /

while (1)

{

/ USER CODE END WHILE /

/ USER CODE BEGIN 3 /

HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 2000);

HAL_DAC_Start(&hdac1, DAC_CHANNEL_1);

HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 0); }

/ USER CODE END 3 /

}


我用示波器点PA4引脚,单步调试,并没有电压输出。。。

所以,能否给出指导。

收藏 评论12 发布时间:2024-3-8 13:24

举报

12个回答
yr 回答时间:2024-3-8 14:34:32

如果是要输出一个定电压,需要hal_dac_setvalue() 和hal_dac_start()这两句就可以,所以把它们放到while前面

butterflyspring 回答时间:2024-3-8 14:48:01

DAC响应是有一定时间的。
貌似代码跑得太快了。
所以最好调整一下逻辑。
知更鸟 回答时间:2024-3-8 15:37:26

yr 发表于 2024-3-8 14:34
如果是要输出一个定电压,需要hal_dac_setvalue() 和hal_dac_start()这两句就可以,所以把它们放到whil ...

[md]你好,按照你的描述,我把那两句代码放在while之前,还是没有电压输出,这是为何呢?

yr 回答时间:2024-3-8 16:22:35

sConfig.DAC_Trigger = DAC_TRIGGER_NONE;这个要选software触发啊

知更鸟 回答时间:2024-3-11 08:44:21

yr 发表于 2024-3-8 16:22
sConfig.DAC_Trigger = DAC_TRIGGER_NONE;这个要选software触发啊

按照你的指示,尝试了还是不行

如下是dac.c:

/ USER CODE BEGIN Header /

/**


  • @file dac.c

  • @brief This file provides code for the configuration

  • of the DAC instances.

  • @attention

  • Copyright (c) 2024 STMicroelectronics.

  • All rights reserved.

  • This software is licensed under terms that can be found in the LICENSE file

  • in the root directory of this software component.

  • If no LICENSE file comes with this software, it is provided AS-IS.


*/

/ USER CODE END Header /

/ Includes ------------------------------------------------------------------/

include "dac.h"

/ USER CODE BEGIN 0 /

/ USER CODE END 0 /

DAC_HandleTypeDef hdac1;

/ DAC1 init function /

void MX_DAC1_Init(void)

{

/ USER CODE BEGIN DAC1_Init 0 /

/ USER CODE END DAC1_Init 0 /

DAC_ChannelConfTypeDef sConfig = {0};

/ USER CODE BEGIN DAC1_Init 1 /

/ USER CODE END DAC1_Init 1 /

/** DAC Initialization

*/

hdac1.Instance = DAC1;

if (HAL_DAC_Init(&hdac1) != HAL_OK)

{

Error_Handler(); }

/** DAC channel OUT1 config

*/

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_SOFTWARE;

sConfig.DAC_Trigger2 = DAC_TRIGGER_NONE;

sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;

sConfig.DAC_ConnectOnChipPeripheral = DAC_CHIPCONNECT_EXTERNAL;

sConfig.DAC_UserTrimming = DAC_TRIMMING_FACTORY;

if (HAL_DAC_ConfigChannel(&hdac1, &sConfig, DAC_CHANNEL_1) != HAL_OK)

{

Error_Handler(); }

/ USER CODE BEGIN DAC1_Init 2 /

HAL_DAC_Start(&hdac1, DAC_CHANNEL_1);

HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 0);

/ USER CODE END DAC1_Init 2 /

}

void HAL_DAC_MspInit(DAC_HandleTypeDef* dacHandle)

{

GPIO_InitTypeDef GPIO_InitStruct = {0};

if(dacHandle->Instance==DAC1)

{

/ USER CODE BEGIN DAC1_MspInit 0 /

/ USER CODE END DAC1_MspInit 0 /

/ DAC1 clock enable /

__HAL_RCC_DAC1_CLK_ENABLE();

__HAL_RCC_GPIOA_CLK_ENABLE();

/**DAC1 GPIO Configuration

PA4 ------> DAC1_OUT1

*/

GPIO_InitStruct.Pin = GPIO_PIN_4;

GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;

GPIO_InitStruct.Pull = GPIO_NOPULL;

HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

/ DAC1 interrupt Init /

HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 0, 0);

HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn); / USER CODE BEGIN DAC1_MspInit 1 /

/ USER CODE END DAC1_MspInit 1 /

}

}

void HAL_DAC_MspDeInit(DAC_HandleTypeDef* dacHandle)

{

if(dacHandle->Instance==DAC1)

{

/ USER CODE BEGIN DAC1_MspDeInit 0 /

/ USER CODE END DAC1_MspDeInit 0 /

/ Peripheral clock disable /

__HAL_RCC_DAC1_CLK_DISABLE();

/**DAC1 GPIO Configuration

PA4 ------> DAC1_OUT1

*/

HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4);

/ DAC1 interrupt Deinit /

HAL_NVIC_DisableIRQ(TIM6_DAC_IRQn); / USER CODE BEGIN DAC1_MspDeInit 1 /

/ USER CODE END DAC1_MspDeInit 1 /

}

}

/ USER CODE BEGIN 1 /

/ USER CODE END 1 /


如下是main函数:

int main(void)

{

/ USER CODE BEGIN 1 /

/ USER CODE END 1 /

/ MCU Configuration--------------------------------------------------------/

/ Reset of all peripherals, Initializes the Flash interface and the Systick. /

HAL_Init();

/ USER CODE BEGIN Init /

/ USER CODE END Init /

/ Configure the system clock /

SystemClock_Config();

/ USER CODE BEGIN SysInit /

/ USER CODE END SysInit /

/ Initialize all configured peripherals /

MX_GPIO_Init();

MX_DMA_Init();

MX_TIM1_Init();

MX_USART1_UART_Init();

MX_TIM2_Init();

MX_TIM4_Init();

MX_DAC1_Init();

/ USER CODE BEGIN 2 /

__HAL_TIM_CLEAR_IT(&htim1,TIM_IT_UPDATE);//清除中断标志位,防止一使能定时器就进入中断

HAL_TIM_Base_Start_IT(&htim1);

HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 2000);

HAL_DAC_Start(&hdac1, DAC_CHANNEL_1);

//HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 0);

/ USER CODE END 2 /

/ Infinite loop /

/ USER CODE BEGIN WHILE /

while (1)

{

/ USER CODE END WHILE /

/ USER CODE BEGIN 3 / }

/ USER CODE END 3 /

}

yr 回答时间:2024-3-11 09:53:17

检查一下硬件是否有问题了,比如vref对吗?

知更鸟 回答时间:2024-3-11 11:17:06

yr 发表于 2024-3-11 09:53
检查一下硬件是否有问题了,比如vref对吗?

vref我测的是0v

image.png

是硬件问题吗?需要多少的参考电压

知更鸟 回答时间:2024-3-11 12:46:20

yr 发表于 2024-3-11 09:53
检查一下硬件是否有问题了,比如vref对吗?

看下芯片手册里面关于vref的章节描述

image.png

这个里的VREFBUF_CSR怎么设置?我们的硬件工程师回复的是他接的是一个电容。

知更鸟 回答时间:2024-3-11 14:31:10

yr 发表于 2024-3-11 09:53
检查一下硬件是否有问题了,比如vref对吗?

找到问题了,硬件没有作外置参考电压。拉高vref就可以了

但是,硬件改动成本较大。

请问,软件程序上怎么修改?如何使用内置的参考?

butterflyspring 回答时间:2024-3-11 16:12:56
知更鸟 发表于 2024-3-11 14:31
[md]

找到问题了,硬件没有作外置参考电压。拉高vref就可以了

试试下面的配置方式行不行

STM32G431 VREFBUF IN REFERENCE.PNG
知更鸟 回答时间:2024-3-11 16:20:53

butterflyspring 发表于 2024-3-11 16:12
试试下面的配置方式行不行

是的,内部也可以了

但是我看了许多资料,有开发者说内部的参考寄存器--VREFBUF寄存器有局限。

所以想请教几个问题:

1.内部的最大参考是2.9V,这个值还可以改变吗?毕竟与3.3V差距还是比较大。

2.我DAC使用内部参考后,HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 4095);似乎也只能输出到2.9V,也是无法继续增大的是吧?

3.内部的参考是否稳定呢?与外部相比较来说是不是精度不好?他们主要的区别是什么?

感谢!

butterflyspring 回答时间:2024-3-11 16:35:28
知更鸟 发表于 2024-3-11 16:20
[md]是的,内部也可以了

但是我看了许多资料,有开发者说内部的参考寄存器--VREFBUF寄存器有局限。

1. 只能是这几个选项,最大2.9 v。 内部是没有做升压的。
2. 因为参考电压就只有2.9,所以最大输出就只能到这了。
3. 这是个电压稳定精度数据手册上有,已经很高了。 如果需要更高标准的,就要外接,估计成本不会低的。
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版