2026/5/21 13:45:34
网站建设
项目流程
网站后台有什么用,福建省城市建设厅网站,手机网站商场建设,wordpress多主题单片机是典型的数字系统#xff0c;只能处理数字信号。然而#xff0c;现实世界中的温度、压力等物理量#xff08;模拟量#xff09;#xff0c;需经传感器转换为连续的电压/电流信号。为了让数字系统能够处理这些模拟信号#xff0c;就必须进行模数转换。本章将学习这一…单片机是典型的数字系统只能处理数字信号。然而现实世界中的温度、压力等物理量模拟量需经传感器转换为连续的电压/电流信号。为了让数字系统能够处理这些模拟信号就必须进行模数转换。本章将学习这一转换过程及其核心器件。1A/D和D/A的基本概念ADC模数转换器承担着将现实世界连续的模拟信号如电压转换为数字系统可处理的离散数字信号的关键任务。理解其核心在于把握“连续”与“离散”的关系。模拟量是连续变化的量如一段长度在任何两点之间都存在无穷多个中间值。而数字量则是离散的如同为测量长度而制作的刻度尺最小刻度如1mm决定了测量的精度和离散性。使用米尺测量连续变化的水位我们只能读取最接近的刻度值。这个过程形象地展示了ADC的工作原理对连续的模拟信号进行定期的“测量”采样并“取整”量化为离散的数字代码。A/D的主要指标选择和使用ADC时需关注以下几个核心指标1、位数ADC的位数n决定其输出范围n位ADC可输出2^n个离散值。例如8位ADC输出0~255共256个值。2、基准电压Vref基准电压是ADC转换的参考标准其精度直接影响转换结果的准确性。若基准电压存在误差所有测量结果将按比例产生偏差。3、分辨率分辨率是ADC能够识别的最小模拟量变化计算公式为分辨率例如Vref5.10V的8位ADC其分辨率为5.10V / 255 ≈ 0.02V。4、INL与DNL精度指标INL积分非线性度表示整个量程内ADC输出值与理想值之间的最大偏差单位为LSB。例如INL1LSB表示实际电压值可能在其理论值±1个分辨率的范围内波动。DNL差分非线性度表示ADC相邻码值对应的模拟间隔与理想间隔1LSB的差异。DNL过大会导致输出码值不稳定甚至跳变。5、转换速率指ADC每秒可完成的采样次数单位sps与转换时间互为倒数。按速率可分为低速毫秒级如积分型中速微秒级如逐次逼近型高速纳秒级如并行/闪存型在这几个指标当中尤其要注意区分的是分辨率和精度指标。分辨率是决定AD的最小刻度的而精度INL和DNL才是最终决定AD采集的是否精准的最关键的指标。2摇杆电位器电路原理ADC的核心功能是将模拟信号数字化其中电压采集是最典型的应用。如图1所示电位器在此场景下被配置为一个分压电路其两端分别接3.3V电源与GND滑动端则连接至ADC输入。通过测量滑动端的对地电压即可精确计算出电位器的实时位置。图1 ADC采集电位器电压摇杆电位器的本质是两个独立的、相互垂直安装的精密电位器一个用于X轴一个用于Y轴和一个用于按键的微动开关Z轴它的核心原理就是电压分压。1、控制对象摇杆的物理位置。2、输出信号两个与位置对应的模拟电压值Vx和Vy。3、核心原理将物理的、连续的位置变化转换为连续的、可测量的电压变化。在Kingst32开发板上STM32的PA0引脚和PA1引脚分别接在摇杆电位器的两个滑动触点上另外的两端接在了3.3V和GND上。当滑动触点越靠近3.3V则滑动触点与GND之间的电压就越接近3.3V而滑动触点越靠近GND则滑动触点的电压就越接近GND。使用STM32的ADC采集电压就能够推算出摇杆的摇动情况了如图2所示。2 摇杆电位器电路图3STM32的ADC特性STM32F103VCT6有3个逐次逼近型的12位的ADC分别是ADC1、ADC2和ADC3每一个ADC都有18路通道能够进行采样。其中ADC1的16通道连接了芯片内部的温度传感器17通道连接了内部的Vrefint基准电压ADC2的16和17通道连接了内部的VssADC3的9、14、15、16和17通道连接了内部的Vss。需要注意的是三个ADC的外部通道的GPIO引脚并不是完全独立的ADC1、ADC2和ADC3的通道会复用到相同的GPIO引脚上例如PA0这个引脚同时可以作为ADC1_IN0、ADC2_IN0和ADC3_IN0使用但是不能同时使用ADC1、ADC2和ADC3去采样PA0上的信号通常只会选择一个ADC来连接这个引脚ADC分布如图3所示。图3 ADC引脚分布图根据第1节的ADC的基本概念获取STM32F103VCT6的基本参数1、分辨率STM32的ADC是12为分辨率转换结果的范围是0~4095。2、量程ADC的输入电压范围通常为0到Vref参考电压。在大多数设计中Vref和VDD如3.3V相连。3、转换时间总转换时间由采样时间和固定转换时间12位转换时间约为12.5个ADC时钟周期组成。采样时间可配置范围从1.5到239.5个ADC时钟周期以适应不同信号源阻抗的需求。4、转换公式数字值输入电压/参考电压*2^分辨率-1。例如参考电压为3.3V输入1.65V时转换结果为1.65/3.3*(2^12-1)2047。那当读取到2047时获取到的电压值2047/(2^12-1)。4STM32的ADC数据对齐方式在ADC 配置中数据对齐方式可选择右对齐或左对齐通常建议使用右对齐方式。STM32的ADC为12位ADC存储ADC数据的寄存器为16位也是就2个字节。右对齐最常用、最直观的模式。ADC转换后的数值直接存储在数据寄存器的低位。比如当用到12位的时候数据范围为0x0000到0x0FFF。在实际应用的时候有时候不需要12位的转换精度比如用到11位的时候只需要将读到的数据右移1位用到10位的时候需要将读到的数据右移2位......通过右移的方式将低位的“精度冗余”给去掉。左对齐ADC转换后的数值紧紧贴在寄存器的“最高位”存放低位补0.同样是12位的ADC数据范围为0x0000到0xFFF0。在实际应用中读取数据时每次都需要通过右移操作来获取正确的数据。但是仅有一种情况就是如果用到了8位转换精度的时候可以直接读取寄存器的高8位不需要做任何移位操作了。5STM32的ADC的转换模式和通道模式ADC的本职工作就是“转换”它将模拟电压值通过一次性转换成为数字值这个过程是硬件自动完成的无需软件干预。但是软件可以控制ADC的转换模式按“单次/连续”划分模式单次转换模式和连续转换模式。单次转换模式ADC只执行一次转换然后停止等待下一次触发。连续转换模式ADC完成一次转换后立即开始下一次转换周而复始永不停止。按照“单通道/多通道”划分模式单通道模式和扫描模式。单通道模式仅对一个置顶的ADC通道如PA0进行转换。扫描模式对多个指定的ADC通道如PA0、PA1、PA2按顺序依次转换通常配合DMADirect Memory Access即直接存储器访问使用。还有一种间断扫描模式属于扫描模式中的一种特殊情况。在间断模式下可以定义一个子组长度的比如N可配置ADC每收到一次触发信号就只转规则序列中的N个通道然后停止等待再次受到触发信号再转换接下来的N个通道。举例说明若需要扫描的通道为3、2、5、4、1、6设置间隔为2则每次触发会依次转换两个通道首次为3、2第二次为5、4依次循环类推。间隔数可以取1~8最多支持16个规则组每组可以独立选择通道。连续采集转换数据时产生的中断会非常频繁尤其是设置的采样周期比较短时更是如此中断对GPU的占用会变得非常高影响其他程序代码的运行。处理这种问题就可以用到DMA。简单理解DMA就是ADC采样完成后不再通过中断通知CPU来读取二值直接触发由CPU提前设置好的DMA将数据直接搬运到内存中这样就可以极大减轻CPU压力。6使用CubeMX配置ADC在Kingst32开发板上的摇杆使用了两个ADC通道分别是PA0和PA1。ADC的时钟ADCCLK就是由APB2总线时钟PCLK分频而来此外ADCCLK频率最大值为14M这是由ADC模块本身能稳定工作的最高时钟速度超过此速度可能导致转换错误或者精度下降。打开CubeMX软件首先选择“PinoutConfiguration”视图在芯片引脚图上找到PA0引脚点击PA0后选择PA0为GPIO_Analog模拟输入模式然后再点击一次选择ADC1_IN0如图4(1)所示再找到PA1引脚配置方式完全和AP0一致配置好以后这两个引脚名称变为“GPIO_Analog ADC1_IN0”和“GPIO_Analog ADC1_IN0”如图4(2)所示。图4(1)配置PA0图4(2)配置PA1设置好这两个引脚后选择“Clock Configuration”视图在右下角找到ADC Prescaler进行分频选择分频系数只能是2、4、6或8。由于最大值是14M因此选择2和4都不满足条件因此ADC的时钟可以选择6分频安全并且速度最快或者8分频安全但是速度不是最快本书采用6分频模式即设置ADCCLK的频率为12M如图5所示。图5 配置ADCCLK选择“PinoutConfiguration”视图在左侧的Analog栏目下选择ADC1会发现ADC1的IN0和IN1已经被选中如图6所示图6 ADC配置页面在“parameters Settings”中按照需求进行配置各个选项功能设置如图7所示请按照图中标记的数字序号顺序配置。图7 ADC配置选项1、Enable Regular Conversions使能规则转换Enable使能。Number Of Conversion转换通道数量2个。注其中Scan Conversion Mode选项不需要用户设置只要Number Of Conversion转换通道数量大于1这个选项自动使能。2、External Trigger Conversion Source外部触发转换源Regular Conversion launched by software通过软件启动规则转换即ADC不会自动开始需要程序代码中调用特定函数来启动转换。Rank1序列1首先转换Channel0采样时间为41.5Cycles41.5个ADC时钟周期。3、Rank2序列2接着转换Channel1采样时间为41.5Cycles。注STM32F103VCT6的ADC可以选择的采样时间从1、5Cycle到239.5Cycle。当选择较长的采样时间后可以保持较高精度但是速度相对慢一些。而如果设置较短的采样时间优点是速度快缺点是精度会降低误差变大。这里选了41.5Cycles是一个综合考量的决定。4、Discontinuous Conversion Mode间断转换模式Enabled。Number Of Discontinuous Conversion:1。注间断转换模式不会一次性转换所有的AD通道而是每收到一次触发信号只转换序列中的1Number Of Discontinuous Conversion个通道。4个选项全部设置好以后单击“GENERATE CODE”生成MDK代码。