STM32期末救命指南(六):ADC模数转换与IIC总线协议详解
2026/6/3 23:24:09 网站建设 项目流程

前言: 欢迎来到STM32期末复习系列的第六篇!到了这里,我们的硬件外设复习已经接近尾声。现实世界中的信号(如温度、光线、声音)都是连续变化的“模拟信号”,而单片机只懂0和1组成的“数字信号”。怎么沟通?这就需要**ADC(模数转换器)**这座桥梁。 另外,当单片机需要和各种复杂的传感器芯片或者屏幕对话时,只用普通的串口是不够的,我们还需要掌握一种非常经典的通信协议——IIC总线。干货满满,开始划重点!

考点一:ADC模数转换基础理论(⭐️⭐️⭐️⭐️ 必考概念/填空)

考试中经常会考ADC转换的“四步曲”和核心技术参数,这部分纯送分,千万别丢!

1. A/D转换的四大步骤(背诵)

将连续的模拟信号转换成数字信号,必须依次经过以下四个步骤:

  1. 采样 (Sampling):每隔一小段时间,去“抽取”一下模拟信号的电压值。

    • 必考定理抽样定理(奈奎斯特准则)。要求采样频率 $f_S \ge 2f_{Imax}$(即采样频率必须大于等于输入信号最高频率的2倍),这样才能完整还原出原来的信号。

  2. 保持 (Holding):由于转换需要一点点时间,在转换期间必须把刚才采样的电压值“稳住”不能变。

  3. 量化 (Quantization):把保持住的电压值,归入到某一个相近的离散电平等级中。

  4. 编码 (Encoding):把量化后的等级转换成单片机认识的二进制代码(0和1)。

2. ADC核心技术参数

  • 分辨率:表示ADC对输入模拟量微小变化的分辨能力。

    • 大白话:通常用“位数”表示。比如STM32自带的是12位ADC,也就是把 0~3.3V 的电压切成了 $2^{12} = 4096$ 份。位数越多,量化单位越小,转换越精细,误差越小,分辨率越高!

考点二:STM32的ADC模块特性(⭐️⭐️⭐️ 选择题常客)

  • 输入通道数:STM32F103的ADC最多有16个外部通道(ADCx_IN0 ~ ADCx_IN15),对应16个GPIO引脚。

  • 隐藏通道:以ADC1为例,除了16个外部通道外,它还有两个专用的内部通道

    1. 内部温度传感器通道(可以用来测量芯片的工作温度)。

    2. 内部参考电压(VREFINT)通道

  • GPIO模式配置(敲黑板!):如果一个引脚要用作ADC的输入通道,它的GPIO工作模式必须配置为“模拟输入(GPIO_Mode_AIN)”,只有这样才能原汁原味地把外部电压输送给ADC。

考点三:IIC总线通信基础(⭐️⭐️⭐️⭐️⭐️ 核心大题/对比题)

IIC(也叫I2C)是由Philips公司开发的一种经典串行总线。它引脚少,硬件简单,应用极广。

1. IIC的核心特征(必考填空/选择)

  • 引脚组成:只需要两根线!

    • SDA (Serial Data Line):串行数据线,用来传输数据。

    • SCL (Serial Clock Line):串行时钟线,用来控制节奏,所以它是同步通信

  • 通信方式:因为只有一根数据线,所以数据只能单向轮流走,这叫作半双工通信(不能同时发和收)。

  • 主从模式:通常有一个“主机(单片机)”和多个“从机(各种传感器)”。主机通过发“设备地址”来呼叫特定的从机。

2. IIC与USART的对比总结表(建议截图保存)

特性

USART (串口)

IIC总线

线数

TX, RX (2根数据线)

SDA, SCL (1根数据,1根时钟)

同步/异步

异步(没时钟线,靠波特率)

同步(有SCL时钟线统一指挥)

通信方向

全双工(可同时收发)

半双工(只能交替收发)

考点四:IIC的硬件代码配置规则(⭐️⭐️⭐️⭐️ 代码阅读/改错)

在阅读实验代码或程序填空题时,遇到IIC初始化,一定要盯紧它的GPIO配置

  • IIC引脚的工作模式: 在STM32标准库中,如果使用硬件IIC(比如PB10和PB11),这两个引脚的模式必须设置为复用开漏输出 (GPIO_Mode_AF_OD)!(注意:如果是用软件模拟IIC,通常设置为普通开漏输出GPIO_Mode_Out_OD)。

  • 为什么一定要“开漏”?开漏输出只能输出低电平,无法主动输出高电平。因此,IIC总线的SCL和SDA外部必须接上拉电阻(通常接到3.3V)。这样做是为了实现“线与”功能,防止多个设备同时发送数据时导致电源短路烧毁芯片。

💡 IIC硬件结构体高频代码段

I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; // I2C模式 I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; // 占空比配置 I2C_InitStructure.I2C_OwnAddress1 = 0X0A; // 自身地址 I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; // 开启应答机制(ACK)

复习建议:这一章的重点是搞清ADC的四个步骤与分辨率概念,以及**IIC总线“两根线、半双工、同步、开漏输出”**这几个核心关键词。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询