# 电表开发 **Repository Path**: qqclient/electric-meter-development ## Basic Information - **Project Name**: 电表开发 - **Description**: 基于星火1号和电量计量芯片的三相多功能电表开发 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 7 - **Created**: 2024-09-23 - **Last Updated**: 2024-09-23 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 电表开发 #### 介绍 **基于星火1号和电量计量芯片的三相多功能电表开发** **一、三相多功能电表、电能质量在线监测仪和电能质量分析仪前景** 1.1随着智能电网建设及电力数据采集与监控的需求增加,三相多功能电表、电能质量在线监测仪和电能质量分析仪需求也日益增长。他们可以实时采集电压、电流、功率、频率等数据,为智能电网的运行监控提供基础数据支持。支持远程抄表,通过通信接口实现远程抄表,减少人工抄表的工作量,提高抄表的准确性和效率,实现能源管理与节能减排和能耗监测:三相多功能电表可以监测各相的能耗情况,帮助企业或居民区进行精细化能源管理,通过分析负荷曲线,合理安排用电计划,实现节能减排。另一方面,随着国家新能源及分布式发电与储能的大力发展,双向计量需求增加,三相多功能电表、电能质量在线监测仪和电能质量分析仪均可设计支持双向计量功能,适用于分布式发电(如光伏发电)和储能系统的接入,实现上网电量和自用电量的准确计量。辅助决策:通过数据分析,为分布式能源的调度和优化提供决策支持。 ![输入图片说明](https://foruda.gitee.com/images/1726373493464069517/f53dd7f8_5476365.jpeg "图1.jpg") 1.2随着科技的快速发展,配电网电能质量受到了前所未有的挑战,电能质量越来越被人们所关注,电能质量监测与评估需求突增,电能质量分析仪可以实时监测电网中的电压、电流、频率、谐波、闪变等参数,评估电能质量。故障诊断:通过分析仪提供的数据,可以快速定位电网中的故障点,提高故障处理效率。 1.3电力设备健康管理,设备状态评估:电能质量分析仪可以帮助评估电力设备的运行状态,及时发现设备隐患。预防性维护:通过长期监测,可以实现对电力设备的预防性维护,减少故障停机时间。 1.4工业自动化与智能制造,生产线监控:在工业自动化生产线中,电能质量分析仪可以监控设备的用电情况,确保生产线的稳定运行。智能制造:通过大数据分析,电能质量分析仪可以为智能制造提供数据支持,优化生产过程。 1.5新能源与电动汽车充电设施,充电站监控:在电动汽车充电站,电能质量分析仪可以监测充电桩的运行状态,确保充电安全。能源管理:通过分析仪的数据,可以实现对新能源系统的优化管理,提高能源利用效率。 ![输入图片说明](https://foruda.gitee.com/images/1726373542118176064/52b43c1a_5476365.jpeg "图2.jpg") **二、三相多功能电表、电能质量在线监测仪和电能质量分析仪参数** 三相多功能电表是一种用于测量和记录三相电力系统中多种电气参数的设备。这类电表通常集成了多种功能,可以提供全面的电力参数监测和分析。以下是三相多功能电表常见的参数及其测量内容: 1.电能参数 1.有功功率 (P):表示实际消耗的能量,单位为千瓦(kW)。 2.无功功率 (Q):表示电路中储存和释放的能量,单位为千乏(kVar)。 3.视在功率 (S):表示电路中总的能量流量,单位为千伏安(kVA)。 4.功率因数 (PF):是有功功率与视在功率的比值,理想值为1。 5.电能(电量):记录一定时间内消耗的总能量,分为有功电能(kWh)和无功电能(kVarh)。 2.电压参数 1.相电压 (Uph):每相之间的电压,单位为伏特(V)。 2.线电压 (Uln):任意两相之间的电压,单位为伏特(V)。 3.电压不平衡度:反映三相电压的不平衡程度。 4.电压波动:记录电压的变化情况。 5.电压谐波:测量电压中的谐波成分。 3.电流参数 1.相电流 (Iph):每相的电流,单位为安培(A)。 2.线电流 (Iln):任意两相之间的电流,单位为安培(A)。 3.电流不平衡度:反映三相电流的不平衡程度。 4.电流谐波:测量电流中的谐波成分。 5.电流波形:显示电流的波形图。 4.频率参数 1.供电频率 (f):电网的频率,单位为赫兹(Hz)。 2.频率偏差:实际频率与标称频率之间的差异。 5.谐波参数 1.总谐波失真 (THD):表示谐波含量相对于基波的百分比。 2.各次谐波含量:分别测量各次谐波(如2次、3次等)的含量。 3.谐波分析:提供详细的谐波分析报告。 6.电能质量参数 1.电压暂降/暂升:记录电压的瞬时下降或上升事件。 2.电压闪变:测量电压波动对灯光闪烁的影响程度 3.电能质量指数:综合评价电能质量的各项指标。 7.数据存储与通信 1.数据存储:记录和存储历史数据,便于后续分析。 2.通信接口:支持RS485、Modbus、以太网等多种通信协议,方便数据传输。 3.远程监控:通过网络实现远程数据读取和监控。 8.其他功能 1.事件记录:记录电力系统中的重要事件,如断电、复电等。 2.报警功能:设置阈值,当参数超出设定范围时发出报警。 3.图形显示:通过液晶屏或触摸屏显示测量数据和图表。 4.编程设置:允许用户对电表进行编程设置,如校准、参数调整等。总结三相多功能电表能够提供全面的电力参数测量,包括电能参数、电压参数、电流参数、频率参数、谐波参数和电能质量参数等。这些参数的测量和记录有助于电力系统的监控和管理,提高电能质量和运行效率。通过数据存储和通信功能,电表还可以实现远程监控和数据分析,为电力系统的智能化提供了技术支持。 **三、基于星火一号的三相多功能电表设计** 火星一号是RT-THREAD官方推出的一款开发板,采用STM32F407作为主控,板载CAN、RS485、WIFI、SD卡、按键、蜂鸣器等接口资源、温湿度传感器、加速度传感器、光亮度传感器等传感器和LCD屏幕。适合开发一款基于STM32F407的三相多功能电表工程项目。以下是基于STM32F407的三相多功能电表设计的关键组成部分: **1. 硬件设计** 主控单元,微控制器:基于STM32F407的星火1号开发板,按键用于人机交互,设置参数;LCD用于显示电参数及波形;SD卡用于存储电量信息,事件等;蜂鸣器用于报警及操作提示;RS485用于与上位机进行Modbus通讯;PMOD1接口配置为SPI用于电量计量芯片通讯;另外STM32F407属Cortex-M4内核,支持浮点和DSP,方便进行傅立叶变换分析配电网中的谐波分量。 ![输入图片说明](https://foruda.gitee.com/images/1726373607519427899/e2c7d31c_5476365.jpeg "图3.jpg") 1.2信号采集模块,电压采集:使用精密电阻分压器或电压互感器(PT)采集三相电压信号。电流采集:使用电流互感器(CT)或霍尔电流传感器采集三相电流信号。滤波与调理电路:设计合适的滤波和调理电路,确保采集信号的质量。为保证采集精度,采用电量计量芯片RN8302B,24位ADC,6.4kHZ采样率,支持固定采样率和同步采样两种工作方式。 ![输入图片说明](https://foruda.gitee.com/images/1726373647774619615/465961fc_5476365.jpeg "图4.jpg") ![输入图片说明](https://foruda.gitee.com/images/1726373678826179990/651ac30a_5476365.jpeg "图5.jpg") 1.3供电电源模块,用于整机供电,为开发板、采集模块提供电能。采用反激式开关电源设计,提高工作效率。 ![输入图片说明](https://foruda.gitee.com/images/1726373719346998329/b07e849e_5476365.jpeg "图6.jpg") ![输入图片说明](https://foruda.gitee.com/images/1726373745218159965/95dac7a0_5476365.jpeg "图7.jpg") **2.固件开发** 初始化配置,GPIO配置:配置GPIO引脚,用于按键、LED外设控制。ADC配置:配置ADC(模拟数字转换器),用于采集电压和电流信号。定时器配置:配置定时器,用于Modbus通讯。串口配置:配置USART,用于串行通信。SPI配置:配置SPI,用于与外部设备电量计量芯片通信。FSMC配置,用于LCD驱动配置。 电量计量芯片是专门设计用于测量和记录电力系统中电能消耗的集成电路。集成了一系列功能,可以高精度地测量电压、电流、功率、电能等参数,并支持多种通信接口,以便于数据传输和远程监控。本设计采用RN8302B,其通讯时序如下图所示: ![输入图片说明](https://foruda.gitee.com/images/1726373790762845928/3e8243ca_5476365.jpeg "图8.jpg") 在设计一个三相多功能电表时,使用SD卡存储事件记录和数据是非常常见的做法。SD卡不仅提供了大容量的存储空间,还支持即插即用的特点,方便用户读取和备份数据。事件记录内容包括以下几个方面: 事件类型:抄表事件:记录电表读数。报警事件:记录电压过高/过低、电流过大等异常情况。操作事件:记录用户操作,如设置参数、重置等。通信事件:记录通信失败、重连等情况。 事件格式:时间戳:记录事件发生的时间。事件类型:标识事件的种类。详细信息:描述事件的具体内容。 数据存储 文件结构:配置文件:存储电表的基本配置信息。日志文件:按日期或事件类型存储事件记录。数据文件:存储历史电能数据。 文件命名规则:使用有意义的文件名,如log_YYYYMMDD.txt或data_YYYYMMDD.csv。 数据格式:CSV格式:便于解析和导入到Excel或其他工具。JSON格式:结构化数据,便于处理和解析。 快速傅里叶变换(Fast Fourier Transform, FFT)是一种高效的算法,用于对信号进行频谱分析。在电力系统中,FFT常用于检测和分析电力谐波,特别是在三相多功能电表中,用于实时监测电网中的电能质量。谐波检测的重要性在电力系统中,非线性负载会产生谐波电流,这些谐波电流会叠加在基波上,导致电压和电流波形畸变。谐波的存在会影响电力系统的稳定性和可靠性,因此检测和分析谐波对于维护电能质量至关重要。 **由于RN8302的采样ADC采用delta-sigma架构,delta-sigma ADC的梳状滤波器对于谐波有固定的衰减,RN8302对此没有做补偿。用户在读取波形采样数据做了FFT分析之后,只需要对每次谐波幅值乘以固定的补偿系数即能得到准确的谐波含量。** ![输入图片说明](https://foruda.gitee.com/images/1726373848155595421/0404a2ba_5476365.jpeg "图9.jpg") **三、关键代码** **3.1、RN8302B配置** ``` //校准电压200V、电流1A,ec3200, void fnRN8302_Init(void) { u8 buf[3]={0}; RN8302_interface_set(); buf[0] = 0xe5; // 写使能位 RN8302_reg_write(0x0180,buf,1); buf[0] = 0xA2; // 切换到EMM模式 RN8302_reg_write(WMSW,buf,1); buf[0] = 0xfa; // 写使能位 RN8302_reg_write(0x0182,buf,1); delay_ms(20); buf[0] = 0xe5; // 写使能位 RN8302_reg_write(0x0180,buf,1); buf[0] = 0xA2; // 切换到EMM模式 RN8302_reg_write(WMSW,buf,1); buf[0] = 0x77; // 计量控制位 buf[1] = 0x77; buf[2] = 0x77; RN8302_reg_write(0x0162,buf,3); buf[0] = HFconst>>8; buf[1] = HFconst%256; RN8302_reg_write(HFCONST1,buf,2); RN8302_reg_write(HFCONST2,buf,2); // 电压增益初始化 buf[0]=(13193)>>8; buf[1]=(13193)%256; RN8302_reg_write(GSUA,buf,2); buf[0]=(13192)>>8; buf[1]=(13192)%256; RN8302_reg_write(GSUB,buf,2); buf[0]=(13177)>>8; buf[1]=(13177)%256; RN8302_reg_write(GSUC,buf,2); // 电流增益初始化 buf[0]=(13612)>>8; buf[1]=(13612)%256; RN8302_reg_write(GSIA,buf,2); buf[0]=(13565)>>8; buf[1]=(13565)%256; RN8302_reg_write(GSIB,buf,2); buf[0]=(13603)>>8; buf[1]=(13603)%256; RN8302_reg_write(GSIC,buf,2); buf[0]=(13603)>>8; buf[1]=(13603)%256; RN8302_reg_write(GSIN,buf,2); // // 通道相位校正 // RN8302_reg_write(PRTH1L,buf,2); // RN8302_reg_write(PRTH1H,buf,2); // RN8302_reg_write(PRTH2L,buf,2); // RN8302_reg_write(PRTH2H,buf,2); // 通道相位分段参数 // 通道相位校正 // buf[0]=(128)>>16; // buf[1]=(128)>>8; // buf[2]=(128)%256; // RN8302_reg_write(PHSIA,buf,3); // buf[0]=(128)>>16; // buf[1]=(128)>>8; // buf[2]=(128)%256; // RN8302_reg_write(PHSIB,buf,3); // buf[0]=(128)>>16; // buf[1]=(128)>>8; // buf[2]=(128)%256; // RN8302_reg_write(PHSIC,buf,3); buf[0]=(415)>>8; buf[1]=(415)%256; RN8302_reg_write(PA_PHS,buf,2); buf[0]=(434)>>8; buf[1]=(434)%256; RN8302_reg_write(PB_PHS,buf,2); buf[0]=(432)>>8; buf[1]=(432)%256; RN8302_reg_write(PC_PHS,buf,2); buf[0]=(415)>>8; buf[1]=(415)%256; RN8302_reg_write(QA_PHS,buf,2); buf[0]=(434)>>8; buf[1]=(434)%256; RN8302_reg_write(QB_PHS,buf,2); buf[0]=(432)>>8; buf[1]=(432)%256; RN8302_reg_write(QC_PHS,buf,2); //功率增益 buf[0]=(65535)>>8; buf[1]=(65535)%256; RN8302_reg_write(GPA,buf,2); buf[0]=(7)>>8; buf[1]=(7)%256; RN8302_reg_write(GPB,buf,2); buf[0]=(0)>>8; buf[1]=(0)%256; RN8302_reg_write(GPC,buf,2); buf[0]=(65529)>>8; buf[1]=(65529)%256; RN8302_reg_write(GQA,buf,2); buf[0]=(2)>>8; buf[1]=(2)%256; RN8302_reg_write(GQB,buf,2); buf[0]=(4)>>8; buf[1]=(4)%256; RN8302_reg_write(GQC,buf,2); buf[0]=(65518)>>8; buf[1]=(65518)%256; RN8302_reg_write(GSA,buf,2); buf[0]=(65526)>>8; buf[1]=(65526)%256; RN8302_reg_write(GSB,buf,2); buf[0]=(65535)>>8; buf[1]=(65535)%256; RN8302_reg_write(GSC,buf,2); // // 通道功率OFFSET校正 // RN8302_reg_write(PA_OS,buf,2); // RN8302_reg_write(PB_OS,buf,2); // RN8302_reg_write(PC_OS,buf,2); buf[0]=(96)>>8; buf[1]=(96)%256; RN8302_reg_write(IStart_PS,buf,2); buf[0]=(29)>>8; buf[1]=(29)%256; RN8302_reg_write(ZXOT,buf,2); buf[0] = 0x42; RN8302_reg_write(0x0184,buf,1); buf[0] = 0; RN8302_reg_write(0x0185,buf,1); buf[0] = 0; RN8302_reg_write(0x0184,buf,1); buf[0] = 0x10; buf[1] = 0x32; buf[2] = 0x07; RN8302_reg_write(CFCFG,buf,3); buf[0] = 0x40; // 计量控制位 默认值 400000 buf[1] = 0x00; buf[2] = 0x00; RN8302_reg_write(0x0161,buf,3); buf[0] = 0x10; // 清空采样数据缓存区 RN8302_reg_write(0x0163,buf,1); buf[0] = 0xDC; // 写保护 RN8302_reg_write(0x0180,buf,1); } ``` **3.2、Modbus-RTU轮询** ``` static void MDS_RTU_UserUpdate(void){ uint16 temp=0x0f; uint16 temp1[]={1,2,3,4,5}; MDS_RTU_WriteHoldReg(&modbusS_RTU,11, temp); MDS_RTU_WriteCoils(&modbusS_RTU,0, 4,&temp); MDS_RTU_WriteHoldRegs(&modbusS_RTU,5,5,temp1); } /*Write callback function*/ static void MDSAPPWriteFunciton(void* obj,uint16 modbusAddr,uint16 wLen,AddrType addrType){ uint16 data[8]; uint8 temp=MD_H_BYTE(data[0]); if((&modbusS_RTU)!=obj){return ;} switch(addrType){ case COILS_TYPE: MDS_RTU_ReadCoils(obj,modbusAddr,wLen, (uint8*)data); data[0]=data[0]; break; case INPUT_TYPE: break; case HOLD_REGS_TYPE: MDS_RTU_ReadHoldRegs(obj,modbusAddr,wLen<8?wLen:8, data); temp=MD_L_BYTE(data[0]); temp=temp; break; case INPUT_REGS_TYPE: break; } } void MDS_RTU_Loop_1(void){ MDS_RTU_Process(&modbusS_RTU); MDS_RTU_UserUpdate(); } ``` **3.3、FFT实现** ``` static void rfft_cal(float x[],u16 n) { int i,j,k,m,i1,i2,i3,i4,n1,n2,n4; float a,e,cc,ss,xt,t1,t2; for(j=1,i=1;i<16;i++) { m=i; j=2*j; if(j==n) { break; } } n1=n-1; for(j=0,i=0;in/2;i--) { ima[n-i]=x[i]; } for(i=0;i<(n/2+1);i++) { y[i]=sqrt(rel[i]*rel[i]+ima[i]*ima[i])*2/n; } y[0]=y[0]/2; } ``` **3.4、RT-Thread线程及处理** ``` u32 wave_buff[768]; u32 ua_buff[128]; u32 ub_buff[128]; u32 uc_buff[128]; u32 ia_buff[128]; u32 ib_buff[128]; u32 ic_buff[128]; /****************************线程控制块***************************/ rt_thread_t task_modbus; rt_thread_t task_disp; rt_thread_t app_task; rt_thread_t task_rfft; /****************************线程入口函数*************************/ static void modbus_thread_entry(void *arg); static void disp_thread_entry(void *arg); static void app_thread_entry(void *arg); static void rfft_thread_entry(void *arg); /************其他函数******************/ static void show_parameter(u8 num); static void show_rfft_parameter(u8 num); volatile uint8_t key=0; volatile uint8_t key_num=0; volatile uint8_t key_fft=0; int main(void) { NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); usart_set(115200); led_init(); // systick_set(168); #if MD_USD_SALVE MDS_RTU_APPInit_1(); #else MDM_RTU_APPInit(); #endif TIM3_Int_Init(84-1,100-1); /* Infinite loop */ TFTLCD_GPIO_Init(); TFTLCD_FSMC_Init(); drv_lcd_init(); fnRN8302_Init(); app_task=rt_thread_create("app",app_thread_entry,RT_NULL,256,2,15); rt_thread_startup(app_task); while (1) { } } ``` **四、基于星火一号的三相多功能电表测试** ![输入图片说明](https://foruda.gitee.com/images/1726374080595451582/4c9b9668_5476365.jpeg "图10.jpg") **测试结果** ![输入图片说明](https://foruda.gitee.com/images/1726374921416751008/aa60fe2a_5476365.jpeg "图16.jpg") ![输入图片说明](https://foruda.gitee.com/images/1726374141717777419/09bb20d9_5476365.jpeg "图12.jpg") ![输入图片说明](https://foruda.gitee.com/images/1726374161046853963/9aff85c4_5476365.jpeg "图13.jpg") ![输入图片说明](https://foruda.gitee.com/images/1726374181264858295/177ffbd5_5476365.jpeg "图14.jpg") ![输入图片说明](https://foruda.gitee.com/images/1726374198081564404/0ac64be3_5476365.jpeg "图15.jpg") **测试视频(哔哩哔哩)** :基于stm32多功能电表测试_哔哩哔哩_bilibili 【基于stm32多功能电表测试】 https://www.bilibili.com/video/BV1Lv42eSEjh/?share_source=copy_web&vd_source=7f0cb9c0f09b768583faf157910eb515 **代码(码云)** :https://gitee.com/zhang_en/electric-meter-development.git #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)