我正在尝试使用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};
在输出端,我没有得到适当的三角波。波的频率是正确的,但波不是完美的三角形。它有不同的上升和下降斜率(不等边)。
答案 0 :(得分:3)
你没有足够的样本来获得三角波。 64个样本远远不够。 (单步> 100mV)。如果你想保持1MSPS的最大值是125个样本,这在我看来还不够好。
每秒可以使用比1MSPS更多的样本来驱动DAC。我的记录(使用外部快速运算放大器)是5.5MSPS。使用内部缓冲区可以尝试最多2-3MSPS。
使用STM32F446生成波形,并且我的原型STM32F303 10MSPS示波器拍摄了波形图。
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