在DAC模拟输出的应用中,我们往往需要输出一组buffer来组成一个或连续重复的特殊波形(如方波、正弦波、锯齿波等),同时需要控制这些波形的输出频率。这时,我们需要借用ST MCU内部timer定时触发DAC每次输出,以实现特殊波形的频率控制。例如:
const uint16_t single_buffer[100] = {1000, 1005, 1010,,1015,1020,……(中间省略),1250,1245,1240,1235,1230,……(中间省略),1010,1005};这个数组中存的100个数值,若用DAC输出,是一个标准的三角波。为了让该三角波的周期达到1ms,我们需要让每次DAC输出间隔10us,输出这组数组后,三角波的周期恰好为1ms。因此,我们需要借助定时器的触发功能来实现DAC输出间隔,即通过定时器触发DAC输出。
下面介绍STM32通过timer触发DAC,并且通过DMA实时搬运至pin脚在cubeMX上的配置
1. 选择您的MCU型号(本文以STM32H5系列为例),并配置好对应的时钟RCC(此步略)
2. 配置DAC,以DAC1的OUT1为例,先要配置out1输出至only external pin,其它DAC配置根据需求,关键配置是:trigger(配置为timer1 trigger out event),即利用timer1来触发DAC输出事件,这样就将timer1和DAC输出关联起来。

3. 配置定时器:刚才我们关联了timer1和DAC,现在转入timer1配置。其它模式、触发都不管(那些都是其它外部信号触发timer的,和我们的需求无关,我们需要timer1触发DAC)。所以直接做关键配置:clock source配置为internal clock,让timer1运行起来。再配置counter period计数周期,来实现timer1的定时周期(若需10us触发一次,根据时钟和计数值,计算并配置出timer1的周期10us即可)。再配置触发事件:选择update event。

4. 配置DMA:以GPDMA1为例,先选择一个通道,这里我们选择ch7,设置为standard request mode。再配置request,选择DAC1_CH1,与刚才配置的DAC关联起来。direct选择memory to peripheral(内存至外设)。最后配置DMA中断事件:选择传输完成事件(如图)


5.这时我们再转到NVIC setting,看到DMA全局中断已强制被选中。当数据搬运完就可以实现DMA中断了

6. 点击cubeMX generate生成project,打开程序,如下,按照需求设置sinewave32的数组值,以及wave_sample数据值数量,调用HAL_DAC_Start_DMA()函数,程序就可以运行起来。

此时,timer按照一定周期触发DAC,实现了周期控制。DAC每次输出,DMA都会及时搬运至pin脚。当DAC数组生成并搬运完毕。DMA进入完成中断。该功能就实现了。
本篇作者-友尚集团-夏翼
234

被折叠的 条评论
为什么被折叠?



