
一个很简单的问题,我的 DAC DAC_CHANNEL_1无法输出电压。 1.首先我的ioc配置界面如下: 2.初始化代码如下: / USER CODE BEGIN Header / /**
*/ / 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引脚,单步调试,并没有电压输出。。。 所以,能否给出指导。 |
stm32G4的SPI通信问题
我在打开应用程序的时候,它报了图片里面的错误,还没进入安装界面
安装STM32CUBEIDE时提示Error launching installer,我的电脑设置的是中文简体,杀毒软件也推出了,怎么才能安装软件?
关于STM32G474 双BANK的测试问题
STM32G474CBT6上电瞬间用示波器测得io口产生较大电压(浪涌电压)
STM432G4单片机IAP程序+上位机
STM32CubeIDE报错
SDIO读取TF卡,1bit模式正常,4bit模式无法读取
cudeide执行run是烧录还是只是执行呢
STM32G473 flash擦除时程序卡死
如果是要输出一个定电压,需要hal_dac_setvalue() 和hal_dac_start()这两句就可以,所以把它们放到while前面
DAC响应是有一定时间的。
貌似代码跑得太快了。
所以最好调整一下逻辑。
[md]你好,按照你的描述,我把那两句代码放在while之前,还是没有电压输出,这是为何呢?
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 /
}
检查一下硬件是否有问题了,比如vref对吗?
vref我测的是0v
是硬件问题吗?需要多少的参考电压
看下芯片手册里面关于vref的章节描述
这个里的VREFBUF_CSR怎么设置?我们的硬件工程师回复的是他接的是一个电容。
找到问题了,硬件没有作外置参考电压。拉高vref就可以了
但是,硬件改动成本较大。
请问,软件程序上怎么修改?如何使用内置的参考?
试试下面的配置方式行不行
是的,内部也可以了
但是我看了许多资料,有开发者说内部的参考寄存器--VREFBUF寄存器有局限。
所以想请教几个问题:
1.内部的最大参考是2.9V,这个值还可以改变吗?毕竟与3.3V差距还是比较大。
2.我DAC使用内部参考后,HAL_DAC_SetValue(&hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 4095);似乎也只能输出到2.9V,也是无法继续增大的是吧?
3.内部的参考是否稳定呢?与外部相比较来说是不是精度不好?他们主要的区别是什么?
感谢!
1. 只能是这几个选项,最大2.9 v。 内部是没有做升压的。
2. 因为参考电压就只有2.9,所以最大输出就只能到这了。
3. 这是个电压稳定精度数据手册上有,已经很高了。 如果需要更高标准的,就要外接,估计成本不会低的。