发作品签到
专业版

基于CW32的数字电压电流表——Jkun Mikey

工程标签

60
0
0
1

简介

立创电压电流表训练营结营小项目

简介:立创电压电流表训练营结营小项目
电压电流表训练营【立创开发板&CW32】
复刻成本:50

开源协议

GPL 3.0

创建时间:2024-07-22 16:42:53更新时间:2024-08-26 16:47:19

描述

 

外壳和面板第一次做,有点不好

一、项目简介

(一) 项目背景与意义

设计并制作一个数字电压电流表是提升数模电技术与单片机应用能力的绝佳途径。该项目涵盖电路设计、信号采集处理、用户界面开发等多个方面,非常适合电子技术初学者。

通过这个嘉立创的训练营活动,自己动手,最后真的学到很多东西,硬件、软件、3D建模、面板设计,而且这些嘉立创全都提供免费的优惠券给我们学习。几乎是零成本,只要你想搞,还有好多大佬在群里帮忙解答,学习氛围拉满好吧,这不比学校随便教的好,好太多了!!!!

立创开发板真的就是不以卖板子赚钱,而是培养中国工程师为使命!!!

总之通过这个真的学的很多,发现了自己的不足,参与的过程也是乐在其中。

(二) 项目亮点

在完成立创训练营数字电压电流表的基本功能之后,我加了一下自己的东西,最难的还是那个电压电流标定测量的部分,无论是硬件还是软件,但是自己做了一遍之后就没那么难了。

1. 开机小动画,两个小笑脸:

2. 为了防止误触发,我把KEY1改成了长按2S进入参数设置界面。双击KEY2确认修改对应标定参数的值。

3. 通过串口将电压电流数据发送到上位机,或者之后当成一个模块,发给另外一块单片机。

(三) 演示小视频

完了,真让我学到东西了~_哔哩哔哩_bilibili

https://www.bilibili.com/video/BV1BjWkevE8o/?vd_source=b3782bc780e6d1c9fbdb61b02c6df06b

二、主要的硬件设计

(一) DC电源

LDO(低压差线性稳压器)选型
本项目使用LDO作为电源,考虑到实际的电压表头产品多在24V或36V供电的工业场景中应用,本项目选择了最高输入电压高达40V的SE8550K2作为电源。

SE8550K2是一款低压差线性稳压器,具有稳定输出、低噪声、简单外围电路等优点,广泛应用于家电、通信、工控等领域。虽然效率相对较低,但适合需要高质量电源输出的应用。

本项目没有使用DCDC降压电路来应对大压差的主要原因为避免设计过程中引入DCDC的纹波干扰,次要原因为降低项目成本。

(二) MCU的选型分析

本项目使用立创·地文星CW32F030C8Tx开发板(核心板)作为主控

1. CW32在本项目中的重要优势

  • 宽工作温度:-40~105℃的温度范围
  • 宽工作电压:1.65V~5.5V (STM32仅支持3.3V系统)
  • 超强抗干扰:HBM ESD 8KV 全部ESD可靠性达到国际标准最高等级(STM32 ESD2KV)
  • 本项目重点-更好的ADC:12位高速ADC 可达到±1.0LSB INL 11.3ENOB 多种Vref参考电压... ...(STM32仅支持VDD=Vref)
  • 稳定可靠的eFLASH工艺。

2. CW32的ADC主要特性
内容来自《CW32x030 用户手册》

(三) 电压采样电路

本项目设计分压电阻为220K+10K,因此分压比例为22:1(ADC_IN11)

1. 分压电阻选型

  1. 设计测量电压的最大值,出于安全考虑,本项目为30V(实际最大可显示99.9V或100V);
  2. ADC参考电压,本项目中为1.5V,该参考电压可以通过程序进行配置;
  3. 功耗,为了降低采样电路的功耗,通常根据经验值将低侧电阻(R7)选择为10K;

随后便可以通过以上参数计算出分压电阻的高侧电阻:

  1. 计算所需的分压比例:即ADC参考电压:设计输入电压,通过已知参数可以计算出1.5V/30V=0.05
  2. 计算高侧电阻:即低侧电阻/分压比例,通过已知参数可以计算出10K/0.05=200K
  3. 选择标准电阻:选择一颗略高于计算值的电阻,计算值为200K,通常我们选择E24系列电阻,因此本项目中选择大于200K且最接近的220K。

如果在实际使用中,需要测量的电压低于2/3的模块设计电压,即66V,则可以根据实际情况更换分压电阻并修改程序从而提升测量的精度,下面将进行案例说明:

  1. 假设被测电压不高于24V,其他参数不变
  2. 通过计算可以得到1.5V/24V=0.0625,10K/0.0625=160K,160K为标准E24电阻可以直接选用,或适当留出冗余量选择更高阻值的180K

如果在实际使用中,需要测量的电压若高于模块99V的设计电压,可以选择更换分压电阻或通过修改基准电压来实现更大量程的电压测量范围,下面将进行案例说明:

  1. 假设被测电压为160V,选择提升电压基准的方案扩大量程
  2. 已知选用电阻的分压比例为0.0145,通过公式反推,我们可以计算出160V*0.0145=2.32V,因此我们可以选择2.5V的电压基准来实现量程的提升(扩大量程将会降低精度)

考虑到被测电源可能存在波动,在电路设计时,在低侧分压电阻上并联了10nF的滤波电容提高测量稳定性。

2. 换挡

在本项目中,额外增加了一组电压采样电路,因此,我们可以探讨一下换挡对于提高测量精度的意义。万用表想要测的更准确,往往设置了多个档位。通过对不同档位的调整,获得被测点位在相应量程下的最佳的测量精度。

本项目实现此功能需要实现软硬件结合。当我们首先使用前文所讲的ADC_IN11通道测量30V以内电压时。若所测得电压在0~3V以内,则使用ADC_IN9通道测量。此时,由于分压比减小,测量精度大大提高。

(四) 电流采样电路

本项目采用低侧电流采样电路进行电流检测,采样电路的低侧与开发板表头接口共地

1. 设计分析

本项目设计的采样电流为3A,选择的采样电阻(R0)为100mΩ
采样选型主要需要参考以下几个方面:

  1. 预设计测量电流的最大值,本项目中为3A
  2. 检流电阻带来的压差,一般不建议超过0.5V
  3. 检流电阻的功耗,应当根据该参数选择合适的封装,本项目考虑到大电流时的功耗(温度)问题,选择了1W封装的金属绕线电阻
  4. 检流电阻上电压的放大倍数:本项目中没有使用运放搭建放大电路,因此倍率为1

随后便可以通过以上参数计算出检流的阻值选择:

  1. 由于本项目没有使用放大电路,因此需要选择更大的采样电阻获得更高的被测电压以便于进行测量
  2. 考虑到更大的电阻会带来更大的压差、更高的功耗,因此也不能无限制的选择更大的电阻
  3. 本项目选用了1W封装的电阻,对应的温升功率为1W

综合以上数据,本项目选择了100mΩ的检流电阻,根据公式可以计算出3A*100mΩ=300mV,900mW

如需应对不同的使用环境,尤其是电流较大的场景,可以将R0电阻更换为康铜丝或者分流器,可以更具实际使用场景,选择替代。出于安全和学习用途考虑,本项目对超出3A量程不做过多探讨,但原理一致。

(五) 数码管显示

本项目采用了数码管作为显示单元。

在本项目中使用了两颗0.28寸的三位共阴数码管作为显示器件,本来想搞一个OLED或者LCD的,后面偷懒没选了,而且踩了一个坑,就是忘记买两个颜色不一样的数码管了。

数码管的限流电阻(R1~R6)被配置为300Ω,对应的亮度无论是红色还是蓝色数码管,均具有较好的识别度,且亮度柔和不刺眼。

严格来讲,限流电阻应该加在段上,加在位上,会影响显示效果。加在位上,省几个电阻。

1. 数码管供电电流

本项目实际采用动态扫描显示驱动数码管,因而在同一时刻,最多仅有8个段的数码管(或理解为LED)被点亮,或者说有某一位被点亮。根据设计,所需驱动电流即为IO口高电平电压3.3V÷300Ω≈11mA。

此时应注意选型的MCU是否有足够的拉电流/灌电流的能力。

由数据手册分析可知,CW32满足要求。👍

(六) 电压测量校准的TL431电路设计

本项目额外增加了一个TL431电路用来提供一个2.5V的基准电压,可用于给芯片一个用于校准AD的外部电压基准,从产品设计角度来讲,由于CW32本身的ADC性能优势,也可以不需要此电路。主要是后面可能会移植一下到stm32F103c8t6上,这两个开发板引出的引脚位置一样可以直插,但是要改代码设置,不能直接换。

TL431其定义为:精密可编程基准

1. 精密

精密,说明其输出电压非常准。我使用的为±0.5%精度的TL431,在室温下,板上实测2.495V。相较于常见的稳压二极管,精度天差地别。在应用电路图中,TL431内部以一个稳压管的符号做示意。

2. 可调输出电压

可调输出电压在Vref到36V之间,我们在项目中使用输出Vref电压。Vref电压约为2.5V。所以我们在描述中用2.5V,实际是约等于的。

3. 灌电流能力

也就是输出电压的引脚可以提供多少电流,这与在应用电路中的电阻(R13)的阻值有很大关系。不能低于1mA。如果没有灌电流的需求,则不要将电流设计过大,造成不必要的功耗影响。

三、软件设计

(一) 标定

标定是通过测量标准器的偏差来补偿仪器系统误差,从而改善仪器或系统准确度、精度的操作。为了提高电压电流表在测量时的测量精度和准确度,需要对电压电流进行标定校准。

常见的标定原理如下:

假设一个采样系统,AD部分可以得到数字量,对应的物理量为电压(或电流);

  1. 若在“零点”标定一个AD值点Xmin,在“最大处”标定一个AD值点Xmax,根据“两点成一条直线”的原理,可以得到一条由零点和最大点连起来的一条直线,这条直线的斜率k很容易求得,然后套如直线方程求解每一个点X(AD采样值),可以得到该AD值对应的物理量(电压值):

上图中的斜率k:

k =(Ymax-Ymin)/(Xmax-Xmin)

(因为第一点为“零点”,故上面的Ymin = 0)

所以,上图中任一点的AD值对应的物理量:

y = k×(Xad- Xmin)+0

  1. 上面的算法只是在“零点”和“最大点”之间做了标定,如果使用中间的AD采样值会带来很大的对应物理量的误差,解决的办法是多插入一些标定点。

如下图,分别插入了标定点(x1,y1)、(x2,y2)、(x3,y3)、(x4,y4) 四个点:

这样将获得不再是一条直线,而是一条“折现”(相当于分段处理),若欲求解落在x1和x2之间一点Xad值对应的电压值:

y = k×(Xad– X1)+ y1

由上看出,中间插入的“标定点”越多,得到物理值“精度”越高。

在电压电流表测量可以使用“电压电流标定板”“万用表”等配合适合,对采集的电压电流进行标定处理。标定点越多,测量越精确。

本项目使用了3点标定。其中,电压标定点为0V、5V、15V。电流标定点为0A、0.5A、1.5A。

(二) 均值滤波

我们选取二十次的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;
}

(三) 按键控制切换:

KEY1:显示模式的切换、一个是正常显示测量值,还有一个是显示标定参数的设置界面的切换,长按2S进入参数设置界面。

KEY2:对当前标定的设置参数进行确认,为了防止误触,必须双击确认。

KEY3:电压电流值打印的开关。

////////////////////////////////////////////////////////////////////////
		 if(KEY1==GPIO_Pin_RESET)
       {
			 keytime++;
		     if(Mode==0)//第一次进入模式切换按键,要长按2秒
			 {
				 if(keytime>=2100)//长按2s
				 {
					Up_Flag=0;
					keytime=0;  //切换模式
					Mode++;
					BrushFlag=1; //更新数码管
				 }	
			 }
			 else if((Mode>0)&&(Up_Flag==1))
			 { 
				if(keytime>=100)
				{
					keytime=0;  
					Mode++; //切换模式
					if(Mode>=5)Mode=0;
					BrushFlag=1; //更新数码管
				 }		
			 }			
		}
		else 
		{
			keytime=0;
			Up_Flag=1;
		}
////////////////////////////////////////////////////////////////////////////////
		if(KEY2==GPIO_Pin_RESET)//标定参数设置确认按键、打开串口
       {
			keytime2++;
			if(keytime2>=100)
			{
				currentTime=keytime2;
				keytime2=0;
				if((currentTime - lastPressTime < 200)&&(lastPressTime!=0))
				{ // 判断双击间隔  
					pressCount++;  
					if (pressCount == 2) 
					{  
						if(Mode==1)
						 {
							 X05=Mean_Value_Filter(Volt_Buffer,ADC_SAMPLE_SIZE);
							 save_calibration();ComputeK();Volt_Cal();BrushFlag=1;Mode=0;
						 }
						 else if(Mode==2)
						 {
							 X15=Mean_Value_Filter(Volt_Buffer,ADC_SAMPLE_SIZE);
							 save_calibration();ComputeK();Volt_Cal();BrushFlag=1;Mode=0;
						 }
						 else if(Mode==3)
						 {
							 IX05=Mean_Value_Filter(Curr_Buffer,ADC_SAMPLE_SIZE);
							 save_calibration();ComputeK();Volt_Cal();BrushFlag=1;Mode=0;
						 }
						 else if(Mode==4)
						 {
							 IX15=Mean_Value_Filter(Curr_Buffer,ADC_SAMPLE_SIZE);
							 save_calibration();ComputeK();Volt_Cal();BrushFlag=1;Mode=0;
						 }
						pressCount = 0; // 重置计数,避免误判  
					}  
				} 
				else
				{  
					lastPressTime = currentTime; // 更新上次按键时间
					pressCount = 1; // 重置为新的按压序列
				}
			}
		}
		else //
		{
			keytime2=0; 
		}
//////////////////////////////////////////////////////////////////////
		if(KEY3==GPIO_Pin_RESET)
		{
			 keytime3++;
			 if(keytime3>=100)
			 {
				 keytime3=0;  
				 PC13_TOG();
				 Usart_Flag^=1;//打开串口传输
			 }			 
		}
		else keytime3=0;			 
  }

(四) 打印数据到上位机

通过单片机的usart3将电压电流值打印到上位机,并通过上位机显示出电压电流变化的波形。

上位机是vofa+,很好的一个上位机,强烈推荐!!!!

if(Usart_Flag)
		{
			V_Usart=V_Buffer;
//			printf("Vol:%d Cur:%d\r\n",V_Buffer,I_Buffer);
			if(timecount >=50)//发送给vofa+
			{
//				// 发送数据
				float data[4];  
				data[0] = V_Buffer/100.0;
				data[1] = I_Buffer/100.0;
				data[2] = Volt_Buffer[cnt]/100.0;
				data[3] = Curr_Buffer[cnt]/100.0;
				usart_send_String((uint8_t *)data,(sizeof(float) * 4)); 
				// 发送帧尾
				uint8_t tail[4] = {0x00, 0x00, 0x80, 0x7f};
				usart_send_String(tail,4); 
			}

}

设计图

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

BOM

暂无BOM

附件

序号文件名称下载次数
1
voltammeter.rar
1
2
Gerber_电压电流表PCB图_2024-08-08.zip
1
克隆工程
添加到专辑
0
0
分享
侵权投诉

工程成员

评论

全部评论(1
按时间排序|按热度排序
粉丝0|获赞0
相关工程
暂无相关工程

底部导航