STM32H743 DAC sofortiges Ausschalten (keine Fallzeit)

In unserem vorherigen Beitrag STM32H743 DAC Anstiegs-/Abfallzeit-Experimente haben wir gezeigt, dass der STM23H743 relativ lange Einschalt-/Ausschaltzeiten von ungefähr 950 Nanosekunden hat, was die Erzeugung schneller Rechtecksignale einschränkt:

STM32H743 DAC rise fall time

Es gibt jedoch einen Trick, wie man Abfallzeiten beinahe 3 Größenordnungen besser erhält für den Sonderfall des Schaltens entweder auf Vollskala VDD oder auf GND.

Anstatt den DAC auf den neuen Wert zu setzen, können Sie einfach den DAC deaktivieren und den Rest dem GPIO überlassen. Dies erlaubt extrem schnelle Abfallzeiten von ungefähr 5ns.

Beachten Sie, dass das Umschalten des GPIO in den digitalen Modus, während der DAC an ist, keine Auswirkung zu haben scheint.

Bitte beachten Sie, dass ich keine Mühe darauf verwandt habe, den Messaufbau immun gegen die hohen Transienten zu machen, was zu einigen Oszillationen führt. Sie sollten eigene Messungen durchführen, wenn Sie spezifische Anforderungen haben.

STM32H743 DAC fast fall time

DAC-Abfallzeit von 3/4-Vollskala-Wert (3072)

Beachten Sie, dass das schnelle Einschalten des DAC nicht im Rahmen dieses Beitrags liegt, aber beim Umschalten des DAC-Enable-Bits können Sie dennoch ziemlich leicht 250ns-Anstiegszeiten erhalten.

STM32H743 DAC fast rise time 250ns

Codebeispiel

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