
STM32电压电流表
简介
借助STM32F103的片上ADC开发的一款电压电流表,可对0-3V,0-30V电压及0-3A电流进行测量,可达到较好的精度。
简介:借助STM32F103的片上ADC开发的一款电压电流表,可对0-3V,0-30V电压及0-3A电流进行测量,可达到较好的精度。开源协议
:GPL 3.0
(未经作者授权,禁止转载)描述

>本工程软件及硬件主体来源于 @大道至简 的项目 【新手向】地文星CW32电压电流表
>站内开源地值:https://oshwhub.com/zk272761180/learning-gewenxing-cw32f030c8t6-
>在移植STM32F103平台过程中,在硬件上修改了核心板与外设连接的引脚,软件上使用标准库重新进行配置并整理了功能函数,现可在STM32F103C8T6平台完美运行。
一、硬件设计
除了单片机接口引脚分配部分因为与CW32的内部资源复用引脚不同而进行了修改,其余电路保持一致
稳压电源

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

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

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

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

模拟测量电路


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


>不焊接采样电阻R0,短接该排针可进行模拟电流测量。
测量校准电路

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

二、软件设计
引脚分配

>在原作基础修改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用于配置测量模式和各标定默认参数。

>此处可设置选择的测量模式 拟合或标定模式。
>经实测,标定模式需要进行一轮标定后误差才较小,不进行标定误差比直接使用拟合模式大。
四、标定相关研究
见原作开源项目:https://oshwhub.com/zk272761180/learning-gewenxing-cw32f030c8t6-
相比于原作可以改进的点
- STM32不支持1.5V基准电压,只支持内部VDDA的3.3V基准电压。为了不改动太多原版的功能代码,我们这里使用软件映射的方法模拟1.5V基准电压(当然会损失一定精度),未来计划改为使用3.3V基准电压实现。
- ADC采集设置为单通道非扫描非连续方式,一次只转换一个通道。可以改进为多通道扫描,DMA搬运的方式提高效率。
- 原作硬件设计有一个2.5V电压源,软件中使用了一个通道采集数据后没有进行后续处理,后续可以加入使用该电压源进行ADC校准的相关程序。
设计图
未生成预览图,请在编辑器重新保存一次BOM
暂无BOM
克隆工程知识产权声明&复刻说明
本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。
请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。










