
开源协议
:GPL 3.0
描述
一、硬件设计
1.1 单片机主控
电流电压表采用地文星CW32F030C8T6开发板作为主控,主控芯片最高可达64MHz的主频、以及64KB FLASH和8KB RAM。在本项目中一共用到26个IO口资源,14个引脚用于数码管显示、3个引脚用于按键控制、4个引脚用于ADC转换。
1.2 供电电路
- 本电路使用LDO作为电源,选用的LDO为最高输入电压高达40V的SE8550K2作为电源。
- 电解电容在前(与电源相连),负责滤除低频噪声,提供稳定的直流电压;陶瓷电容在后(与负载相连),处理高频噪声,提高电路的高频性能。
- 电路中额外使用串联的10Ω电阻进行分压,可作为低阻值保险丝,还能降低上电冲击的峰值。
1.3 采样电路
1.3.1 电压采样
采用分压电路实现电压采集,设计可采集电压100V,当前配置采集的电压为0-30V。
- 分压电阻的选择:设计测量的最大电压为30V,ADC参考电压为1.5V,低侧电阻选为10K以降低功耗;计算分压比例为1.5V/30V=0.05,计算得到高侧电阻为10K/0.05=200K,选择最接近但大于结果的标准电阻为220K。
- 钳位二极管的应用:为保护MCU不受损坏,额外添加了一个1N4148二极管作为钳位二极管。通过二极管的正向导通特性,可以将电路中的电压限制在正向管压降(一般为0.7V)范围内,实现保护作用。
- 测量换档的实现:引入了一组额外的电压采样电路,这使得实现电压换挡功能成为可能。电压采样电路使用ADC_IN11通道来测量30V以内的电压。如果测得的电压在0~3V范围内,会切换到ADC_IN9通道进行测量。由于分压比的减小,这种换挡能够大幅提高测量精度
1.3.2 电流采样
采用低侧电流采样电路进行电流检测,采样电路的低侧与开发板表头接口共地。在选择采样电阻时,需考虑以下因素:
- 预期测量的最大电流为3A;
- 不建议检流电阻引入的压降超过0.5V;
- 要考虑检流电阻的功耗,选择合适封装,本次选择1W金属绕线电阻;
- 没有放大倍数,倍率为1;
- 可通过计算得出选择100mΩ的检流电阻,在3A电流下引入的电压为300mV,功耗为900mW。
综上所述,选择100mΩ的检流电阻是基于给定条件下的最佳选择,以确保测量准确性、功耗和压降在可接受范围内。
1.4校准电路
项目额外增加了一个TL431电路,用于提供一个2.5V的基准电压。TL431电路的核心是一个运放,用作比较器。在电路中,Vref(约为2.5V)作用在比较器的反相输入端。比较器的正相输入端接收一个电压输入给REF引脚。当这个电压大于Vref时,比较器输出高电平,使得三极管导通,连接TL431的阴极端和阳极端,当REF和阴极处于相同电位时,将REF引脚的电位拉低。当REF电位低于Vref时,比较器输出低电平,导致三极管关闭,REF电位回升。这种比较和控制过程循环执行。由于硬件响应速度非常快,REF电位几乎等于Vref。
1.5 显示电路
采用了两颗0.36寸的三位共阴数码管作为显示器件。相比显示屏,数码管具有更好的识别度,在复杂环境中易于辨认。数码管具有较好的机械性能,较不容易受外力损坏,根据不同环境需求可以调整限流电阻的大小来实现更高的数码管亮度。本项目中数码管的限流电阻(R8~R15)被配置为300Ω,展现出良好的识别度和柔和的亮度。
二、软件设计
2.1 main函数
工程main函数如图所示,主要用于初始化各个外设并实现电流电流电压表功能。以下是对该`main`函数的简要介绍:
1. board_init():该函数是用于初始化开发板硬件外设和系统时钟设置。
2. tim1_Init():初始化定时器1,并同时开启定时中断。
3. LED_Init():LED初始化函数。
4. Seg_Init():数码管初始化函数,用于初始化数码管的引脚配置等。
5. Key_Init():按键初始化函数,配置和初始化按键的引脚和相关参数。
6. ADC_init():ADC初始化函数,用于初始化模数转换器。
7. read_vol_cur_calibration():读取电压和电流的校准值,用于校准测量值和显示值的准确性。
8. ComputeK():计算校准系数K,用于在测量值与实际值之间建立准确的关系。
2.2 数码管显示
代码详情可见Seg_Display.c,以下是用定时器中断来实现数码管的动态刷新简要的描述:
- 首先,需要初始化定时器来生成一定频率的中断,用于实现动态显示。初始化位选和段选的引脚,设置为输出模式,并连接到相应的数码管管脚和控制芯片引脚。
- 将各个数码管需要显示的数字或字符存储在一个数组中,例如Seg_Table[]。编写一个循环,依次控制每个数码管的位选线为高电平,其他为低电平,同时设置段选引脚状态来显示相应的数字。在定时器中断中不断切换位选线的状态,实现数码管之间的快速切换,从而实现动态显示效果。
- 在定时器中断服务函数中,记录当前位选的位置,根据该位置设置对应的数码管的位选线为高电平,其他为低电平。同时,根据当前位选位置,从数组Seg_Table[]中读取当前需要显示的数字或字符,并设置段选引脚的状态,显示相应内容。在下一个定时器中断中切换到下一个位选位置,以此类推循环显示。
2.3 按键检测
该项目通过按键操作实现了数码管显示模式的切换和参数标定功能,共定义了5个工作模式,分别用于显示不同类型的电压和电流值,并进行标定。
按键操作功能:
K1键:用于切换显示模式。
K2键:用于设定对应模式下的参数值,并将值保存到FLASH。
K3键:用于返回到模式0。
各个模式的介绍:
模式0:显示正常的电压电流值,上一排数码管显示电压值,下一排显示电流值。
模式1:电压5V标定值设置,显示标定数字5.05.,调校被测位为5.00V后按下K2键,将当前值标定为5V电压值。
模式2:电压15V标定值设置,显示标定数字5.15.,调校被测位为15.0V后按下K2键,将当前值标定为15V电压值。
模式3:电流0.5A标定值设置,显示标定数字A.0.5,按下K2键后,将当前值标定为0.5A电流值。
模式4:电流1.5A标定值设置,显示标定数字A.1.5,按下K2键后,将当前值标定为1.5A电流值。
2.4 定时器中断
上面代码是一个定时器中断的处理函数BTIM1_IRQHandler(),用于处理定时器1的溢出中断。以下是该定时器中断处理函数的简要描述:
在每次定时器1的溢出中断发生时,首先检查是否溢出中断标志位被设置,确保该中断处理函数是由定时器1的溢出中断触发的。
执行以下主要操作:
获取ADC的值,通过Get_ADC_Value()函数获取 ADC 数值。
控制LED闪烁,每经过一定时间(ledcount大于或等于1000),对PC13引脚进行翻转操作,实现LED的闪烁效果。
更新运行时间计数器 timecount。
调用Dis_Refresh() 函数,用于数码管的扫描显示。
处理按键操作:
监测按钮K1(连接到 GPIOB 的引脚 12),实现按键的切换模式功能。
监测按钮K2(连接到 GPIOB 的引脚 13),根据当前模式进行不同的处理:
模式1:标定电压5V值。
模式2:标定电压15V值。
模式3:标定电流0.5A值。
模式4:标定电流1.5A值。
监测按钮K3(连接到 GPIOB 的引脚 13),用于返回模式0,清空标定数据并更新数码管显示。
通过这段定时器中断处理函数,实现了对按键操作的响应,LED的闪烁控制和数码管的显示刷新,以及不同模式下的电压和电流值标定功能。
2.5 ADC转换
上面代码是用来初始化ADC,以下是对该函数的简要介绍:
- ADC的时钟分频设置为128,参考电压选择为1.5V,采样时间设置为10个ADC时钟周期。
- 通道ADC_SqrCh11,作为ADC序列的第一个通道(ADC_Sqr0Chmux),连接至PB1引脚。
- 通道ADC_SqrCh9,作为ADC序列的第二个通道(ADC_Sqr1Chmux),连接至PB0引脚。
- 通道ADC_SqrCh8,作为ADC序列的第三个通道(ADC_Sqr2Chmux),连接至PB10引脚。
- 通道ADC_SqrCh12,作为ADC序列的第四个通道(ADC_Sqr3Chmux),连接至PB11引脚。
以上配置表示这四个ADC通道(PB01、PB00、PB10、PB11)将按照特定的顺序被加入到ADC的转换序列中,并在连续转换模式下进行采样。这样的配置允许系统可以同时对这四个通道的模拟信号进行连续采集和转换,以满足系统对多个模拟信号的需求。
三、实物演示
3.1 PCB
3.2面板与外壳
3.3整体演示
设计图

BOM


评论