STM32学习:DMA + DAC + TIM 任意波形输出(心形)

参加电子设计竞赛,AD\DA 转化肯定少不了, 最近看了那本 STM32 库开发指南,也算是写写读书笔记了。

需要注意的是,STM32F103RB 不支持DAC, 所以我调了半天发现无波形输出, 最后无奈想着拿STMCubeMX 生成试试吧,结果发现STMCubeMX 中STM32F103RB根本没有DAC 选项。 无奈,换上STM32F103RC,波形正常。

STM32F103RC 有两个12位带缓冲的DAC通道可以用于转换2路数字信号成为2路模拟电压信号并输出。这项功能内部是通过集成的电阻串和反向的放大器实现。STM32F103xC、STM32F103xD和STM32F103xE增强型产品中有8个触发DAC转换的输入。DAC通道可以由定时器的更新输出触发,更新输出也可连接到不同的DMA通道。

这些都是STM32 手册上的,不再赘述,主要说一下流程吧,鄙人的见解,可能有误,多多批评指正。TIM6和TIM7 是用来驱动DAC的两个时钟,我们用时钟来控制DAC的节奏, 每次DAC后,DMA向DAC写入一个值并等待,  直到下一次触发DAC.

DAC最大电压3,3V, 对应值为4095,DAC需要初始化外设, 外设在总线AHB上

因此,STM32F103RC 的DAC 频率为 f=(72MHZ / 点数 / (TIM_Period+1) )

因为每次TIM 触发一次DAC, DMA配置的为循环的,点数组从头到位走过一编才相当于进行了一个周期,因此相当于对时钟频率进行了 点数倍的分频

 

 

老师让我们练习这个, 突然想起来花样搞一下DAC, 输出个心形到示波器也是很不错的么

预先用函数生成波形,然后写到数组里,初始化GPIO TIM DAC, 然后启动TIM,初始化完毕。

首先,拿Matlab 生成一个心形图案,  其实放大了看就是方波,因此它的包络线在示波器上应该是个心形。

QQ图片20170801192505.png

然后将生成的数值写到代码里,

最后生成的波形:(感觉十分有爱的两个运算放大器)

QQ图片20170801192834.jpg

代码大致如下:

(有需要全部代码的请留言)

发表评论