
CW32-电压电流表
简介
本项目使用立创·地文星CW32F030C8T6开发板(核心板)作为主控,可以测量电压0-30V;电流0-3A。
简介:本项目使用立创·地文星CW32F030C8T6开发板(核心板)作为主控,可以测量电压0-30V;电流0-3A。开源协议
:GPL 3.0
描述
一、项目简介
提示:介绍团队成员,学校信息以及获奖情况
本项目使用立创·地文星CW32F030C8T6开发板(核心板)作为主控,可以测量电压0-30V;电流0-3A。全程在老师的带领下完成,只是我想把作品应用到实际,所以改为贴片原件,从而减小体积,另外加了一块0.96寸的OLED屏幕,练习相关驱动。
二、设计摘要
三、硬件电路组成
1、供电电路
本项目使用LDO作为电源,考虑到实际的电压表头产品多在24V或36V供电的工业场景中应用,本项目选择了最高输入电压高达40V的SE8550K2作为电源。本项目没有使用DCDC降压电路来应对大压差的主要原因为避免设计过程中引入DCDC的纹波干扰,次要原因为降低项目成本。
2、MCU的选型分析
本项目使用立创·地文星CW32F030C8T6开发板(核心板)作为主控。从培养工程师的角度来讲,正确的主控器件选型是十分重要的,这关系到项目的整体优势。
3、电压采样电路
本项目采用分压电路实现高电压采集,设计可采集电压100V,当前配置采集电压为0-30V。
项目设计分压电阻为220K+10K,因此分压比例为22:1(ADC_IN11)
5、数码管驱动
本项目采用了数码管作为显示单元。
在本项目中使用了两颗0.28寸的三位共阴数码管作为显示器件,相较于显示屏,数码管在复杂环境中拥有更好的识别度,可以根据实际使用环境的需求,改为更小的限流电阻实现更高的数码管亮度;在另一方面,数码管拥有较好的机械性能,不会像显示屏一样容易被外力损坏。在工业等有稳定可靠性应用中,多被采用。从开发版学习的角度来看,更易有目的的学习电子测量原理相关开发。
在本项目中,经过实际测试,数码管的限流电阻(R1~R6)被配置为300Ω,对应的亮度无论是红色还是蓝色数码管,均具有较好的识别度,且亮度柔和不刺眼。
严格来讲,限流电阻应该加在段上,加在位上,会影响显示效果。我们实际设计加在位上,省几个电阻,但对显示影响并不突出。所以还是加在位上,图个方便。
6、指示灯
本项目额外设计了一个电源指示灯和IO工作指示灯。
LD_PWR为电源工作指示灯
IO工作指示灯
由于芯片I/O往往灌电流的能力大于拉电流的能力,所以,LED1设计为I/O低电平有效(亮)。出于减少LED对电流的消耗的考量,放弃部分LED亮度,减少器件参数类型,将LED的限流电阻选择为10K。
以本项目所使用的插件F5白发白(白光)LED为例,下表是其电性参数,由表格参数可知,限流电阻的设置要保证电流在20mA以内。(欧姆定律算一下即可)
7、按键电路设计
按键控制电路有多种设计方式,得益于CW32的I/O口内部可以配置上下拉电阻,在芯片外围的按键控制电路则无需配置。按键一端接入MCU的I/O上,另一端接地。按键按下,I/O被拉低。
8、用于电压测量校准的TL431电路设计
本项目额外增加了一个TL431电路用来提供一个2.5V的基准电压,可用于给芯片一个用于校准AD的外部电压基准,从产品设计角度来讲,由于CW32本身的ADC性能优势,可以不需要此电路。在开发板上设计此电路,用于学习相关应用原理。
由于我本人实际使用的是友台半导体的TL431封装TO-92,其产品手册为英文,所以找来TI公司的TL431产品的中文手册,方便大家学习理解。
电流采样电阻的开尔文接法
利用开尔文接法消除线路电阻和接触电阻对测量结果的影响。在高精度采样场合,也有专门的四线制采样电阻供使用,本文不做探讨。
丝印与工艺
一般PCB生产的丝印是喷上去的,所以当字体字号较小,线宽较粗时,可能会发生模糊,导致标注不清。建议合理选择丝印字体大小和线宽,不同丝印字体之间的效果也有区别。选择合适的字体,在同样线宽字号下,会有更好的打印表现。
DRC设计的注意事项
电源走线应尽可能宽,约在20~60mil之间。
普通信号线:10mil左右
ADC信号走线:10mil或8mil。太宽则在线路过长时,有可能影响信号的完整性。
由于不涉及高速电路设计,3W原则在此不做强调。
规范器件的引脚间距:如规范使用英制单位、利用好EDA软件的网格和栅格,合理排布器件位置,合理走线。
9.软件设计
标定的概念
标定是通过测量标准器的偏差来补偿仪器系统误差,从而改善仪器或系统准确度、精度的操作。为了提高电压电流表在测量时的测量精度和准确度,需要对电压电流进行标定校准。
常见的标定原理如下:
假设一个采样系统,AD部分可以得到数字量,对应的物理量为电压(或电流);
若在“零点”标定一个AD值点Xmin,在“最大处”标定一个AD值点Xmax,根据“两点成一条直线”的原理,可以得到一条由零点和最大点连起来的一条直线,这条直线的斜率k很容易求得,然后套如直线方程求解每一个点X(AD采样值),可以得到该AD值对应的物理量(电压值):
上图中的斜率k:
k =(Ymax-Ymin)/(Xmax-Xmin)
(因为第一点为“零点”,故上面的Ymin = 0)
所以,上图中任一点的AD值对应的物理量:
y = k×(Xad- Xmin)+0
上面的算法只是在“零点”和“最大点”之间做了标定,如果使用中间的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。
主程序代码如下:
int main()
{
RCC_Configuration(); //系统时钟64M
KEYGPIO_Init();
GPIO_WritePin(CW_GPIOC,GPIO_PIN_13,GPIO_Pin_RESET);
Seg_Init();
Btim1_Init();
ADC_init();
read_vol_cur_calibration();
ComputeK();
while(1)
{
if(BrushFlag==1)
{
DisplayBuff();
BrushFlag=0;
}
if(timecount>= 300) //300ms改变一次数码管显示值//
{
timecount=0;
Volt_Cal();
BrushFlag=1;
}
}
}
标定代码计算斜率函数如下:
void ComputeK(void)
{
K=(Y15-Y05);
K=K/(X15-X05);
KI=(IY15-IY05);
KI=KI/(IX15-IX05);
}
校准存储函数如下:
void save_calibration(void)
{
uint16_t da[5];
da[0]=0xaa;
da[1]=X05;
da[2]=X15;
da[3]=IX05;
da[4]=IX15;
flash_erase();
flash_write(0,da,5);
}
定时器BTIM1中处理按键检测及响应,代码如下:
void BTIM1_IRQHandler(void)
{
static uint32_t keytime=0,keytime2=0,keytime3=0,ledcount=0;
/* USER CODE BEGIN */
if (BTIM_GetITStatus(CW_BTIM1, BTIM_IT_OV))
{
BTIM_ClearITPendingBit(CW_BTIM1, BTIM_IT_OV);
Get_ADC_Value();
ledcount++; //LED闪
if(ledcount>=1000)
{PC13_TOG();ledcount=0;}
timecount++;
Dis_Refresh();//数码管扫描显示
if(GPIO_ReadPin(CW_GPIOB,GPIO_PIN_12)==GPIO_Pin_RESET)
{
keytime++;
if(keytime>=100 )
{
keytime=0; //切换模式
Mode++;
if(Mode>=5)Mode=0;
BrushFlag=1; //更新数码管
}
}
else keytime=0;
if(GPIO_ReadPin(CW_GPIOB,GPIO_PIN_13)==GPIO_Pin_RESET&&Mode!=0)
{
keytime2++;
if(keytime2>=100 )
{
keytime2=0; //切换模式
if(Mode==1)
{
X05=Mean_Value_Filter(Volt_Buffer,ADC_SAMPLE_SIZE);
save_calibration();ComputeK();Volt_Cal();BrushFlag=1;Mode=0;
}
if(Mode==2)
{
X15=Mean_Value_Filter(Volt_Buffer,ADC_SAMPLE_SIZE);
save_calibration();ComputeK();Volt_Cal();BrushFlag=1;Mode=0;
}
if(Mode==3)
{
IX05=Mean_Value_Filter(Curr_Buffer,ADC_SAMPLE_SIZE);
save_calibration();ComputeK();Volt_Cal();BrushFlag=1;Mode=0;
}
if(Mode==4)
{
IX15=Mean_Value_Filter(Curr_Buffer,ADC_SAMPLE_SIZE);
save_calibration();ComputeK();Volt_Cal();BrushFlag=1;Mode=0;
}
}
}
else keytime2=0;
if(GPIO_ReadPin(CW_GPIOB,GPIO_PIN_13)==GPIO_Pin_RESET)
{
keytime3++;
if(keytime3>=100 )
{
keytime3=0; //切换模式
Mode=0;
BrushFlag=1; //更新数码管
}
}
else keytime3=0;
}
/* USER CODE END */
}
本实验的标定操作方法
该例程使用按键操作来标定。具体操作方法如下:
定义5个工作模式,K1键用于切换显示模式。K2键设置对应模式下的参数值,并保存到FLASH。K3键返回到模式0。
模式0: 显示正常的电压电流值(上一排数码管显示电压值*.V或.*V自动切换,下一排显示电流值,_.**A)
模式1: 电压5V标定值设置。上一排数码管显示5.05. 。下一排显示当前电压值_.V或._V。在该模式下,应将万用表测量被测位,调到5.00V。 按下K2键后,将当前值标定为5V电压值。
模式2: 电压15V标定值设置。上一排数码管显示5.15. 。下一排显示当前电压值_.V或._V。在该模式下,应将万用表测量被测位,调到15.0V。 按下K2键后,将当前值标定为15V电压值。
模式3: 电流0.5A标定值设置。上一排数码管显示A.0.5 。下一排显示当前电流值_.**A。按下K2键后,将当前值标定为0.5A电流值。
模式4: 电流1.5A标定值设置。上一排数码管显示A.1.5 。下一排显示当前电流值*.**A。按下K2键后,将当前值标定为1.5A电流值。
OLED驱动移植了stm32的官方驱动。
四、实物展示
提示:作品的实物图片,图片可以加上说明。
五、演示视频
提示:演示视频上传附件即可,附件最大只能长传50M的文件,大于50M的文件可放置在其他网盘或视频网站上,只需把地址链接放入这里即可
通过百度网盘分享的文件:491292eb35e36b6b1565d40b016a3314.mp4
链接:https://pan.baidu.com/s/1g8N8Ge65_mZaopK0wWEnvw?pwd=u4kf
提取码:u4kf
【立创2024训练营—电压电流表-哔哩哔哩】 https://b23.tv/zAOqoew
六、附件内容
提示:参加活动的作品必须把工程相关的程序附件上传至开源平台或个人的代码存储云端,附件最大支持50M上传(请勿在立创工作区上传,有限制)附件按以下要求进行命名:
附件一:
附件二:XXXX
通过百度网盘分享的文件:CW32电压电流表
链接:https://pan.baidu.com/s/1AYnp2DNXCV2-ZYN46ntgkA?pwd=l0dq
提取码:l0dq
设计图

BOM


评论