当前位置: 首页 > article >正文

基于STM32的高精度数字测量仪设计

引言

本项目设计了一个基于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


http://www.kler.cn/news/340140.html

相关文章:

  • 第三方软件测试报告包括哪些内容?需要多少时间和费用?
  • flask项目框架搭建
  • 【AI学习】Mamba学习(五):《HiPPO: Recurrent Memory with Optimal Polynomial Projections》
  • MES(Manufacturing Execution System,制造执行系统)核心模块
  • 滚雪球学MySQL[10.3讲]:MySQL社区资源与学习资料详解:官方文档、社区支持与工具推荐
  • 【GeekBand】C++设计模式笔记5_Observer_观察者模式
  • 深度学习Day-35:One-hot独热编码
  • nginx配置https加密
  • 5G NR相关笔记
  • Linux 命令 netstat 的 10 个基本用法
  • 以 AI 强化学习优化双边交易与借贷投资组合
  • 模拟算法基础C++
  • 计算机毕业设计 基于Python的新闻采集与订阅平台的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档
  • TM1618控制共阳极数码管的数据传送问题
  • everyday_question dq20240731
  • TCL Android面试题大全及参考答案
  • python 实现kahns algorithm卡恩算法
  • 人脸表情行为识别系统源码分享
  • 【网络安全】利用XSS、OAuth配置错误实现token窃取及账户接管 (ATO)
  • AMD股价分析:AMD股价能否再次反弹至200美元?以下是你该知道的!