
微机原理与接口技术 · 第10章《模拟量模块》知识点全梳理本文整理自福州大学《微机原理与接口技术》吴衔誉教授第十章课件系统讲解 ADC 的工作原理及性能指标、STM32 的 ADC 概述、ADC 配置、ADC 应用特征及中断请求、ADC 寄存器及库函数以及 DAC 的工作原理及性能指标六大板块。目录一、ADC 的工作原理及性能指标二、STM32 的 ADC 概述三、STM32 的 ADC 配置四、STM32 的 ADC 应用特征及中断请求五、STM32 的 ADC 寄存器及库函数六、DAC 的工作原理及性能指标本章小结与思考题一、ADC 的工作原理及性能指标现实世界的信号大多是模拟量温度、光照、电压而单片机只能处理数字量。模数转换器ADCAnalog to Digital Converter把模拟量变成数字量数模转换器DACDigital to Analog Converter反过来把数字量变成模拟量二者共同构成单片机感知和控制物理世界的桥梁。1.1 模数转换器的工作原理根据转换原理不同ADC 可分为计数-比较式、逐次逼近式和双斜率积分式。计数-比较式结构简单、价格便宜但转换速度慢较少采用。下面介绍最常用的两种。1逐次逼近式模数转换器逐次逼近式 ADC简称 SAR ADCSuccessive Approximation Register ADC逐次逼近寄存器型模数转换器主要由逐次逼近寄存器SAR、数字 / 电压转换器即 D/A 转换器、比较器、时序及控制逻辑等部分组成。它是采样速率低于 5 Msps 的中高分辨率 ADC 应用的常见结构分辨率一般为 8~16 位具有低功耗、小尺寸的特点。工作原理二分搜索的思想ADC 收到「转换命令」并清除 SAR 后控制电路先设定 SAR 最高位为 1、其余为 0预测数据送 D/A 转换器转换成电压 Vc将 Vc 与输入模拟电压 Vx 在高增益比较器中比较若 Vx ≥ Vc说明该位置 1 正确予以保留若 Vx Vc说明置 1 不合适予以清除按此法对次高位继续转换、比较、判断逐位确定是 1 还是 0重复至确定 SAR 最低位为止。完成后状态线改变SAR 中的内容就是与输入模拟电压对应的二进制数字代码。2双积分式模数转换器双积分式的抗干扰能力比逐次逼近式强精度高、抗干扰强。其基础是测量两个时间模拟输入电压向电容充电的固定时间以及在已知参考电压下放电所需的时间模拟输入电压与参考电压的比值等于这两个时间值之比。不过由于逐次逼近式能很好地兼顾速度与精度在 16 位以下的 ADC 中逐次逼近式使用得更多。1.2 模数转换器的性能指标选择 ADC 需综合考虑分辨率、通道、基准电压、转换速率、采样 / 保持器、量程、满刻度误差、线性度、数字接口方式、模拟信号类型、电源电压、功耗、封装等因素。分辨率能分辨最小信号的能力表示数字量变化一个相邻数码所需输入模拟电压的变化量常用输出二进制位数表示。分辨率越高对输入变化越灵敏。例如 8 位 ADC 能分辨满刻度的 1/256若满刻度 5 V则最小可分辨 5 V / 256 ≈ 19.5 mV。常见有 8、10、12、14、16 位通道多芯片内含多个 ADC 可同时转换多路常见的多路 ADC 只有一个公共 ADC由多路开关分时转换基准电压分内 / 外基准和单 / 双基准转换速率转换时间从启动到输出稳定数字量所需时间的倒数即每秒完成转换的次数。逐次逼近式典型转换时间 1.0~200 μs。转换速率应高于系统要求的采样频率采样 / 保持器采集直流或缓变信号时可不用其他信号一般要加若信号频率不高且 ADC 转换时间短高速 ADC也可不用量程所能转换的电压范围如 2.5 V、5 V、10 V满刻度误差满刻度输出时对应输入信号与理想值之差线性度实际转移函数与理想直线的最大偏移数字接口方式分并行和串行。并行引脚多但速度快串行引脚少、封装小但需软件处理I/O 紧张时用串行速度要求高时用并行模拟信号类型通常是电压信号分单极性Unipolar和双极性Bipolar电源电压分单电源、双电源和不同电压范围功耗CMOS 工艺功耗低电池供电手持系统要重点关注封装常见 DIPDual In-line Package双列直插封装和 SMDSurface Mount Devices表贴型封装。记忆点本节是原理地基。SAR ADC 是「逐位试凑、二分逼近」双积分式是「充放电时间比」后者抗干扰强但慢16 位以下 SAR 更常用。13 项指标里分辨率、转换速率、量程、基准电压、接口方式是选型的硬门槛。二、STM32 的 ADC 概述STM32F103VET6 集成有 18 路 12 位高速逐次逼近型 ADC可测量 16 个外部和 2 个内部信号源。各通道可单次、连续、扫描或间断模式执行结果可左对齐或右对齐存储在 16 位数据寄存器模拟看门狗允许检测输入电压是否超出用户定义的高低阈值ADC 输入时钟不得超过 14 MHz由 PCLK2APB2 Peripheral ClockAPB2 外设时钟经分频产生。主要特性12 位分辨率转换结束、注入转换结束和模拟看门狗事件时可产生中断单次和连续转换模式从通道 0 到通道 n 的自动扫描模式自校准功能带内嵌数据一致性的数据对齐采样间隔可按通道分别编程规则转换和注入转换均有外部触发选项间断模式双重模式带 2 个或以上 ADC 的器件。补充特性转换时间时钟 56 MHz 时 1 μs72 MHz 时 1.17 μs供电 2.4 V 到 3.6 V输入范围 VREF− ≤ VIN ≤ VREF规则通道转换期间有 DMADirect Memory Access直接存储器访问请求。相关引脚模拟电源 VDDA等效 VDD、模拟地 VSSA等效 VSS、模拟参考正 VREF、模拟参考负 VREF−、模拟输入 ADCX_IN[15:0]16 个外部通道。三、STM32 的 ADC 配置3.1 ADC 的开关控制设置 ADC_CR2 的 ADON 位给 ADC 上电第一次置 ADON 唤醒 ADC上电延迟 tSTAB 后再置 ADON 开始转换清除 ADON 停止转换并进入断电模式仅耗电几 μA。3.2 ADC 时钟ADCCLK 由 RCCReset and Clock Control复位和时钟控制提供的专用可编程预分频器产生并与 PCLK2APB2 时钟同步。注意 ADCCLK 不得超过 14 MHz。3.3 通道选择转换分两组规则组和注入组。规则组最多 16 个转换通道按指定顺序逐个转换结束后从头循环。规则通道及顺序在 ADC_SQRx 中选择总数写入 ADC_SQR1 的 L[3:0]00001 个…111116 个。SQ16[4:0] 定义第 16 个转换的通道编号0~17另有 ADC_SQR2通道 12~7、ADC_SQR3通道 6~1注入组最多 4 个转换通道可临时中断规则组去转换这些通道。注入通道及顺序在 ADC_JSQR 中选择总数写入 JL[1:0]001012103114。注意若 JL 小于 4转换顺序从4−JL开始。例ADC_JSQR[21:0] 10 00011 00011 00111 00010表示扫描顺序为 7、3、3而非 2、7、3。若转换期间改 SQRx/JSQR当前转换被清除并重新启动新组。内部通道温度传感器接 ADC1_IN16内部参考电压 VREFINT 接 ADC1_IN17只能出现在 ADC1 中。3.4 单次转换模式CONT0。ADC 只执行一次转换可由 ADON仅规则通道或外部触发启动。规则通道完成数据存入 16 位 ADC_DREOCEnd Of Conversion转换结束置位若 EOCIE1 则中断注入通道完成数据存入 16 位 ADC_JDRxJEOCInjected End Of Conversion注入转换结束置位若 JEOCIE1 则中断。然后 ADC 停止。3.5 连续转换模式CONT1。当前转换一结束马上启动下一次可由外部触发或 ADON 启动。每个转换后同样置 EOC/JEOC 并产生中断。3.6 时序图ADC 精确转换前需稳定时间 tSTAB开始转换后 14 个时钟周期EOC 被置位16 位 ADC_DR 含结果。3.7 模拟看门狗若被转换电压低于低阈值或高于高阈值AWDAnalog WatchDog模拟看门狗状态位置位。阈值位于 ADC_HTR高和 ADC_LTR低寄存器的最低 12 位设 ADC_CR1 的 AWDIE 可允许中断。通过 ADC_CR1看门狗可作用于 1 个或多个通道。3.8 扫描模式设 ADC_CR1 的 SCAN 位0 关闭1 使用即选扫描模式。ADC 扫描所有被 SQRx规则或 JSQR注入选中的通道每组每通道执行单次转换每转换结束自动转下一通道若设了 CONT则到末通道后不停止从首通道继续。3.9 注入通道管理触发注入清 JAUTO、设 SCAN规则转换期间来外部注入触发当前转换被复位注入序列以单次扫描转换之后恢复原规则通道若注入期间来规则事件注入不被中断规则序列在注入结束后执行。注意触发事件间隔要长于注入序列自动注入设 JAUTO1规则组之后自动转换注入组可转换 SQRxJSQR 中最多 20 个序列此模式须禁止注入外部触发若同时设 CONT规则→注入序列连续执行。3.10 间断模式规则组设 ADC_CR1 的 DISCEN 激活执行 n 次n≤8由 DISCNUM[2:0] 给出转换的子组外部触发启动下一轮 n 次总序列长由 L[3:0] 定义。例 n3、通道 0/1/2/3/6/7/9/10第 1 次触发转 0/1/2第 2 次转 3/6/7第 3 次转 9/10 且产生 EOC第 4 次重新转 0/1/2注入组设 JDISCEN 激活外部触发后按 JSQR 顺序逐个转换子组总序列长由 JL[1:0] 定义。例 n1、通道 1/2/3第 1 次转 1第 2 次转 2第 3 次转 3 并产生 EOC/JEOC第 4 次重新转 1。记忆点本节是 STM32 ADC 的配置核心。规则组是「常规轮询队列」最多 16 通道注入组是「可插队的优先队列」最多 4 通道、优先级更高、能打断规则组。单次 / 连续 / 扫描 / 间断 4 种模式决定转换的起停与轮转方式扫描 连续 DMA 是多通道采集的经典组合。四、STM32 的 ADC 应用特征及中断请求4.1 校准ADC 有内置自校准模式可减小内部电容组变化造成的误差。设 ADC_CR2 的 CAL 位启动校准结束 CAL 硬件复位建议每次上电后校准一次。启动校准前ADC 须处于关电状态ADON0至少两个 ADCCLK校准码存于 ADC_DR。4.2 数据对齐ADC_CR2 的 ALIGN 位选对齐ALIGN0 右对齐ALIGN1 左对齐。注入组结果已减去 ADC_JOFRx 定义的偏移量可为负值SEXT 为扩展符号位规则组只有 12 位无偏移。4.3 可编程的通道采样时间每个通道采样周期数由 ADC_SMPR1/2 的 SMPx[2:0] 设定各通道可不同。总转换时间TCONV 采样时间 12.5 周期例ADCCLK14 MHz、采样时间 1.5 周期时TCONV 1.5 12.5 14 周期 1 μs。SMPx 取值对照0001.5、0017.5、01013.5、01128.5、10041.5、10155.5、11071.5、111239.5 周期。4.4 外部触发转换设 EXTTRIGADC_CR2.20和 JEXTTRIG 位后外部事件定时器捕获、EXTI 线等可触发转换EXTSEL[2:0] 和 JEXTSEL[2:0] 从 8 个可能事件中选触发源。外部触发只认上升沿软件触发可对 SWSTART规则或 JSWSTART注入置 1 产生。规则组转换可被注入触发打断。4.5 DMA 请求规则组转换值都存在同一个 ADC_DR 中多规则通道转换时须用 DMA 避免数据丢失只有规则组结束才产生 DMA 请求。仅 ADC1 和 ADC3 有 DMA 功能ADC2 的数据可通过双 ADC 模式借 ADC1 的 DMA 传输。4.6 双 ADC 模式带 2 个或以上 ADC 的产品可用双 ADC 模式由 ADC1_CR1 的 DUALMOD[2:0] 选模式启动可为主ADC1从ADC2交替或同步触发。共有 6 种基本模式同步注入、同步规则、快速交叉、慢速交叉、交替触发、独立模式并可组合出同步注入 同步规则、同步规则 交替触发、同步注入 交叉等混合模式。双 ADC 模式适用通道组要点同步注入注入组ADC1 触发同时给 ADC2 同步触发结束存各自 JDRx全转换完产生 JEOC同步规则规则组ADC1 触发同步给 ADC2产生 32 位 DMA高半字 ADC2、低半字 ADC1全完产生 EOC快速交叉规则组单通道ADC2 立即启动ADC1 延迟 7 个 ADCCLK 启动可连续交叉转换慢速交叉规则组单通道ADC2 立即启动ADC1 延迟 14 个 ADCCLK之后每 14 周期循环交替触发注入组第 1 次触发转 ADC1 注入组第 2 次转 ADC2循环独立模式—双 ADC 同步不工作各自独立4.7 温度传感器温度传感器测环境温度TA内部接 ADC1_IN16推荐采样时间 17.1 μsVREFINT 接 ADC1_IN17。不用时可置关电模式。传感器输出电压随温度线性变化但不同芯片曲线偏移不同更适合测变化而非绝对温度精确测量建议外置传感器。读数步骤选 ADC1_IN16采样时间 17.1 μs设 ADC_CR2 的 TSVREFE 唤醒传感器设 ADON 启动或外部触发读数据寄存器得 VSENSE按公式换算温度 (V25 − VSENSE) / Avg_Slope 25V25 为 25 ℃ 时 VSENSE 典型值 1.43 VAvg_Slope 为典型值 4.3 mV/℃。例 VSENSE1.3 V 时(1.43−1.3)/0.0043 25 ≈ 55.23 ℃。4.8 中断请求规则组和注入组转换结束、模拟看门狗置位都能产生中断各有独立中断使能位。记忆点本节是 ADC 的「高级玩法」。校准提升精度、对齐影响数据存放格式、采样时间公式决定转换耗时外部触发 DMA 是多通道高速采集的关键双 ADC 模式用 6 种组合把两个 ADC 协同起来温度传感器和内部参考电压挂 ADC1 的 16/17 通道。五、STM32 的 ADC 寄存器及库函数5.1 STM32 的 ADC 寄存器ADC1 起始地址 0x4001_2400ADC2 为 0x4001_2800ADC3 为 0x4001_3C00。主要寄存器寄存器偏移作用ADC_SR0x00状态STRT/JSTRT/JEOC/EOC/AWDADC_CR10x04控制 1AWDEN/JAWDEN、DUALMOD、DISCNUM、SCAN、JAUTO、DISCEN 等ADC_CR20x08控制 2ADON、CONT、CAL、ALIGN、EXTTRIG/EXTSEL、JEXTTRIG/JEXTSEL、SWSTART 等ADC_SMPR1/20x0C/0x10采样时间 SMPxADC_JOFR1~40x14~0x20注入通道偏移ADC_HTR/LTR0x24/0x28看门狗高低阈值ADC_SQR1/2/30x2C/0x30/0x34规则序列ADC_JSQR0x38注入序列ADC_JDR1~40x3C~0x48注入数据ADC_DR0x4C规则数据课件此处误写为 0x30/34实际偏移为 0x4C5.2 STM32 的 ADC 固件库函数ADC_TypeDef在stm32f10x.h中定义成员按 SR/CR1/CR2/SMPR1/SMPR2/JOFR14/HTR/LTR/SQR13/JSQR/JDR1~4/DR 顺序排列。外设基地址ADC1 在 APB20x2400ADC2 在 APB20x2800。ADC_InitTypeDef定义于stm32f10x_adc.htypedefstruct{u32 ADC_Mode;// 工作模式独立 / 双 ADC 等FunctionalState ADC_ScanConvMode;// 扫描模式 ENABLE/DISABLEFunctionalState ADC_ContinuousConvMode;// 连续模式 ENABLE/DISABLEu32 ADC_ExternalTrigConv;// 外部触发源u32 ADC_DataAlign;// 数据对齐 左 / 右u8 ADC_NbrOfChannel;// 规则转换通道数 1~16}ADC_InitTypeDef;常用函数ADC_Initvoid ADC_Init(ADC_TypeDef* ADCx, ADC_InitTypeDef* ADC_InitStruct)— 按结构体初始化 ADCxx1/2/3ADC_ITConfigvoid ADC_ITConfig(ADC_TypeDef* ADCx, u16 ADC_IT, FunctionalState NewState)— 使能 / 除能指定 ADC 中断ADC_SoftwareStartConvCmdvoid ADC_SoftwareStartConvCmd(ADC_TypeDef* ADCx, FunctionalState NewState)— 使能 / 除能软件启动转换ADC_RegularChannelConfigvoid ADC_RegularChannelConfig(ADC_TypeDef* ADCx, uint8_t ADC_Channel, uint8_t Rank, uint8_t ADC_SampleTime)— 设置规则组通道、顺序和采样时间ADC_GetConversionValueu16 ADC_GetConversionValue(ADC_TypeDef* ADCx)— 返回最近一次规则组转换结果。工程应用步骤使能 ADC 时钟及对应 GPIO 时钟GPIO 引脚设为GPIO_Mode_AIN模拟输入RCC_ADCCLKConfig设 ADC 时钟分频因子ADC_DeInit复位 ADC 模块ADC_Init初始化模式、扫描、连续、对齐、通道数等ADC_RegularChannelConfig配置规则通道ADC_Cmd使能 ADCADC_ResetCalibration复位校准等ADC_GetResetCalibrationStatus为 1 结束ADC_StartCalibration校准等ADC_GetCalibrationStatus完成ADC_SoftwareStartConvCmd软件启动ADC_GetFlagStatus(ADC_FLAG_EOC)等待转换结束或用中断ADC_GetConversionValue读结果并处理。例 10-1用 STM32F103VET6 的 ADC 通道 1PA1接光敏电阻分压采集电压结果写到板载 LED 显示。下面整合并修正课件分散代码中的笔误Int main→int main、GPIO_ InitTypeDef多余空格、ADC_ScanConvModeDISABLE中文分号、通道参数 ADC1 漏写等#includestm32f10x.hvoiddelay(u32 cnt){while(cnt--);}intmain(void){ADC_InitTypeDef ADC_InitStructure;GPIO_InitTypeDef GPIO_InitStructure;u16 dat;// 使能时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1,ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOE,ENABLE);// LED 端口 PE 全部推挽输出GPIO_InitStructure.GPIO_PinGPIO_Pin_All;GPIO_InitStructure.GPIO_ModeGPIO_Mode_Out_PP;GPIO_InitStructure.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOE,GPIO_InitStructure);// ADC 时钟分频72/6 12 MHz不超过 14 MHzRCC_ADCCLKConfig(RCC_PCLK2_Div6);GPIO_InitStructure.GPIO_PinGPIO_Pin_1;GPIO_InitStructure.GPIO_ModeGPIO_Mode_AIN;// PA1 模拟输入GPIO_Init(GPIOA,GPIO_InitStructure);ADC_DeInit(ADC1);ADC_InitStructure.ADC_ModeADC_Mode_Independent;// 独立模式ADC_InitStructure.ADC_ScanConvModeDISABLE;// 单通道ADC_InitStructure.ADC_ContinuousConvModeDISABLE;// 单次转换ADC_InitStructure.ADC_ExternalTrigConvADC_ExternalTrigConv_None;// 软件触发ADC_InitStructure.ADC_DataAlignADC_DataAlign_Right;// 右对齐ADC_InitStructure.ADC_NbrOfChannel1;ADC_Init(ADC1,ADC_InitStructure);ADC_RegularChannelConfig(ADC1,1,1,ADC_SampleTime_239_5Cycles5);// 通道1239.5周期ADC_Cmd(ADC1,ENABLE);ADC_ResetCalibration(ADC1);while(ADC_GetResetCalibrationStatus(ADC1));ADC_StartCalibration(ADC1);while(ADC_GetCalibrationStatus(ADC1));while(1){ADC_SoftwareStartConvCmd(ADC1,ENABLE);while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));// 等待转换结束datADC_GetConversionValue(ADC1);GPIO_Write(GPIOE,dat);// AD 值送 LED 显示delay(1000000);}}记忆点ADC 软件落地记住「11 步流水线」——开时钟 → 引脚模拟输入 → 配 ADCCLK → 复位 →ADC_Init→ 配规则通道 → 使能 → 校准 → 启动 → 等 EOC → 读值。ADC_InitTypeDef的 6 个成员决定了转换模式、触发、对齐与通道数。六、DAC 的工作原理及性能指标6.1 DAC 的工作原理根据解码网络结构不同DAC 可分为 T 形、倒 T 形、权电阻和权电流等类型根据模拟电子开关种类不同可分为 CMOS 型和双极型双极型又分电流开关型和 ECL 电流开关型。以权电阻型 DAC为例把数字量二进制代码各位按其「权」的数值转换成相应电流再把代表各位数值的电流相加。一个 8 位权电阻 DAC 用线性电阻网络叠加原理可分析Di0 时开关 Si 接地Di1 时 Si 接标准电压 V逐个求出每个开关单独接通时的输出分量再相加即得总输出电压。6.2 DAC 的性能指标分辨率对输入量变化敏感程度的描述与输入数字量位数有关稳定时间代码满度变化时输出稳定到 ±1/2 最低位相当范围所需时间一般几十毫秒到几微秒输出电平型号差异大一般 5~10 V高压输出型 24~30 V电流输出型低至 20 mA、高至 3 A转换精度转换后实际值对理想值的接近程度输入编码二进制、BCD 码、双极性时的符号-数值码、补码、偏移二进制码等。6.3 STM32 集成的 DAC 模块STM32F103VET6 的 DAC 是 12 位数字输入、电压输出的数模转换器可配置 8 位或 12 位可与 DMA 配合12 位模式下数据可左对齐或右对齐。有 2 个输出通道各通道有独立转换器双 DAC 模式下 2 通道可独立或同步更新输出可通过引脚输入参考电压提高精度。主要特征2 个 DAC 转换器各对应 1 个输出通道8 位或 12 位单调输出12 位下左 / 右对齐同步更新噪声波形生成三角波形生成双通道同时或分别转换每通道有 DMA外部触发转换输入参考电压 VREF。相关引脚模拟电源 VDDA、模拟地 VSSA、高端参考正 VREF、通道 x 模拟输出 DAC_OUTx。记忆点本节补齐了模拟量链路的另一端——DAC。权电阻型是最易理解的结构按权转电流再叠加5 项指标中分辨率、稳定时间、输出电平最关键STM32 的 12 位双通道 DAC 还能生成噪声 / 三角波是做波形发生器的硬件基础。本章小结核心知识地图ADC 的工作原理及性能指标逐次逼近式 SAR、双积分式、13 项选型指标STM32 的 ADC 概述18 路 12 位、主要特性、相关引脚、ADCCLK ≤ 14 MHzSTM32 的 ADC 配置开关控制、时钟、规则组 / 注入组通道选择、单次 / 连续 / 扫描 / 间断模式、模拟看门狗、注入通道管理STM32 的 ADC 应用特征及中断请求校准、数据对齐、采样时间 TCONV采样12.5 周期、外部触发、DMA、双 ADC 6 种模式、温度传感器、中断STM32 的 ADC 寄存器及库函数11 个寄存器及偏移、ADC_InitTypeDef六成员、6 个函数、11 步工程流程与例 10-1DAC 的工作原理及性能指标权电阻型等结构、5 项指标、STM32 12 位双通道 DAC 模块。本文由课程课件与讲稿整理供学习交流使用。如需转载或用于教学请注明出处。欢迎在评论区交流讨论。