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

时间:2017-08-01 08:37:20

标签: stm32 dma wave dac triangular

我正在尝试使用DAC和DMA生成频率为8kHz的三角波。使用定时器触发DAC,使DAC速度为1 MSPS。我正在研究stm32L476发现板。我正在使用stm32CUBEMX进行代码初始化。我的配置如下:

在stm32CUBEMX中:

Marquee

我正在使用ac6SW4stm32(系统工作台)来编写代码。我为三角波创建了一个这样的数组。

 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

主要是,我添加了以下三个陈述。这些语句分别启动定时器,DAC和DMA。

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

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

1 个答案:

答案 0 :(得分:3)

你没有足够的样本来获得三角波。 64个样本远远不够。 (单步> 100mV)。如果你想保持1MSPS的最大值是125个样本,这在我看来还不够好。

每秒可以使用比1MSPS更多的样本来驱动DAC。我的记录(使用外部快速运算放大器)是5.5MSPS。使用内部缓冲区可以尝试最多2-3MSPS。

使用STM32F446生成波形,并且我的原型STM32F303 10MSPS示波器拍摄了波形图。

这是锯8kHz的波形图,有32个样本: enter image description here

这是具有256个样本的锯8kHz的波形图: enter image description here

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;

PS代码适用于446RE