产品实物:
一、产品概述
数字电压电流表,又称为数显电流电压表,是以数字形式显示,能够同时检测电流和电压两种电参量的仪表。随着数字技术和微电脑技术的不断发展,这类仪表以芯片为核心,广泛应用于工业自动化和工控领域。
数字电压电流表通常与各种传感器、变送器配合使用,用于测量电量、压力、物位、液位、流量、温度等参数,并直接以数字形式显示测量结果。例如,它可以用于测量各种电路元件的电压,如电源电压、电容电压、电感电压等。此外,在电子设备的维修与调试中,数字电压电流表也发挥着重要作用,通过测量电路中的电压,技术人员可以判断电子元件、电路板的工作状态,快速定位故障点,提高维修效率。
与指针式仪表相比,数字电压电流表具有很高的输入阻抗,使得其自身损耗很小,无需对其损耗误差进行修正。然而,数字仪表也存在一些不足之处,如在某些特定应用场景下可能不如指针式仪表直观。
总的来说,数字电压电流表以其高准确度、直观性、自动化和多功能性等特点,在电力、电子、通信、自动化控制等领域得到了广泛的应用,并为相关行业的技术人员提供了强大的工具,帮助他们更高效地进行设备的测量、调试和维修工作。
二、主控MCU选择
本方案采用CW32F003E4P7芯片片作为核心控制单元,负责整个系统的数据处理和控制。
CW32003E4P7的产品特性如下:
• 内核:ARM® Cortex®-M0+
- 最高主频 48MHz
• 工作温度:-40℃至 105℃;工作电压:1.65V 至 5.5V
• 存储容量
- 最大 20K 字节 FLASH,数据保持 25 年 @85℃
- 最大 3K 字节 RAM,支持奇偶校验
-22 字节 OTP 存储器
• CRC 硬件计算单元
l 复位和电源管理
- 低功耗模式(Sleep,DeepSleep)
- 上电和掉电复位(POR/BOR)
- 可编程低电压检测器(LVD)
• 时钟管理
- 内置 48MHz RC 振荡器
- 内置 32kHz RC 振荡器
- 内置 10kHz RC 振荡器
- 内置 150kHz RC 振荡器
- 外部引脚输入时钟
- 允许独立关断各外设时钟
• 支持最多 21 路 I/O 接口
- 所有 I/O 口支持中断功能
- 所有 I/O 支持中断输入滤波功能
• 模数转换器
- 12 位精度,±1 LSB
- 最高 1M SPS 转换速度
- 内置电压参考
- 模拟看门狗功能
- 内置温度传感器
• 双路电压比较器
• 定时器
- 16 位高级控制定时器,支持 6 路捕获 / 比较通道和 3 对互补 PWM 输出,死区时间和灵活的同步功能
- 一组 16 位通用定时器
- 三组 16 位基本定时器
- 窗口看门狗定时器
- 独立看门狗定时器
• 通信接口
- 两路低功耗 UART,支持小数波特率
- 一路 SPI 接口 12Mbit/s
- 一路 I2C 接口 1Mbit/s
- IR 调制器
• 串行调试接口 (SWD)
三、方案组成框图设计
四、参数功能列表
(1) 电压测量范围:0-33V。(2) 电流测量范围:0-3A。(3) 显示分辨率:电压0.01V,电流0.01A。 (4) 测量精度:电压±0.02V,电流±0.02A。(5) 工作温度:-20℃~100℃。(6) 显示方式:双排3位数码管显示,实时显示当前电压和电流。(响应时间≤0.2秒)(7) 显示分辨率:3位数字显示。根据输入量程,自动换档,以尽量兼顾显示分辨率及测量精度。(8) 有仪表的标定和校准功能。(利用按键或蓝牙)五
方案主要硬件设计
1.电压检测:
通过适当的分压电路,将待测电压降低到CW32芯片可接受的范围内,然后接入CW32的ADC(模数转换器)进行数字化处理。数字电压电流表的采样电路原理图如下图所示,
分压电阻为220K+10K,因此分压比例为22:1。
如果使用1.5V作为参考电压,根据R8和R7的阻值配比可以得到最高采样电压为:
1.5 / 10 * (220 + 10)= 34.5V因此可以满足33V的输入范围要求。如果在实际使用中,需要测量的电压或高于模块33V的设计电压,可以选择更换分压电阻或通过修改基准电压来实现更大量程的电压测量范围。考虑到被测电源可能存在波动,在电路设计时,在低侧分压电阻上并联了0.1uF的滤波电容提高测量稳定性。另外,在产品设计中,考虑精度问题,电阻选择千分之一精度。
2. 电流检测:
采用低侧电流采样电路进行电流检测,采样电路的低侧与表头供地。
本项目设计的采样电流为3A,选择的采样电阻为100mΩ。
采样选型主要需要参考以下几个方面:
设计测量电流的最大值,本项目中为3A;
(1) 检流电阻带来的压差,一般不建议超过0.5V;
(2) 检流电阻的功耗,应当根据该参数选择合适的封装,本项目考虑到PCB尺寸,选择了2512封装;
(3) 检流电阻上电压的放大倍数:本项目中没有使用放大电路,因此倍率为1。
随后便可以通过以上参数计算出检流的阻值选择:
(1) 由于本项目没有使用放大电路,因此需要选择更大的采样电阻获得更高的被测电压以便于进行测量;
(2) 考虑到更大的电阻会带来更大的压差、更高的功耗,因此也不能无限制的选择更大的电阻;
(3) 本项目选用了2512封装的电阻,对应的温升功率为1W。
综合以上数据,本项目选择了100mΩ的检流电阻,根据公式可以计算出3A*100mΩ=300mV,900mW。表头在设计时考虑到了贴片采样电阻不能够应对不同的使用环境,尤其是电流较大的场景,因此预留了10mm间距的康铜丝直插焊盘,可以更具实际使用场景,使用康铜丝替换贴片采样电阻。下图中红色方框框选出的即是康铜丝焊接焊盘。
3. 蓝牙通讯电路:
使用KT6368A作为蓝牙主控芯片。
只需要通过蓝牙进行数据透传,也就是通过蓝牙把数据发送出去,便于用户通过手机或电脑对被测电压电流进行无线监控,不需要其他复杂功能,因此本项目中选择了外围电路极其简单的KT6368A,只需要使用单芯片+晶振便可实现BLE通信,同时该芯片为双模芯片,还可以支持SPP通信。
为了降低项目成本,模块采用了PCB板载天线替代外接天线或陶瓷天线,在室内环境依旧可以保持良好的通信效果,若实际使用场景对通信距离有要求,可根据实际情况改为不同的天线类型。
4. 另外还有数码管显示电路、电源设计电路、按键电路、最小系统电路等。这里不再一一描述。
六、软件重点编辑思想
1. 数码管动态扫描:
数码管显示的动态扫描原理如下:显示器中所有数码管在系统控制下有序逐位点亮,每位数码管的点亮时间为1到2微秒。利用人体视觉暂留现象及发光二极管余辉效应,各位数码管并非同时点亮,但扫描速度足够快,从而一组稳定不闪烁显示数据。
在程序中,使用定时器定时扫描每位数码管。
定时时中断定时执行如下代码,以实现数码管的动态扫描。注意定时器定时时间要足够短,比如1MS.
Close_Com(); //先关闭公共端,防止重影 Seg_Dis(num,Seg_Reg[num]); //开断码,然后开位码。 num++; //切换数码管位数 if(num > 6) { num = 0; }
2. 数据采集处理 :
CW32F003 内部集成一个 12 位精度、最高 1M SPS 转换速度的逐次逼近型模数转换器 (SAR ADC),最多可将 16 路模拟信号转换为数字信号。现实世界中的绝大多数信号都是模拟量,如光、电、声、图像信号等,都要由 ADC 转换成数字信号,才能由 MCU 进行数字化处理。
在本系统中,需要采信2路AD,电压及电流。因此,选用ADC的序列采样连续转换模式。序列连续转换模式可对最多四个序列的通道进行轮流转换。更多转换原理,可参考芯片用户手册。
ADC初始化代码如下 :
void ADC_init(void) { ADC_InitTypeDef ADC_InitStructure; //ADC配置结构体 ADC_SerialChTypeDef ADC_SerialChStructure; //ADC序列通道结构体 GPIO_InitTypeDef GPIO_Init_Struct; __RCC_GPIOB_CLK_ENABLE(); //打开ADC对应引脚时钟 __RCC_ADC_CLK_ENABLE(); // 打开ADC时钟 GPIO_Init_Struct.IT = GPIO_IT_NONE; GPIO_Init_Struct.Mode = GPIO_MODE_ANALOG;//将GPIO的模式配置成模拟功能 GPIO_Init_Struct.Pins = GPIO_PIN_1; // PB01是电压采集引脚 GPIO_Init(CW_GPIOB, &GPIO_Init_Struct); PB01_ANALOG_ENABLE(); //使能模拟引脚 PB05_ANALOG_ENABLE(); ADC_StructInit(&ADC_InitStructure); // ADC默认值初始化 ADC_InitStructure.ADC_ClkDiv = ADC_Clk_Div128; //ADC工作时钟配置 PCLK/4 = 6/4 = 1.5Mhz /*信号电压较低时,可以降低参考电压来提高分辨率。改变参考电压后,同样二进制表示的电压值就会不一样, 最大的二进制(全1)表示的就是你的参考电压,在计算实际电压时,就需要将参考电压考虑进去。*/ ADC_InitStructure.ADC_VrefSel = ADC_Vref_BGR1p5; //参考电压设置为1.5V ADC_InitStructure.ADC_SampleTime = ADC_SampTime10Clk; //由于电压信号为慢速信号,ADC采样时间为十个ADC采样周期以确保准确 ADC_SerialChStructure.ADC_Sqr0Chmux = ADC_SqrCh9; //配置ADC序列,PB01是ADC的第9通道 ADC_SerialChStructure.ADC_Sqr1Chmux = ADC_SqrCh11; ADC_SerialChStructure.ADC_SqrEns = ADC_SqrEns01; ADC_SerialChStructure.ADC_InitStruct = ADC_InitStructure; //ADC初始化 ADC_SerialChContinuousModeCfg(&ADC_SerialChStructure); //ADC序列连续转换模式配置 ADC_ClearITPendingAll(); //清除ADC所有中断状态 ADC_Enable(); // ADC使能 ADC_SoftwareStartConvCmd(ENABLE); //ADC转换软件启动命令 }
3. 数据滤波处理:由于采集到的原始数据有一定的波动,因此在显示更新速度较快时,数字有跳动现象。
在数据处理前,可以增加常见的均值滤波算法。
均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。线性滤波的基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点(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; //ADC采样数据和 uint16_t max = 0; uint16_t min = 0xffff; //min初值取最大是为了将第一个数据记录 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; }
4. 数据标定:
标定是通过测量标准器的偏差来补偿仪器系统误差,从而改善仪器或系统准确度、精度的操作。为了提高电压电流表在测量时的测量精度和准确度,需要对电压电流进行标定校准。
常见的标定原理如下:
假设一个采样系统,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。
标定代码如下:
void Volt_Cal(void) { float t,KT1; V_Buffer = Mean_Value_Filter(Volt_Buffer,ADC_SAMPLE_SIZE);//使用均值滤波 I_Buffer = Mean_Value_Filter(Curr_Buffer,ADC_SAMPLE_SIZE); //使用均值滤波 if(V_Buffer >=X05) // { t=V_Buffer-X05; V_Buffer=(K*t+Y05)*1000;} else { KT1=5000; KT1=KT1/X05; V_Buffer=KT1*V_Buffer; } // 四舍五入 if(V_Buffer % 10 >= 5) { V_Buffer = V_Buffer / 10 + 1; } else { V_Buffer = V_Buffer / 10; } if(I_Buffer >=IX05) { t=I_Buffer-IX05; I_Buffer=(KI*t+IY05)*10; } else { KT1=500; KT1=KT1/IX05; I_Buffer=KT1*I_Buffer; } if(I_Buffer % 10 >= 5) { I_Buffer = I_Buffer / 10 + 1; } else { I_Buffer = I_Buffer / 10; } // I_Buffer=I_Buffer * ADC_REF_VALUE > > 12; /** mv =I_Buffer * ADC_REF_VALUE > > 12, R = 100mr, 10ma = mv/R/10=mv/0.1/10 = mv */ }
5. 标定操作实现:
具体操作方法如下:
定义5个工作模式,点按按键切换工作模式,长按3S设置对应模式下的参数值,并保存到FLASH:
模式0:显示正常的电压电流值(上一排数码管显示电压值*.**V或**.*V自动切换,下一排显示电流值,*.**A)
模式1:电压5V标定值设置。上一排数码管显示S.05. 。下一排显示当前电压值*.**V或**.*V。当长按3S 按键时,将当前值标定为5V电压值。
模式2:电压15V标定值设置。上一排数码管显示S.15. 。下一排显示当前电压值*.**V或**.*V。当长按3S 按键时,将当前值标定为15V电压值。
模式3:电流0.5A标定值设置。上一排数码管显示A.0.5。下一排显示当前电流值*.**A。当长按3S 按键时,将当前值标定为0.5A电流值。
模式4:电流1.5A标定值设置。上一排数码管显示A.1.5。下一排显示当前电流值*.**A。当长按3S 按键时,将当前值标定为1.5A电流值
七、优化与调试
1. 精度优化:可选择合适的电阻、电容等元件,以及优化ADC的采样率和分辨率,来提高电压和电流的测量精度。
2. 稳定性优化:可对电源管理电路和防反接电路进行优化设计,确保系统在各种工作环境下都能稳定运行。
3. 软件调试:通过调试工具对软件进行调试和优化,确保数据采集、处理和显示等功能的正确性和稳定性。
4. 数据分析:在特殊应用场合,可根据实际信号的干扰情况进行算法的改过或选择。
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !