数模转换与模数转换
这里以STM32G474为例来介绍STM32中的ADC与DAC编程
主要作为电赛的笔记
模数转换ADC
四个基本部分
- 采样:定时对连续变化的模拟信号进行测量得到的瞬时值
- 保持:采样结束后将得到信号保持一段时间,使ADC有充分时间进行ADC转换。一般采样脉冲频率越高、采样越密,采样值就越多,采样保持电路的输出信号就越接近输入信号的波形。对采样频率要求(满足采样定理):采样频率F
s>= 2*输入模拟信号频谱中最高频率Fmax - 量化:将采样电压转换为某个最小单位电压的整数倍
- 编码:用二进制代码表示量化后的量化电平
量化级越细,量化误差就越小,所用二进制代码的位数就越多,电路也越复杂
分类
常见的ADC主要分成三种:
积分型:将输入电压转换成脉冲宽度信号或脉冲频率,使用定时器/计数器获取数字值
- 优点:电路简单、分辨率高
- 缺点:转换精度依赖于积分时间,转换速率较低
逐次比较型:由一个比较器和DAC转换器通过逐次比较逻辑构成,从最高位开始顺序地对每一位将输入电压与内置DAC转换器的输出进行比较,经过n次比较来输出数字值
这个类型的ADC可以看作使用快速逼近-快速排序的方法来让DAC输出值靠近模拟值来实现ADC
- 优点:速度高,功耗低,在低分辨率(12位)式具有性价比优势
- 缺点:转换速率一般,电路规模中等
Σ-Δ调制型:使用积分器、比较器、1位DAC转换器和数字滤波器等构成,将输入电压转换成脉冲宽度信号,使用数字滤波器处理后得到数字值
- 优点:可以容易地做到高分辨率测量
- 缺点:转换速率低、电路规模大
主要参数
- 分辨率:输出数字量变化一个相邻数值所需输入模拟电压的变化量,一般用二进制的位数表示,分辨率为n表示是满刻度F
s的2的n次方分之一 - 量化误差:ADC的有限位数对模拟量进行量化而引起的误差。要准确表示模拟量,ADC的位数需要很大甚至无穷大,所以ADC器件都有量化误差。一个分辨率有限的ADC的阶梯状转换特性曲线与具有无限分辨率的ADC转化特性曲线之间的最大偏差就是量化误差
- 转换速率:每秒进行转换的次数
- 转换量程:ADC所能测量的最大电压,一般等于参考电压,超过此电压有可能损毁ADC。当信号较小时可以考虑降低参考电压来提高分辨率,改变参考电压后,对应的转换值也会改变,计算实际电压时需要将参考电压考虑进去,所以说一般参考电压都要做到很稳定且不带有高次谐波
- 偏移误差:ADC输入信号为0时,但ADC转换输出信号不为0的值
- 满刻度误差:ADC满刻度输出时对应的输入信号与理想输入信号值之差
- 线性度:实际ADC的转移函数和理想直线的最大偏移
STM32G4中的ADC
基本特性:
- 五路12/10/8/6位可编程分辨率ADC,内置自动校准
- ADC转换时间与AHB总线时钟频率无关,只能通过降低分辨率加快转换时间
- 4Msps最大转化率与全分辨率
- 每个ADC有多达19路通道,各通道AD转换可以以单一、连续、扫描或不连续方式进行,ADC结果存储在左对齐/右对齐的16位数据寄存器中
- 有外部参考引脚,允许输入电压范围独立于电源
- 可调的单端和差分模式输入
- ADC1和ADC2紧密耦合,ADC3和ADC4紧密耦合,可以分别以ADC1、ADC3作master模式进行双模式运行;ADC5独立控制
- 允许DMA控制
程序可以通过轮询、中断、定时器中断、同步、DMA等等方式来获取ADC值
使用函数HAL_ADC_Start()
启动一次ADC转换,同理可使用HAL_ADC_Start_IT()
和HAL_ADC_Start_DMA()
来以中断或DMA的方式使用ADC
使用函数HAL_ADC_GetValue()
在启动ADC转换一定延时时间后获取上次转换得到的ADC值
使用HAL_ADC_Stop()
、HAL_ADC_Stop_IT()
、HAL_ADC_Stop_DMA()
停止使用ADC
数模转换DAC
基本结构
数字寄存器:寄存输入的数字量和控制信号
模拟开关和转换网络:转换网络一般由一列电阻构成,模拟开关和对应的电阻按位加权
参考电压源:用于确定转换系数
求和放大器:对来自转换网络的模拟量进行相加
DAC的操作过程类似积分
分类
电压输出型:从电阻网络直接输出电压,通常会在输出端加放大器来降低输出阻抗。
在输出端不加放大器的电压输出型:减少了输出端部分的延迟,常用于高速场合
电流输出型:一般很少直接利用电流输出,大多数会外接电流-电压转换电路得到电压输出。根据如何进行电流-电压转换又分成两类:
- 在输出引脚上接负载电阻
- 缺点:输出阻抗高、必须在规定的输出电流范围内使用,否则可能损坏DAC
- 外接运算放大器
- 缺点:加入了外接运放和导线的延迟,响应变慢
电流输出型很少用,一般使用电压输出型
- 在输出引脚上接负载电阻
主要参数
- 分辨率:最小输出电压(也就是输入数字量为1时的电压)与最大输出电压(也就是输入数字量为最大(每一位都是1)时的电压)之比。一般通过输入数字量的位数来表示
- 转换量程:DAC能输出的最大电压,一般的关于参考电压或其倍数
- 建立时间:从输入数字量到输出模拟量之间的延时时间
- 转换精度:与ADC的转换精度类似
STM32G4中的DAC
基本特性:
- 4路配置为8位/12位的电压输出DAC,3个1MHz速率的DAC外部输出通道;4个15MHz速率的DAC内部输出通道
- 可生成噪声、三角波、锯齿波
- 可实现双DAC通道,两个通道组合在一起进行同步更新操作,转换可以独立或同步地完成
- 可通过设置独立的输入参考电压VREF+来获得更好的分辨率(注意该引脚和其他模拟外设如ADC、OPAMP等共用)
- DAC1、DAC2引脚由GPIO复用;DAC3、DAC4仅用于内部输出
- 可开启输出缓冲
- 可单独启用的DAC输出缓冲器来输出高电流
- 支持低功耗模式、采样模式、保持模式,支持独立校准
可直接使用HAL_DAC_SetValue()
来设置DAC输出值
一般将某个波形的所有输出值保存在一个数组中并传给函数来输出特定波形;可以配合定时器来输出方波、三角波等