引言
本项目设计了一个基于STM32的高精度数字测量仪,能够精确测量电压、电流、温度以及其他环境参数。通过采用高分辨率的 ADC(模数转换器)和温度传感器等外设,该系统可以实时获取精确的数据,广泛应用于实验室测量、工业监控以及精密电子设备的调试。用户通过 OLED 显示屏查看测量结果,并可通过按键选择不同的测量模式。
环境准备
1. 硬件设备
- STM32F103C8T6 开发板(或其他 STM32 系列)
- 高精度 ADC 模块(如 ADS1115,16 位分辨率)
- 温度传感器(如 PT100 或 DS18B20)
- 电流检测模块(如 ACS712 电流传感器)
- 分压电路(用于电压测量)
- 按键(用于切换测量模式)
- OLED 显示屏(用于显示测量结果)
- 面包板和杜邦线
- USB-TTL 串口调试工具
2. 软件工具
- STM32CubeMX:用于初始化 STM32 外设。
- Keil uVision 或 STM32CubeIDE:用于编写和下载代码。
- ST-Link 驱动程序:用于下载程序到 STM32。
项目实现
1. 硬件连接
- ADC 模块连接:将 ADS1115 的 SDA 和 SCL 引脚连接到 STM32 的 I2C 接口(如 PB6 和 PB7),用于高精度电压和电流测量。
- 温度传感器连接:将 PT100 温度传感器通过放大电路连接到 STM32 的 ADC 引脚(如 PA0),或直接使用 DS18B20 连接到 GPIO 引脚(如 PA1)。
- 电流传感器连接:将 ACS712 的输出引脚连接到 STM32 的 ADC 引脚(如 PA2)。
- 分压电路:用于高电压的测量,将输出电压引脚连接到 STM32 的 ADC 引脚(如 PA3)。
- 按键连接:将模式切换按键连接到 STM32 的 GPIO(如 PA4)。
- OLED 显示屏连接:将 OLED 的 SDA 和 SCL 引脚连接到 STM32 的 I2C 接口(如 PB6 和 PB7),用于显示测量数据。
2. STM32CubeMX 配置
- 打开 STM32CubeMX,选择你的开发板型号。
- 配置系统时钟为 HSI,确保系统稳定运行。
- 配置 GPIO 引脚用于按键输入。
- 配置 I2C 用于与 ADS1115 和 OLED 显示屏通信。
- 配置 ADC 用于读取电流传感器和温度传感器的数据。
- 生成代码,选择 Keil 或 STM32CubeIDE 作为工具链。
3. 编写主程序
在生成的项目基础上,编写电压、电流、温度检测、模式切换和 OLED 显示的代码。以下是高精度数字测量仪的基本代码示例:
#include "stm32f1xx_hal.h"
#include "ads1115.h"
#include "dht11.h"
#include "oled.h"
// 测量模式定义
#define MODE_VOLTAGE 0
#define MODE_CURRENT 1
#define MODE_TEMPERATURE 2
// 定义引脚
#define BUTTON_MODE_PIN GPIO_PIN_4
#define BUTTON_PORT GPIOA
// 函数声明
void System_Init(void);
void Measure_Voltage(void);
void Measure_Current(void);
void Measure_Temperature(void);
void Display_Result(float value, char *unit);
uint8_t Check_Button(uint16_t pin);
void Update_Measurement(void);
// 全局变量
uint8_t current_mode = MODE_VOLTAGE;
void System_Init(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_I2C1_Init();
MX_ADC1_Init();
OLED_Init();
ADS1115_Init(); // 初始化 ADS1115 高精度 ADC 模块
OLED_ShowString(0, 0, "Measurement Ready");
}
// 电压测量
void Measure_Voltage(void)
{
// 读取 ADS1115 的通道 0
float voltage = ADS1115_ReadVoltage(0);
Display_Result(voltage, "V");
}
// 电流测量
void Measure_Current(void)
{
// 读取 ADC 通道用于电流测量
uint32_t adc_value = HAL_ADC_GetValue(&hadc1);
float current = (adc_value / 4096.0) * 5.0; // 假设电流传感器的线性范围为 0-5A
Display_Result(current, "A");
}
// 温度测量
void Measure_Temperature(void)
{
// 假设使用 DS18B20 传感器读取温度
float temperature = DS18B20_ReadTemperature();
Display_Result(temperature, "C");
}
// 显示测量结果
void Display_Result(float value, char *unit)
{
OLED_Clear();
OLED_ShowString(0, 0, "Mode:");
switch (current_mode)
{
case MODE_VOLTAGE:
OLED_ShowString(48, 0, "Voltage");
break;
case MODE_CURRENT:
OLED_ShowString(48, 0, "Current");
break;
case MODE_TEMPERATURE:
OLED_ShowString(48, 0, "Temp");
break;
}
OLED_ShowString(0, 1, "Value:");
OLED_ShowFloat(48, 1, value, 2);
OLED_ShowString(80, 1, unit);
}
// 检查按键输入
uint8_t Check_Button(uint16_t pin)
{
return HAL_GPIO_ReadPin(BUTTON_PORT, pin) == GPIO_PIN_RESET;
}
// 更新测量模式
void Update_Measurement(void)
{
switch (current_mode)
{
case MODE_VOLTAGE:
Measure_Voltage();
break;
case MODE_CURRENT:
Measure_Current();
break;
case MODE_TEMPERATURE:
Measure_Temperature();
break;
}
}
int main(void)
{
System_Init();
while (1)
{
// 检查模式切换按键
if (Check_Button(BUTTON_MODE_PIN))
{
current_mode = (current_mode + 1) % 3; // 循环切换模式
HAL_Delay(300); // 防抖延时
}
// 更新测量结果
Update_Measurement();
HAL_Delay(1000); // 每秒更新一次测量数据
}
}
4. 高精度 ADC 读取
以下是使用 ADS1115 高精度 ADC 读取电压的代码示例:
#include "ads1115.h"
// 初始化 ADS1115
void ADS1115_Init(void)
{
// 配置 ADS1115 初始化参数
}
// 读取 ADS1115 电压值
float ADS1115_ReadVoltage(uint8_t channel)
{
int16_t raw_value = ADS1115_ReadChannel(channel);
float voltage = (raw_value * 0.1875) / 1000.0; // 假设增益为 1
return voltage;
}
5. 显示处理
OLED 显示屏用于显示实时测量结果:
#include "oled.h"
// 初始化 OLED
void OLED_Init(void)
{
// OLED 初始化代码
}
// 显示字符串
void OLED_ShowString(uint8_t x, uint8_t y, char *str)
{
// 在 OLED 上显示字符串
}
// 显示浮点数
void OLED_ShowFloat(uint8_t x, uint8_t y, float num, uint8_t decimal_places)
{
// 显示带小数点的数值
}
⬇帮大家整理了单片机的资料
包括stm32的项目合集【源码+开发文档】
点击下方蓝字即可领取,感谢支持!⬇
问题讨论,stm32的资料领取可以私信!
6. 系统工作原理
- 高精度电压测量:使用 ADS1115 高精度 ADC 进行电压测量,可以检测微小的电压变化,适用于实验室电路调试和电源监测。
- 电流检测:通过电流传感器(如 ACS712)实时监测电流流过情况,适合在电池监测、充电器测试等场合应用。
- 温度测量:使用 DS18B20 或 PT100 传感器,可以高精度地检测环境温度,确保在精密设备中的温度控制。
- 模式切换与显示:用户通过按键切换不同的测量模式,OLED 显示屏实时显示当前测量模式和结果,便于查看。
常见问题与解决方法
1. 测量精度不足
- 问题原因:ADC 分辨率不足或噪声干扰。
- 解决方法:使用高分辨率的 ADC,如 ADS1115,增加电路的滤波电容以减少噪声。
2. 显示屏不工作
- 问题原因:I2C 通信错误、OLED 供电不足。
- 解决方法:检查 I2C 线是否连接牢固,确保 OLED 模块的 I2C 地址配置正确。
3. 温度传感器读数不准
- 问题原因:传感器连接不良或未正确校准。
- 解决方法:检查 DS18B20 数据引脚连接,使用校准后的数据转换公式。
结论
通过本项目,我们成功设计了基于 STM32 的高精度数字测量仪,实现了电压、电流和温度的精确测量。系统采用高分辨率 ADC 进行数据采集,结合 OLED 显示屏提供直观的显示效果,适用于实验室和工业现场的精密测量场合。用户通过简单的按键操作即可切换测量模式,方便高效,适合广泛应用于多种测量需求中。
4o
标签:测量仪,高精度,void,引脚,测量,STM32,OLED,ADC,ADS1115 From: https://blog.csdn.net/2401_84204806/article/details/142791377