STM32笔记--通过DMA传递给DAC12位右对齐双寄存器
遇到的问题:
(1)为什么DMA的数据不递增的情况下输出固定(参数一次循环16次),而在数据递增的模式下(参数一次循环一次递给多个值)
(2)为什么传递过来的数值与PA14和PA15绑定在一起变更
DAC触发方式:
以上选择8个触发事件之一触发DAC转换,但支持DMA请求的有7种(除软件触发以外)。
DAC模块方图:
方图中主要是围绕数字至模拟转换器x展开。在使用 DAC 时,不能直接对上述 DORx 寄存器写入数据,任何输出到 DAC 通道 x 的数据都必须写入到 DHRx 寄存器中。数据被写入到 DHRx 寄存器后,DAC 会根据触发配置进行处理,DHRx 中的数据会在 3 个 APB1 时钟周期后传输至 DORx,随之而后经过数字至模拟转换器x产生相应的模拟电压。
DAC相关寄存器:
DAC配置的特殊注意点:
在 STM32 中具有 2 个这样的 DAC 部件,每个 DAC 有 1 个对应的输出通道连接到特定的引脚,即:PA4-通道 1,PA5-通道 2,为避免干扰,使用 DAC 功能时,DAC 通道引 脚需要被配置成模拟输入功能(AIN)。
DAC输出电压:
数字输入经过DAC被线性地转换为模拟输出,其范围为0到Vref+。
DAC通道引脚上的输出电压满足下面关系:
以 12 位 右 对 齐 方 式 有 12bit,2 ^ 12 = 4095 ,参 考 电 压 为 3.3V
DAC输出=Vref x (DOR/4095)
数据输入DHRx寄存器中,有多个不同类型的寄存器。比如上图的双DAC的12位右对齐数据保持寄存器,还有DAC通道 1 的 12 位左对齐数据保持寄存器,具体可参考手册中的说明。本文开头的问题可能就在此处解决。
12位右对齐数据DAC地址:
#define DAC_DHR12RD_Address 0x40007420
使能DAC输出缓存
DAC集成了2个输出缓存,可以用来减少输出阻抗,无需外部运放即可直接驱动外部负载。每个DAC通道输出缓存可以通过设置DAC_CR寄存器的BOFFx位来使能或者关闭。
DMA请求映射:
DAC的DMA请求挂接在DMA2中的通道3和通道4中
DAC初始化:
DAC软件触发配置步骤要点:
1)初始化GPIO引脚为模拟输入,初始化 DAC 工作模式
2)注意DAC 工作模式选择那种触发方式。除软件触发以外其他触发都支持DMA请求
3)换算所要的值让其直观,再调用固件的软件触发函数和DAC通道使能函数
DAC定时器触发配置步骤要点:
1)初始化GPIO引脚为模拟输入,初始化 DAC 工作模式
2)注意DAC 工作模式选择定时器触发方式,配置相关信息
3)配置触发的定时器预分频值和ARR计数值
4)配置DMA的初始化,内存地址递增模式下,注意这里DMA.Mode循环模式下,这里可能就是地址一直在轮询方式
5)前提已声明变量传递给DMA的赋值内存地址数据
附上相关代码:
(1)软件触发,无波形
(2)定时器触发
(3)三角波
还有一种运用PWM信号输出DAC电平,尚未运用过不用还是PWM引脚数量还是挺可观的。
简单的基本电路运用了三极管驱动-稳压二极管-二阶低通滤波器-电压跟随器-完成