站内搜索
发作品签到
STM32电压电流表
专业版

STM32电压电流表

814
0
0
0

简介

借助STM32F103的片上ADC开发的一款电压电流表,可对0-3V,0-30V电压及0-3A电流进行测量,可达到较好的精度。

简介:借助STM32F103的片上ADC开发的一款电压电流表,可对0-3V,0-30V电压及0-3A电流进行测量,可达到较好的精度。

开源协议

GPL 3.0

(未经作者授权,禁止转载)
创建时间:2025-12-02 20:05:18更新时间:2025-12-03 09:43:14

描述

电压电流表封面.png
>本工程软件及硬件主体来源于 @大道至简 的项目 【新手向】地文星CW32电压电流表
>站内开源地值:https://oshwhub.com/zk272761180/learning-gewenxing-cw32f030c8t6-
>在移植STM32F103平台过程中,在硬件上修改了核心板与外设连接的引脚,软件上使用标准库重新进行配置并整理了功能函数,现可在STM32F103C8T6平台完美运行。

一、硬件设计

除了单片机接口引脚分配部分因为与CW32的内部资源复用引脚不同而进行了修改,其余电路保持一致

稳压电源

image.png
>使用线性稳压器SE8550线性稳压器完成最高40V电压输入5V稳压,也可选用SE8650等型号LDO或封装更大的LOD,实测在一般工作条件下基本不发热。
>使用肖特基二极管1N5819完成防反接功能。但使用二极管方案有不可忽视的0.2V左右压降在成本允许的情况下可换为PMOS防反接方案,压降较小。

电压测量

image.png
>使用电阻串联分压原理。
>0-3V档为1:1分压,满量程时ADC采样原始数据为4095(1.5V基准)
>0-30V档为1:19分压,实际量程约为34V

电流测量

image.png
>使用100毫欧采样电阻,测量电阻两端分压即可计算出流过电阻的电流

image.png
原作中使用开尔文接法减小焊接电阻的影响

image.png

模拟测量电路

image.png
image.png
>短接该排针后可调节电位器进行模拟测量

image.png
image.png
>不焊接采样电阻R0,短接该排针可进行模拟电流测量。

测量校准电路

image.png
>TL431是由美国德州仪器公司(TI)和Motorola公司生产的2.50~36V可调精密并联稳压器,它是一种具有可调电流输出能力的基准电压源。可以使用TL431电路提供2.5V基准电压,用于给MCU校准AD外部电压。

成品展示

image.png

二、软件设计

引脚分配

image.png
>在原作基础修改PB10(ADC_IN11)和PB11(ADC_IN12)两个引脚到PA6(ADC1_IN6)和PA7(ADC1_IN7)。将原作中控制D和E的PA6,PA7换为PB10,PB11

原作中使用了PA15 PA3 PA4这三个引脚。在标准库配置使用推挽输出配置PA15,PB3,PB4完成后发现无论如何调用函数修改电平状态,电压始终为1.5V,到网上查了一下发现是因为这是三个引脚作为JTAG接口,同时没有失能JTAG。在GPIO配置函数中增加以下代码即可解决问题。

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//使能端口复用时钟
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//失能JTAG

ADC模块

配置PA6 PA7 PB0 PB1这几个引脚为模拟输入,ADC设置为单通道转换,非连续非扫描,并进行校准。

  • 使用ADC_RegularChannelConfig函数选择选择通道并使用ADC_SoftwareStartConvCmd触发一次转换,待转换完成后使用ADC_GetConversionValue读取对应通道数据。
  • 每个通道采集的数据被分别放到以下四个数组中
    Volt_high_Buffer[ADC_SAMPLE_SIZE];//电压大量程采样
    Volt_low_Buffer[ADC_SAMPLE_SIZE];//电压小量程采样
    Volt_REF_Buffer[ADC_SAMPLE_SIZE];//参考电压采样
    Iflow_Buffer[ADC_SAMPLE_SIZE];//电流采样
  • 每个通道中的100个数据会被用于终端中调用的中值均值滤波函数处理。

设置通道,触发转换,模拟1.5V量程这几个工作使用一个函数完成。

uint16_t Read_ADC_With_VirtualRef(uint8_t channel)
{
    uint16_t adc_value,virtual_adc_value;
    float voltage;
    ADC_RegularChannelConfig(ADC1, channel, 1, ADC_SampleTime_55Cycles5);
    //软件触发AD转换一次
    ADC_SoftwareStartConvCmd(ADC1, ENABLE);
    //等待EOC标志位,即等待AD转换结束
    while (ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == RESET);
    adc_value = ADC_GetConversionValue(ADC1);
    // 将读数缩放到1.5V基准
    voltage = ((float)adc_value / 4095.0f) * VDDA_ACTUAL;
    virtual_adc_value = (uint16_t)((voltage / VIRTUAL_REF) * 4095.0f);
    if(virtual_adc_value<4095)
    {
        return virtual_adc_value;        
    }
    else
    {
        return 4095;
    }
}

通用定时器TIM2

配置TIM2定时周期为1ms,在中断服务函数中完成以下任务。

  • 任务一:获取ADC变量;
  • 任务二:数码管更新显示:将数码管显示缓存区数据显示出来;
  • 任务三:读取按键控制:
    按键一:切换Mode,同时依据不同模式读取不同数据并更新显示数码管内容;
    按键二:标定设置,按下时将参数储存进FLASH并计算斜率、更新数码管;
    按键三:返回至Mode 0,即普通测量模式,更新数码管显示。
    另外,BTIM中还配置有LED缓存区更新计数器timecount和LED闪烁计数器ledcount,以配合实现相应功能。

数码管驱动

数码管驱动模块实现了数据编码(单位显示)、动态显示(三位显示)、坏道检测等功能:

  • 数据编码:依据原理图编码了0-9/0.-9./A./V./-/.等数字、字符编码,以显示特定信息;
  • 动态显示:结合数据编码实现数字和字符信息显示:
  • 数字显示:传入2-5位数字(实意为2位小数点有效位数的数字,乘以100),依据数字位数判断显示XXX、XX.X、X.XX、0.XX;
  • 字符信息:配置Mode 1-4四种显示模式,分别显示V05、V15、A.0.5、A.1.5;
  • 其他信息:如未接入数据时编码为“---”等;
  • 坏道检测功能:选择性开启或者设置按键开启,用于从000切换显示至9.9.9以检测数码管坏道。

Flash模块

  • 使用标定模式时,对电压标定点和电流标定点有标定参数X05/X15/IX05/IX15,在标定模式时按下标定键(K2)时即会调用flash_write函数写入。
  • 开机时调用READ_Data函数读取标定数据并调用CALCU_Ks函数计算。
  • 针对STM32标准库改写了相关的写入/读取函数。

三、使用与调试

基本使用

上电后上面数码管显示电压,下面数码管显示电流,按下模式键可进入3V标定模式,继续按模式键可切换不同的标定模式。
>下方显示U.03 电压3V标定 下方显示电压
>下方显示U.08 电压8V标定 下方显示电压
>下方显示U.15 电压15V标定 下方显示电压
>下方显示A.0.5 电流0.5A标定 下方显示电流
>下方显示A.1.0 电流1.9A标定 下方显示电流
>下方显示A.2.0 电流2.0A标定 下方显示电流

此时可以选择使用模拟输入或实际输入进行标定。
>* 使用模拟输入电压时,JP1短接,万用表红表笔接T_V,黑表笔接GND,调节电压调节电位器,待万用表显示为当前标定电压时即可按下标定键保存返回。
>* 使用实际输入电压时,JP1不短接,万用表红表笔接T_V,黑表笔接GND,外部电压输入正极接+V,负极接GND,待万用表显示为当前标定电压时即可按下标定键保存返回。
>* 使用模拟输入电流时,JP2短接,不焊接采样电阻R0。万用表红表笔接T_I+,黑表笔接GND,调节电流调节电位器,待万用表电压显示为当前标定电流值的1/10时即可按下标定键保存返回。
>* 使用实际输入电流时,JP2不短接,焊接采样电阻R0。万用表红表笔接T_I+,黑表笔接GND,外部电流输入正极接I+,负极接I-,待万用表电压显示为当前标定电流值的1/10时即可按下标定键保存返回。

普通测量的四种方式接线与上面相同,只是不用进入标定模式。

配置文件

工程中有文件ConstParameter_Config.h用于配置测量模式和各标定默认参数。

image.png
>此处可设置选择的测量模式 拟合或标定模式。
>经实测,标定模式需要进行一轮标定后误差才较小,不进行标定误差比直接使用拟合模式大。

四、标定相关研究

见原作开源项目:https://oshwhub.com/zk272761180/learning-gewenxing-cw32f030c8t6-

相比于原作可以改进的点

  • STM32不支持1.5V基准电压,只支持内部VDDA的3.3V基准电压。为了不改动太多原版的功能代码,我们这里使用软件映射的方法模拟1.5V基准电压(当然会损失一定精度),未来计划改为使用3.3V基准电压实现。
  • ADC采集设置为单通道非扫描非连续方式,一次只转换一个通道。可以改进为多通道扫描,DMA搬运的方式提高效率。
  • 原作硬件设计有一个2.5V电压源,软件中使用了一个通道采集数据后没有进行后续处理,后续可以加入使用该电压源进行ADC校准的相关程序。

设计图

未生成预览图,请在编辑器重新保存一次

BOM

暂无BOM

3D模型

序号文件名称下载次数
暂无数据

附件

序号文件名称下载次数
1
STM32_VAMeter.zip
32
克隆工程
添加到专辑
0
0
分享
侵权投诉
知识产权声明&复刻说明

本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。

请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。

底部导航