
电压电流表
简介
本项目设计一个电压电流表项目,主要使用了CW32F030C8T6处理器作为核心器件,实现对电压和电流的测量,整个过程使用电位器模拟电压和电流,直接就可以测量得到电压和电流数值,通过2个三位数码管显示。
简介:本项目设计一个电压电流表项目,主要使用了CW32F030C8T6处理器作为核心器件,实现对电压和电流的测量,整个过程使用电位器模拟电压和电流,直接就可以测量得到电压和电流数值,通过2个三位数码管显示。开源协议
:GPL 3.0
描述
项目简介
本项目设计一个电压电流表项目,主要使用了CW32F030C8T6处理器作为核心器件,实现对电压和电流的测量,12位高精度的ADC确保了数据的准确性,整个过程使用电位器模拟电压和电流,直接就可以测量得到电压和电流数值,通过2个三位数码管显示,显示的结果也可以与万用表测量的数值进行比对,并设置了K1,K2,K3三个按键对测量结果进行校正,从而实现了更高的精度测量。
项目功能
本设计是基于CW32F030C8T6的地文星开发版为基础电路板,通过电位器模拟电压和电流型号,实现对电流电压的测量,电压和电流的测量都是通过电压来实现的。通过CW32处理器内部高精度的12位ADC对采集数据进行处理,然后在通过2个三位的数码管显示,该设计还设定了K1,K2和K3三个按键对测量结果进行校正,实现对测量电压和电流数据的准确性,对于初学正具有 很好的指导作用。
项目参数
此处可填写项目的相关功能参数介绍,示例:
- 本设计采用12位的ADC数据采集功能,确保了电压和电流表数据的准确性。
- CW32单片机内置1.5V和2.5V参考电压,基准电压非常精确。
- 留有万用表测量端口,将万用表测量数据与电路测量数据进行比对和校正,提高了测量的准确性。
- 对采集的数据进行中值滤波算法,数据显示比较稳定。
原理解析(硬件说明)
LDO电源电路
本项目使用LDO作为电源,考虑到实际的电压表头产品多在24V或36V供电的工业场景中应用,本项目选择了最高输入电压高达40V的SE8550K2作为电源。本项目没有使用DCDC降压电路来应对大压差的主要原因为避免设计过程中引入DCDC的纹波干扰,次要原因为降低项目成本。
数码管显示电路
在本项目中使用了两颗0.28寸的三位共阴数码管作为显示器件,相较于显示屏,数码管在复杂环境中拥有更好的识别度,可以根据实际使用环境的需求,改为更小的限流电阻实现更高的数码管亮度;在另一方面,数码管拥有较好的机械性能,不会像显示屏一样容易被外力损坏。在工业等有稳定可靠性应用中,多被采用。从开发版学习的角度来看,更易有目的的学习电子测量原理相关开发。
在本项目中,经过实际测试,数码管的限流电阻(R1~R6)被配置为300Ω,对应的亮度无论是红色还是蓝色数码管,均具有较好的识别度,且亮度柔和不刺眼。
GPIO引脚LED灯电路
LED1的正极经限流电阻 R10 接到电源正极,LED1 的负极连接到单片机的 GPIO 口上,通过 LED 灯的驱动原理,只需要将相应 GPIO(PC13)配置为低电平即可点亮LED1。
按键控制电路
按键控制电路有多种设计方式,得益于CW32的I/O口内部可以配置上下拉电阻,在芯片外围的按键控制电路则无需配置。按键一端接入MCU的I/O上,另一端接地。按键按下,I/O被拉低。
软件代码
GPIO初始化
由于时钟的配置在之前的章节已有说明,故不再赘述,我们直接对端口进行初始化。初始化的代码与上文GPIO输出的配置略有不同。
void KEY_Configuration(void)
{
__RCC_GPIOB_CLK_ENABLE();//打开GPIOB的时钟,PB14控制按键输入
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pins = GPIO_PIN_14;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT_PULLUP; //没有输入时PB14默认为高电平
GPIO_InitStruct.IT = GPIO_IT_NONE;
GPIO_Init(CW_GPIOB, &GPIO_InitStruct);
}
void LED_Configuration(void)
{
__RCC_GPIOC_CLK_ENABLE();//打开GPIOC的时钟,PC13控制LED亮灭
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pins = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.IT = GPIO_IT_NONE;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_Init(CW_GPIOC, &GPIO_InitStruct);
}
数码管显示代码
/* 共阴数码管编码表:
0x3f 0x06 0x5b 0x4f 0x66 0x6d 0x7d 0x07 0x7f 0x6f
0 1 2 3 4 5 6 7 8 9
0xbf 0x86 0xdb 0xcf 0xe6 0xed 0xfd 0x87 0xff 0xef
0. 1. 2. 3. 4. 5. 6. 7. 8. 9. */
//0x3f, 0011 1111; 0x5b 0101 1011
uint8_t Seg_Table[20] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f,
0xbf, 0x86, 0xdb, 0xcf, 0xe6, 0xed, 0xfd, 0x87, 0xff, 0xef};
void Seg_Configuration(void) //查找原理图对数码管相关引脚进行初始化
{
__RCC_GPIOA_CLK_ENABLE(); //打开GPIOA的时钟
__RCC_GPIOB_CLK_ENABLE(); //打开GPIOB的时钟
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.Pins = GPIO_PIN_2 | GPIO_PIN_0 | GPIO_PIN_4 | GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_1 | GPIO_PIN_3 | GPIO_PIN_5 | GPIO_PIN_8 | GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_15;
//A:PA02;B:PA00;C:PA04;D:PA06;E:PA07;F:PA01;G:PA03;DP:PA05;
//COM1:PA08;COM2:PA11;COM3:PA12;COM4:PA15;COM5:PB03;COM6:PB04;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.IT = GPIO_IT_NONE;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_Init(CW_GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pins = GPIO_PIN_3 | GPIO_PIN_4; //COM5:PB03;COM6:PB04
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.IT = GPIO_IT_NONE;
GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
GPIO_Init(CW_GPIOB, &GPIO_InitStruct);
}
均值滤波算法:
均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。线性滤波的基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点(x,y),选择一个模板,该模板由其近邻的若干像素组成,求模板中所有像素的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度g(x,y),即g(x,y)=∑f(x,y)/m,m为该模板中包含当前像素在内的像素总个数。
这本是数字图像处理的一种方法,但也可以用在我们数字电压电流表的ADC采样数据上。我们选取二十次的ADC采样值存储在数组 Volt_Buffer 中,然后去除掉数组中的最大值和最小值后再取平均,得到的值作为结果显示在数码管上,这样可以较大程度获得准确的、不易波动的数据。
uint32_t Mean_Value_Filter(uint16_t *value, uint32_t size) //均值滤波
{
uint32_t sum = 0;
uint16_t max = 0;
uint16_t min = 0xffff;
int i;
for(i = 0; i < size; i++) //遍历数组找到最大值和最小值
{
sum += value[i];
if(value[i] > max)
{
max = value[i];
}
if(value[i] < min)
{
min = value[i];
}
}
sum -= max + min; //减去最大和最小值后求平均
sum = sum / (size - 2);
return sum;
}
注意事项
- 在进行电流测量时,R0不要接入电路。
- 测量电阻处的电路采用开尔文接法,提高测量的精度
- 使用电位器模拟电压和电流的测量对象,可不用真正的接入外围电路。
实物图显示
实物图
设计图

BOM


评论