03 DAC
Digital-to-Analog Converter 数模转换器
up的视频讲解: https://space.bilibili.com/1455872040
1 💫 DAC 简介

DAC (Digital-to-Analog Converter)数模转换器,是指将离散的0 1数字信号 转换为 模拟信号的器件
-
F103C8T6 没有内置 DAC, up在扬声器模块下加了一个外置DAC
-
是12 位精度 所以DAC的输出范围在(0 ~ 4095) 输出精度在(1/4096)
-
有两个用途:输出波形 和 输出固定电压
1 🔄 DA转换原理

我们怎么样通过01电平控制开关 从而实现 任意波形 的输出呢?我们可以这样
-
将电源和地之间的电压通过
n个电阻将电压分为n等分 -
然后在每个节点 添加一个开关
-
需要哪个电压的时候就让这个开关导通 从而输出 对应电压

- 然后我们再通过 开关的快速切换从而输出
阶梯状波形 - 这时候我们再简单通过电容滤波一下 就可以得到我们想要的模拟信号了
这就是DA转换的思路 但用这种方式 我们需要n个电阻和 n个开关去实现

- 如果要将VCC分为 10等分 就需要 10个开关
- 如果要分为 4096等分 则需要 4096个开关
很显然这太浪费MOS管了 所以我们可以将它改进一下 首先将这个开关改进

通过两个MOS管 我们就可以形成一个 单刀双掷的开关

接着我们再改进一下这个这个电路的连接
-
我们将一端接地 另一端作为输出
-
再通过阻值为 2R的电阻连接每个节点 构成一个
T型的电阻网络 -
然后再将每个2R的一端接到我们改进的单刀双掷开关

我们先将他简化为 3个开关控制的情况
-
再从左边开始 先看到 第一个开关对应的部分
-
将后面的电路看为负载 将后面的负载断开
-
此时我们就可以对这一小部分进行单独的分析

这个黑盒子的 输出电压
- 很显然两个2R分压 中间点的电压就是 二分之一个VCC
- 因为此时负载断开 我们也可以叫它
开路电压
然后我们再把黑盒子里面的电 关掉
- 此时VCC和GND都是 0v 那么我么从输出点看进去很显然 是两个2R电阻的并联
- 整体的阻值就为R 我们也可以叫它
等效内阻
那么这时候我们就可以把这个黑盒子等效为 一个二分之一VCC的电压源串联一个电阻R
这样的等效方式在线性电路里面很常用 刚才的操作也可以总结为两步:
- 去负载求开路电压
- 独立源置零求等效内阻



-
接着我们将等效后的部分 放回原来的电路 接着我们再将它 与第二个开关对应的部分进行戴维南等效
-
此时我们得到的等效电路为 四分之一VCC电压源 串联一个电阻R
-
我们再将它放回原来的电路 很显然 如果再进行戴维南等效的话 最后的输出电压就是 8分之VCC
通过这几次等效后 我们就可以发现 规律 越左边等效的次数越多 每次等效电压源就变为一半

对于3个开关对应的 3位 最低位为1输出的是 8分之一
- 也就是 2的3次方分之2的0次方
- 分母对应的 就是位数 也就是多少bit的精度
- 分子则对应 具体的输出值

我们再将它拓展到12位
- 此时分母也就是 2的12次方 分子最低位为1其他为0 也就对应 2的0次方
- 所以最终的输出值是 4096分之一的VCC
所以通过这样的方式 我们只需要 12个改进后的开关 也就是24个MOS管就可以实现12位的精度
这也就是STM32内部DAC的硬件原理 而这个电路也有它专属的名字 叫做R2R T型电阻网络
2 DAC外设结构

我们从信号的 触发 --> 生成 --> 输出 这个流程来分析DAC的结构
- 信号触发
-
TIM2,TIM4,TIM5,TIM6,TIM7,TIM8 定时器触发
-
EXTI9外部中断线触发
-
软件触发
- 信号生成
-
DAC受
DOR寄存器直接控制的,但是数据并不是直接传入DOR的,需要先传入DHR之后在间接地传给DOR寄存器-
如果没有选择硬件触发(TENx=0),在一个APB1周期后传入
DOR -
如果选择硬件触发(TENx=1),则在3个APB1周期后传入
DOR
-
-
一旦数据装入
DOR寄存器,在经过时间Testting(大约3us) 之后,输出即有效 -
LFSRx噪声波形模块 线性移位寄存器,生成伪随机噪声数字序列 -
trianglex三角波模块,自动递增 / 递减数字值;MAMPx[3:0] 设置三角波峰值幅度
- 信号输出
-
DAC输出电压 = VREF x (DOR / 4095)
- DAC电压输出范围为0到参考电压VREF+
这里的 DA转换器 也就是刚刚讲到的R2RT型电阻网络 上面的 DOR 就是控制这12个开关的寄存器
但CPU不能直接写DOR 它是一个只读的寄存器 只能写到这个DHR 然后通过中心的这个control logicx控制器 每来一个 左上角的触发源信号 就将DHR中的数据往 DOR搬运一次
而左上角的触发源 以及中心的这个control logicx都由右上角的 这个DAC control register配置寄存器控制
通过配置它我们就可以选择触发来源以及配置control logicx的模式
这里的触发源可以选择 由软件触发 定时器触发 以及EXTI外部中断源触发 等等
这里的DAC模式 可以配置为 噪声生成模式 三角波生成模式 或者默认从DHR中搬运数据
这个DHR也可以通过DMA写 control logicx每将DHR拷贝到DOR的时候 就会发送DMA请求 此时DMA就会把下一个数据写道DHR里面
根据上面可知,数据先写入DHR寄存器,然而实际上DHR一共有3个寄存器对应三种数据格式(不通过移位, 减小CPU负担)
-
8位数据右对齐
-
12位数据左对齐
-
12位数据右对齐
✅区分片内DAC与本课程模块
F103C8T6没有片内DAC,本课程通过IIC驱动外置MCP4725。理论中的触发、片内DMA数据寄存器等结构用于理解带DAC的型号,不代表C8T6上存在对应外设。
对本节12位外置DAC,输入码0~4095,理想输出按VOUT=VDD×code/4096理解,满码略低于供电电压;实测还受电源、负载、输出摆幅及误差影响。输出电压可以由万用表验证,但DAC不等于功率放大器,扬声器负载要经过相应驱动电路。