3

我正在尝试使用 DAC 和 DMA 生成频率为 8kHz 的三角波。DAC 使用定时器触发,因此 DAC 速度将为 1 MSPS。我正在研究 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);

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

4

1 回答 1

3

您没有足够的样本来获得三角波。64 个样本远远不够。(单步大于 100mV)。如果你想保持 1MS​​PS,那么最大值是 125 个样本,我认为这还不够好。

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

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

这是带有 32 个样本的 8kHz 锯齿波形图: 在此处输入图像描述

这是带有 256 个样本的 8kHz 锯齿波形图: 在此处输入图像描述

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

于 2017-08-01T14:38:38.147 回答