stm32L4:如何使用DAC DMA生成三角波,不均匀斜坡

stm32L4:如何使用DAC DMA生成三角波,不均匀斜坡,stm32,dma,wave,dac,triangular,Stm32,Dma,Wave,Dac,Triangular,我正在尝试使用DAC和DMA生成一个频率为8kHz的三角波。DAC使用定时器触发,因此DAC速度将为1毫秒/秒。我在stm32L476探索板工作。我正在使用stm32CUBEMX进行代码初始化。我的配置如下: 在stm32CUBEMX中: Clock configuration : system clock = 80MHz APB1 and APB2 peripheral clocks = 20 MHz

我正在尝试使用DAC和DMA生成一个频率为8kHz的三角波。DAC使用定时器触发,因此DAC速度将为1毫秒/秒。我在stm32L476探索板工作。我正在使用stm32CUBEMX进行代码初始化。我的配置如下:

在stm32CUBEMX中:

 Clock configuration : system clock = 80MHz 
                                     APB1 and APB2 peripheral clocks = 20 MHz
                                     APB1 and APB2 timer clocks = 40 MHz
                                     PLL source mux : HSI
                                     PLLM = /1
                                     *N = x10
                                      /R = /8
                                     PLLCLK selected
    Timer : Prescalar = 39
                UP counter
                Period = 1
                So that output frequency is 1 MHz to trigger the DAC.
    DAC :
              Output buffer : Enable
              Trigger : TIM7 Event out
              DMA(option inside DAC configuration in cubeMX): DAC channel 2(PA5), Half word, circular mode, priority = very             high, memory(ticked) in cubeMX
我正在使用ac6SW4stm32(系统工作台)编写代码。我为三角波创建了一个这样的数组

const uint16_t val[]={130,260,390,520,650,780,910,1040,
1170,1300,1430,1560,1690,1820,1950,2080,
2210,2340,2470,2600,2730,2860,2990,3120,
3250,3380,3510,3640,3770,3900,4030,4095,
4030,3900,3770,3640,3510,3380,3250,3120,
2990,2860,2730,2600,2470,2340,2210,2080,
1950,1820,1690,1560,1430,1300,1170,1040,
910,780,650,520,390,260,130,0};
大体上,我添加了以下三个语句。这些语句分别启动定时器、DAC和DMA

HAL_TIM_Base_Start(&htim7);
HAL_DAC_Start(&hdac1,DAC_CHANNEL_2);
HAL_DAC_Start_DMA(&hdac1, DAC_CHANNEL_2, (uint32_t*)val, 64, DAC_ALIGN_12B_R);

在输出端,我没有得到正确的三角波。波的频率是正确的,但波不是完美的三角形。它有不同的上升和下降坡度(不相等的边)。

您没有足够的样本来生成三角波。64个样本远远不够。(单步电压>100mV)。如果你想保留1MSPS,最多125个样品,这在我看来还不够好

您的DAC每秒可使用比1MSPS多得多的采样数进行驱动。我的记录(使用外部快速运算放大器)是5.5MSPS。打开内部缓冲区后,您最多可以尝试2-3MSPS

波形是使用STM32F446生成的,波形图是由我的原型STM32F303 10MSPS示波器拍摄的

这是32个样本的saw 8kHz的示波图:

这是saw 8kHz的波形图,共256个样本:


PS代码用于446RE

PS我建议使用裸寄存器方法。HAL对于非常简单的硬件(如DAC和定时器)是可用的。我尝试增加采样数,降低定时器预分频值,以提高DAC速度,从而获得8kHz的波形。但海浪仍然不均匀。如果我尝试使用频率较低的三角波,比如2kHz,我就能正确地得到它。以下是一些观察结果:1)512个样本,2MSPS dac速度,输出频率1.86kHz(似乎正确),波形正确2)256个样本,2MSPS dac速度,o/p频率=3.7kHz(频率正确),波形不均匀。除此之外,dac速度也不能增加。它给波形带来了同样的问题。而且在1MSPS下使用DAC不可能获得8kHz的输出频率吗?因为如果我增加采样数,我也必须提高DAC速度,以获得8kHz的输出。你打开输出缓冲器了吗?O当然,您必须提高| DAC的速度。但这不是问题,因为您的DAC能够在速度<2.5毫秒的情况下运行10毫秒。您只需要启用DAC内部缓冲区
TIM6 -> DIER |= TIM_DIER_UDE;
TIM6 -> PSC = PSC_Value;
TIM6 -> ARR = ARR_Value;
TIM6 -> CR2 |= TIM_CR2_MMS_1;

DAC -> CR = DAC_CR_DMAEN1 | DAC_SR_DMAUDR1 | DAC_CR_TEN1 | DAC_CR_BOFF1;
DAC -> CR |= DAC_CR_EN1;

DMA1_Stream5 -> NDTR = Nsamples;
DMA1_Stream5 -> PAR = (uint32_t)&(DAC -> DHR12R1);
DMA1_Stream5 -> M0AR = (uint32_t)Buff;
DMA1_Stream5 -> CR = (DMA_SxCR_TEIE | DMA_SxCR_CHSEL | DMA_SxCR_CIRC | DMA_SxCR_DIR_0 | DMA_SxCR_EN | DMA_SxCR_PSIZE_0 | DMA_SxCR_MSIZE_0 | DMA_SxCR_MINC | DMA_SxCR_PL_0);

TIM6 -> CR1 |= TIM_CR1_CEN;