首页 > 其他分享 >基于STM32的高精度数字测量仪设计

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

时间:2024-10-09 17:18:15浏览次数:16  
标签:测量仪 高精度 void 引脚 测量 STM32 OLED ADC ADS1115

引言

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

相关文章

  • 【无标题】STM32 的中断系统
       中断概述 在主程序运行过程中, 出现了特定事件, 使得 CPU 暂停当前正在运行的程序, 转而去 处理这个事件, 等这个事件处理完成之后, CPU 再回到刚才被打断的位置继续处理, 这就 是中断。 那个打断 CPU 执行的特定事件, 我们一般称之为中断源。 被中断源打断......
  • STM32学习——IIC
    目录IIC总线协议IIC前置介绍IIC硬件软件区别IIC总线拓扑图IIC协议IIC协议时序代码编写起始信号​编辑停止信号检测应答信号发送应答信号发送非应答信号发送1字节数据读取1字节数据AT24C02简介AT24C02xx系列通讯地址AT24C02读写时序AT24C02驱动步骤配置I......
  • STM32入门教程:身份证识别
    STM32入门教程:身份证识别身份证识别是一种常见的图像处理应用,利用STM32等嵌入式平台进行身份证识别可以实现快速、准确的身份信息提取。本文将详细介绍如何使用STM32进行身份证识别,并提供代码案例供参考。一、身份证识别原理身份证识别主要涉及图像处理和模式识别两个方面。......
  • 20 基于STM32的温度、电流、电压检测proteus仿真系统(OLED、DHT11、继电器、电机)
    目录一、主要功能二、硬件资源三、程序编程四、实现现象一、主要功能基于STM32F103C8T6采用DHT11读取温度、滑动变阻器模拟读取电流、电压。通过OLED屏幕显示,设置电流阈值为80,电流小阈值为50,电压阈值为60,温度阈值为30随便哪个超过预祝,则继电器切断,LED灯灭掉,若电流......