基于STM32的数字电压表设计

 

目录

  1. 引言
  2. 系统设计
    1. 硬件设计
    2. 软件设计
  3. 系统功能模块
    1. 电压采样模块
    2. 数据处理模块
    3. 显示模块
  4. 控制算法
    1. 电压采样与转换算法
    2. 数据滤波与显示更新算法
  5. 代码实现
    1. 电压采样代码
    2. 数据滤波代码
    3. 显示更新代码
  6. 系统调试与优化
  7. 结论与展望

1. 引言

数字电压表是一种常见的电力测试设备,用于实时监测电压值。相比传统的模拟电压表,数字电压表具有精度高、响应快、显示直观等优点。本文设计了一款基于STM32的数字电压表,能够实时采集电压信号,通过滤波和计算显示稳定的电压值。该系统广泛应用于实验室、工业电源监测等场景。


2. 系统设计

2.1 硬件设计
  1. 主控芯片:STM32F103系列单片机,负责电压采集、数据处理和显示控制。
  2. 分压电路:通过电阻分压将高电压信号降低到ADC输入范围(如3.3V以下)。
  3. ADC模块:STM32的内置ADC,用于将模拟电压信号转换为数字信号。
  4. 显示模块:采用LCD或OLED显示屏,实时显示电压值。
  5. 电源模块:提供稳定的系统电源。
2.2 软件设计
  1. 电压采样模块:通过ADC采集分压电路的输出电压。
  2. 数据处理模块:对采样数据进行滤波和计算,将ADC值转换为实际电压值。
  3. 显示模块:更新LCD或OLED屏幕,显示当前电压值。

3. 系统功能模块

3.1 电压采样模块
  • 使用STM32内置ADC采样分压电路的输出电压。
  • 支持多通道采样,扩展其他信号采集功能。
3.2 数据处理模块
  • 根据分压比计算实际电压值: Vin=Vout×R1+R2R2V_{\text{in}} = V_{\text{out}} \times \frac{R_1 + R_2}{R_2}Vin​=Vout​×R2​R1​+R2​​ 其中:
    • VinV_{\text{in}}Vin​:实际输入电压
    • VoutV_{\text{out}}Vout​:分压后电压
    • R1R_1R1​、R2R_2R2​:分压电阻
  • 对采样数据进行滤波处理,减少波动。
3.3 显示模块
  • 实时更新LCD显示屏,显示当前电压值。
  • 提供单位选择功能(如V、mV)。

4. 控制算法

4.1 电压采样与转换算法

5.1 电压采样代码

5. 代码实现

  • 使用ADC采样分压后的电压信号。
  • 通过分压比和参考电压计算实际电压。
    #define ADC_RESOLUTION 4096      // ADC分辨率
    #define V_REF 3.3                // 参考电压(单位:V)
    #define R1 10000                 // 分压电阻R1(单位:欧姆)
    #define R2 1000                  // 分压电阻R2(单位:欧姆)
    
    float calculate_voltage(uint16_t adc_value) {
        float v_out = (adc_value / (float)ADC_RESOLUTION) * V_REF;  // 转换为分压后的电压
        return v_out * (R1 + R2) / R2;                             // 计算实际电压
    }
    
    4.2 数据滤波与显示更新算法
  • 使用简单的均值滤波算法: Vfiltered=∑VsamplesNV_{\text{filtered}} = \frac{\sum V_{\text{samples}}}{N}Vfiltered​=N∑Vsamples​​
  • 定期刷新显示数据,避免屏幕闪烁。
#define ADC_RESOLUTION 4096      // ADC分辨率
#define V_REF 3.3                // 参考电压(单位:V)
#define R1 10000                 // 分压电阻R1(单位:欧姆)
#define R2 1000                  // 分压电阻R2(单位:欧姆)

float calculate_voltage(uint16_t adc_value) {
    float v_out = (adc_value / (float)ADC_RESOLUTION) * V_REF;  // 转换为分压后的电压
    return v_out * (R1 + R2) / R2;                             // 计算实际电压
}

5.2 数据滤波代码

#define SAMPLE_COUNT 10

float apply_average_filter(uint16_t* samples) {
    uint32_t sum = 0;
    for (int i = 0; i < SAMPLE_COUNT; i++) {
        sum += samples[i];
    }
    return (float)sum / SAMPLE_COUNT;
}

5.3 显示更新代码

#include "lcd.h"

void update_display(float voltage) {
    char buffer[16];
    LCD_Clear();
    sprintf(buffer, "Voltage: %.2f V", voltage);
    LCD_DisplayString(buffer);
}

5.4 主函数

int main() {
    HAL_Init();
    ADC_Init();
    LCD_Init();

    uint16_t samples[SAMPLE_COUNT] = {0};
    int sample_index = 0;

    while (1) {
        samples[sample_index] = read_adc();  // 采集ADC值
        sample_index = (sample_index + 1) % SAMPLE_COUNT;

        float filtered_adc = apply_average_filter(samples);  // 滤波处理
        float voltage = calculate_voltage(filtered_adc);     // 计算电压

        update_display(voltage);  // 更新显示
        HAL_Delay(100);           // 每100ms刷新一次
    }
}

⬇帮大家整理了单片机的资料

包括stm32的项目合集【源码+开发文档】

点击下方蓝字即可领取,感谢支持!⬇

点击领取更多嵌入式详细资料

问题讨论,stm32的资料领取可以私信!

6. 系统调试与优化

  1. 传感器校准:使用标准电压源校准分压电路,确保测量精度。
  2. 滤波优化:根据环境噪声选择适当的滤波算法(如均值滤波或中位数滤波)。
  3. 显示刷新:优化显示刷新频率,避免屏幕闪烁或数据延迟。
  4. 低功耗设计:在非测量状态下,进入低功耗模式延长电池续航。

7. 结论与展望

本文设计了一款基于STM32的数字电压表,能够实时采集和显示电压值,具有精度高、响应快的优点。未来可以扩展更多功能,如无线通信、数据记录、波形显示等,进一步提升系统的实用性与智能化水平。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值