gpt4 book ai didi

stm32L4 : How to generate triangular wave using DAC DMA, 斜坡不平坦

转载 作者:行者123 更新时间:2023-12-01 19:08:51 25 4
gpt4 key购买 nike

我正在尝试使用 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};

在 main 中,我添加了以下三个语句。这些语句分别启动定时器、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)。如果你想保持 1MS​​PS,最大采样数是 125 个,我认为这还不够好。

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

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

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

这是锯齿波 8kHz、256 个样本的波形图: 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

关于stm32L4 : How to generate triangular wave using DAC DMA, 斜坡不平坦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45432874/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com