STM32H743 DAC 瞬时关闭(无下降时间)

在我们之前的文章 STM32H743 DAC 上升/下降时间实验 中,我们展示了 STM23H743 具有相对较长的约 950 纳秒的开启/关闭时间,限制了快速矩形信号的生成:

STM32H743 DAC rise fall time

然而,对于切换到满量程 VDD 或 GND 的特殊情况,有一个技巧可以获得几乎好 3 个数量级的下降时间。

与其将 DAC 设置为新值,你可以直接禁用 DAC 并让 GPIO 处理其余部分。这允许约 5ns 的极快下降时间。

注意,在 DAC 开启时将 GPIO 切换到数字模式似乎没有任何效果。

请注意,我没有采取任何措施使测量设置免受高瞬态的影响,导致一些振荡。如果你有特定要求,应该自己进行测量。

STM32H743 DAC fast fall time

从 3/4 满量程值 (3072) 的 DAC 下降时间

注意,快速开启 DAC 超出了本文的范围,但在切换 DAC 使能位时,你仍然可以轻松获得 250ns 的上升时间。

STM32H743 DAC fast rise time 250ns

代码示例

stm32h743_dac_init.c
void Init() {
    DAC_ChannelConfTypeDef sConfig = {0};

    // Initialize DAC
    hdac.Instance = DAC1;
    if (HAL_DAC_Init(&hdac) != HAL_OK)
    {
        // Initialization Error
        __BKPT();
    }

    // Configure DAC channel
    sConfig.DAC_Trigger = DAC_TRIGGER_NONE;  // No trigger, free-running mode
    sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;

    if (HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1) != HAL_OK)
    {
        // Channel configuration Error
        __BKPT();
    }

    // Enable DAC Channel and start the conversion
    if (HAL_DAC_Start(&hdac, DAC_CHANNEL_1) != HAL_OK)
    {
        // Starting Error
        __BKPT();
    }

    // Set DAC to some value, which won't be changed for this example
    if (HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, 3072) != HAL_OK)
    {
        // Setting DAC value Error
         __BKPT();
    }
}
stm32h743_dac_pulse.c
void Pulse_On() {
    // Enable DAC
    hdac.Instance->CR |= DAC_CR_EN1;

    // Set GPIO to analog mode
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = GPIO_PIN_4;
    GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}

void Pulse_Off() {
    GPIO_InitTypeDef GPIO_InitStruct = {0};
    GPIO_InitStruct.Pin = GPIO_PIN_4;
    GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
    HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, GPIO_PIN_RESET);

    // Clear EN1 bit of DAC_CR
    hdac.Instance->CR &= ~DAC_CR_EN1;
}

Check out similar posts by category: C/C++, STM32