如何在 STM32F103C8 中使用 ADC 测量模拟电压

这篇博客介绍了如何在 STM32F103C8 单片机中使用 ADC 模块读取模拟电压。内容包括STM32的ADC特性、模拟信号到数字的转换原理、ADC引脚配置、电路设计以及编程实现读取ADC值并在LCD上显示的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

几乎每个嵌入式应用程序中都使用的一个常见功能是 ADC 模块(模数转换器)。这些模数转换器可以从温度传感器、倾斜传感器、电流传感器、弯曲传感器等模拟传感器读取电压。现在,我们学习 如何使用 STM32F103C8 中的 ADC 读取模拟电压,我们将一个电位器连接到 STM32 Blue Pill 板,通过改变电位器阻值为ADC提供不同的电压,将读取的电压显示在 1602 LCD 上。

STM32F103C8 中的 ADC

在 STM32F103C8有 10 个通道、12 位 ADC,输入范围为 0V -3.3V。它将 0 到 3.3 伏之间的输入电压映射为 0 到 4095 之间的整数值。

这里的术语 10 通道意味着有 10 个 ADC 引脚可以用来测量模拟电压。术语 12 位表示ADC 的分辨率,表示000000000000-111111111111(2^12即 4096)。这是我们 ADC 的采样步数,因此我们的 ADC 值的范围从 0 到 4095。该值将从 0 增加到4095基于每步电压值,可通过方面方式计算

电压 / 步数 = 参考电压 / 4096 = (3.3/4096= 8.056mV) 每单位。

模拟信号如何转换为数字格式

由于计算机仅存储和处理二进制/数字值(1 和 0)。因此,模拟信号(如传感器的伏特输出)必须转换为数字值以进行处理,并且转换需要准确。当在模拟输入端向 STM32 提供输入模拟电压时,模拟值被读取并存储在整数变量中. 使用以下方式将存储的模拟值(0-3.3V)转换为整数值(0-4096):

输入电压 = (ADC 值 / ADC 分辨率) * 参考电压

分辨率 = 4096

参考电压 = 3.3V

STM32F103C8T6 中的 ADC 引脚

STM32 中有 10 个ADC引脚,从 PA0 到 PB1。

### STM32F103C8T6 外接 ADC 测量电压方法 为了实现 STM32F103C8T6 单片机通过外接 ADC 进行电压测量的功能,可以按照以下方式配置硬件和软件。以下是详细的说明: #### 硬件连接 STM32 的 GPIO 可以作为 I2C 接口与外部 ADC(如 MCP4725 或其他型号)通信。假设使用的是 MCP4725 芯片,则需要将其 SDA 和 SCL 引脚分别连接到 STM32 的相应引脚上。同时,确保 VDD 提供稳定的 3.3V 工作电压[^1]。 #### 软件初始化 在 HAL 库下完成必要的初始化操作,包括启用时钟、GPIO 配置以及 I2C 初始化设置。具体步骤如下: ##### 1. 启用相关时钟 ```c __HAL_RCC_GPIOB_CLK_ENABLE(); // 假设 I2C 使用 PB6(SDA),PB7(SCL) __HAL_RCC_I2C1_CLK_ENABLE(); ``` ##### 2. 配置 GPIO 引脚模式为 AF_OD (开漏复用功能) ```c GPIO_InitTypeDef GPIO_InitStruct = {0}; // SDA pin configuration GPIO_InitStruct.Pin = GPIO_PIN_6; GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); //_SCL pin configuration GPIO_InitStruct.Pin = GPIO_PIN_7; HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); ``` ##### 3. 设置 I2C 参数并启动驱动程序 ```c I2C_HandleTypeDef hi2c1; hi2c1.Instance = I2C1; hi2c1.Init.ClockSpeed = 100000; // Standard mode: 100kHz hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;// Set duty cycle to standard value. hi2c1.Init.OwnAddress1 = 0; // Not used as master device here. hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; if(HAL_I2C_Init(&hi2c1) != HAL_OK){ Error_Handler(); // Handle error appropriately. } ``` #### 数据读取过程 当硬件准备完毕之后就可以编写函数来获取来自 MCP4725 的数据了。下面是一个简单的例子展示如何从该设备获得当前 DAC 输出值对应的模拟信号强度: ```c uint8_t buffer[2]; int read_mcp4725_value(void){ int result=-1; /* Send start condition and address */ if(HAL_I2C_Master_Transmit(&hi2c1,(MCP4725_ADDR<<1)|WRITE_BIT,sizeof(buffer)/sizeof(uint8_t),(uint8_t*)buffer)!=HAL_OK){ return -1; } /* Read two bytes back from the same register location*/ if(HAL_I2C_Master_Receive(&hi2c1,MCP4725_ADDR|READ_BIT, sizeof(buffer)/sizeof(uint8_t), buffer)==HAL_OK ){ result=(buffer[0]<<4)|(buffer[1]>>4); }else{ Error_Handler(); } return result; } ``` 以上代码片段展示了基本的数据交互流程,实际应用中可能还需要加入更多的错误处理机制以及其他细节调整以满足特定需求[^3]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值