学习STM32(6)-- STM32单片机ADC&DAC的应用

1 引 言

深入了解并掌握STM32F103单片机在模拟数字转换(ADC)和数字模拟转换(DAC)应用方面的功能和操作。学习如何配置STM32F103的ADC模块,实现模拟信号到数字信号的精确转换;同时,探索DAC模块的工作原理和使用方法,实现数字信号到模拟信号的转换。这些技能的掌握对于未来在嵌入式系统设计、信号处理等领域的工作是非常重要的。

2 实验目的

1.掌握 STM32F103 的 ADC 的使用

2.了解 STM32F103 的 DAC 的使用

3 实验内容

3.1 ADC 概念

ADC(模拟-数字转换器)是一种将连续的模拟信号转换成离散的数字信号的电子设备。在各种电子系统中,ADC扮演着重要的角色,特别是在需要将模拟世界的物理量(如温度、压力、声音等)转换为数字形式以供微处理器处理的场合。

模拟信号是连续变化的,而数字信号则是由离散的数值组成的。ADC通过几个关键的步骤将模拟信号转换成数字信号:

**采样:**在固定的采样率下获取模拟信号的瞬时值。

**量化:**将采样得到的连续幅值转换成最接近的数字级别。这个过程中通常会产生一些量化误差。

**编码:**将量化后的数值转换成二进制形式。

ADC的性能主要由两个参数来衡量:

**分辨率:**ADC的分辨率决定了它能区分的最小电压变化量,通常用位数来表示。例如,一个8位的ADC能将输入信号分成2^8(即256)个不同的电压级别。

**采样率:**采样率决定了ADC每秒可以采样的次数,高采样率可以更精确地追踪信号的变化。

由于数字信号更易于存储和处理,因此ADC在数字信号处理、通信系统、图像处理和其他许多需要数字化实时信号的领域中非常关键。在设计和选择ADC时,需要根据应用的需求来选择适当的分辨率和采样率。

3.2 ADC 功能框图剖析

图1 功能框图

若输入电压范围设定在:0~3.3v,因为 ADC是 12 位的(4096),满量程对应的就是3.3V;数值0 对应的就是 0V。

如果转换后的数值为 X ,X 对应的模拟电压为 Y,

那么会有这么一个等式成立:2^12 / 3.3 = X / Y

则 Y = (3.3 * X ) / 2^12

3.3 ADC 编程要点

图2 ADC初始化例子

(1)初始 ADC 用到的 GPIO;

图3 ADC的GPIO例子

(2)设置 ADC 的工作参数并初始化;

(3)设置 ADC 工作时钟;

(4)设置 ADC 转换通道顺序及采样时间;

(5)配置使能 ADC 转换完成中断,在中断内读取转换完数据;

(6)使能 ADC;

(7)使能软件触发 ADC 转换。

图4 ADC工作参数配置例子

3.4 DAC 概念

DAC(数字-模拟转换器)是一种将数字信号转换成连续的模拟信号的电子设备。它是许多数字电子系统中不可或缺的组件,尤其是在需要将数字数据转换为模拟信号以驱动其他硬件(如扬声器、电机等)的应用中。

DAC的工作原理与ADC相反,其主要步骤包括:

**接收数字信号:**DAC接收的数字信号通常是二进制形式的数据。

**转换:**将接收到的数字信号转换为相对应的模拟电压或电流。

**输出模拟信号:**输出的模拟信号通常是连续变化的,这个信号可以用来驱动其他模拟系统或设备。

DAC的关键性能参数主要有:

**分辨率:**DAC的分辨率是指它能输出的最小模拟信号变化的能力,通常也用位数来表示。分辨率越高,输出的模拟信号就越精确。

**更新率:**也称为转换率,是DAC每秒可以更新输出信号的次数。更新率越高,DAC输出的信号就越能忠实地再现输入的数字信号。

DAC广泛应用于声音播放(如音频DAC)、视频显示、信号生成和通信系统等领域。在设计这些系统时,DAC的选择和优化对于保证整个系统性能至关重要。DAC确保了数字技术能够有效地与模拟世界相互作用。

3.5 DAC 功能框图

图5 DAC功能框图

"数字至模拟转换器 x"是核心部件,整个 DAC 外设都围绕它而展开。它以左边的 VREF+作为参考电源,以 DAC 的数据寄存器"DORx"的数字编码作为输入,经过它转换得的模拟信号由右侧的"DAC_OUTx"通道输出。其中各个部件中"x"是指设备的标号,在 STM32 中具有 2 个这样的 DAC 部件,每个 DAC 有 1 个对应的输出通道连接到特定的引脚,即:PA4-通道 1,PA5-通道 2,为避免干扰,使用 DAC 功能时,DAC 通道引脚需要被配置成模拟输入功能(AIN)。

3.7 定时器设置分频系数和周期--计算波形的频率公式

图6 频率计算公式

4 深入分析

思考一

实验源码"31-ADC-电压采集:1-ADC-单通道(中断读取)",查找电路图和程序,确认ADC硬件对应的引脚号; 改变ADC的采样时钟实现三种不同采样速度的 ADC数据采集。

图7 ADC IO 分配

图8 ADC硬件对应的引脚号

图9 改变ADC的采样时间

将ADC_SampleTime_55Cycles5改为ADC_SampleTime_1Cycles5,ADC_SampleTime_7Cycles5,ADC_SampleTime_13Cycles5等等就可以实现实现三种不同采样速度的 ADC数据采集。

图10 可以使用的采样时间

ADC_SampleTime_1Cycles5: Sample time equal to 1.5 cycles 采样时间等于1.5个周期

ADC_SampleTime_7Cycles5: Sample time equal to 7.5 cycles 采样时间等于7.5个周期

ADC_SampleTime_13Cycles5: Sample time equal to 13.5 cycles 采样时间等于13.5个周期

ADC_SampleTime_28Cycles5: Sample time equal to 28.5 cycles 采样时间等于28.5个周期

ADC_SampleTime_41Cycles5: Sample time equal to 41.5 cycles 采样时间等于41.5个周期

ADC_SampleTime_55Cycles5: Sample time equal to 55.5 cycles 采样时间等于55.5个周期

ADC_SampleTime_71Cycles5: Sample time equal to 71.5 cycles 采样时间等于71.5个周期

ADC_SampleTime_239Cycles5: Sample time equal to 239.5 cycles 采样时间等于239.5个周期

ADC的采样时间=采样周期/ADC的时钟频率

ADC的转换时间=ADC的采样时间+12.5周期 (12.5是采集12位AD时间是固定的周期)

思考二

在 ADC 采集数据的应用中,为了提高 ADC 的分辨率,可以采用多个采样平均的方式提高其分辨率(平均值滤波), 修改程序实现 ADC采集的平均值滤波。

这里我们在ADC中断中,通过一次中断进行6次采样然后取平均值来提高 ADC 的分辨率,从而实现 ADC采集的平均值滤波。

图11 6次采样然后取平均值来提高 ADC 的分辨率

图12 main函数

思考三

实验源码"31-ADC-电压采集:5-ADC-芯片温度"采用 DMA 的方式实现 MCU 温度的采集,比较 DMA 方式与单 通道(中断读取)方式程序的异同。

**DMA (Direct Memory Access)的定义与原理:**DMA 是一种允许某些硬件子系统直接访问主内存的技术,无需通过CPU。在MCU温度采集中,ADC(模数转换器)通过DMA直接将采集到的数据传输到内存中。

优点:

**高效:**DMA 传输可以在不占用 CPU 的情况下进行,提高系统的总体效率。

**连续采集:**可以连续采集数据,适合需要高速或连续数据采集的场景。

**程序结构:**程序中需要设置DMA通道和配置其源地址(ADC数据寄存器)和目标地址(内存中的缓冲区),以及传输完成后的中断或回调函数。

**单通道中断的定义与原理:**在单通道中断方式中,ADC完成转换后会产生一个中断信号,CPU响应这个中断,并从ADC数据寄存器读取数据。

优点:

**简单:**硬件和软件配置相对简单,适用于数据采集需求不频繁的应用。

**灵活:**程序可以灵活处理每次采集到的数据。

**程序结构:**程序中主要包含中断服务例程,每次ADC完成转换后,CPU通过中断服务程序读取数据,并处理或存储。

DMA 与单通道中断方式的比较

**资源利用:**DMA方式不占用CPU资源,而中断方式每次采集都需要CPU介入,影响CPU执行其他任务。

**数据处理:**DMA适合大批量数据处理,能连续不断地采集;单通道中断方式则在每次转换后都需要CPU处理,更适合对数据即时处理的要求。

**复杂性:**DMA的配置和调试相对复杂,涉及到内存管理和DMA控制器配置;单通道中断方式配置简单,但在高数据率下可能会使CPU负担加重。

**适用场景:**DMA更适合高速、大量数据采集的场景,如音视频处理或工业控制系统;单通道中断方式适用于数据采集频率较低、单次数据处理需求更高的场景。

思考四

参照实验源码"DAC-输出正弦波"实现不同频率的波形输出,实现基于 DAC 输出方波。

图13 DAC 输出方波代码修改操作

图14 main函数

图15 DAC初始化基础构架

图16 示波器显示方波验证图

相关推荐
码到成龚7 分钟前
SQL server学习10-数据库编程(中)
数据库·学习
云山工作室28 分钟前
基于单片机的电梯声控系统设计(论文+源码)
stm32·单片机·嵌入式硬件·毕业设计·毕设
虾球xz38 分钟前
游戏引擎学习第57天
学习·游戏引擎
南城花随雪。1 小时前
单片机:实现自动下载程序(附带源码)
单片机·嵌入式硬件
6.942 小时前
Scala学习记录 如何打印输出
开发语言·学习·scala
6.942 小时前
Scala-异常
学习·scala
囚生CY2 小时前
【学习笔记】蒙特卡洛与强化学习
笔记·python·学习
心之所想,行之将至2 小时前
零基础开始学习鸿蒙开发-交友软件页面设计
学习·交友
MARIN_shen3 小时前
Marin说PCB之POC电路layout设计仿真案例---06
网络·单片机·嵌入式硬件·硬件工程·pcb工艺
Asa3193 小时前
STM32-按键扫描配置
stm32·单片机·嵌入式硬件