三相多功能电表电路与代码实现

发布时间:2026/6/11 3:21:40

三相多功能电表电路与代码实现 一、系统概述三相多功能电表是一种用于测量三相交流电路中各种电参数的智能仪表能够测量电压、电流、功率、电能、频率、功率因数等参数并具备通信、显示、报警等功能。二、电路设计1. 系统框图------------------- ------------------- ------------------- | 电压采样电路 | | 电流采样电路 | | 微控制器 | | (PT/CT) |----| (CT/分流器) |----| (STM32F407) | ------------------- ------------------- ------------------- | | | v v v ------------------- ------------------- ------------------- | 信号调理电路 | | 信号调理电路 | | 通信接口 | | (运放、滤波) | | (运放、滤波) | | (RS485, IR, RF) | ------------------- ------------------- ------------------- | v ------------------- | 显示模块 | | (LCD, LED) | ------------------- | v ------------------- | 存储模块 | | (EEPROM, Flash) | -------------------2. 关键电路设计2.1 电压采样电路使用电压互感器(PT)将高电压(如220V/380V)转换为低电压(如0-5V)信号调理电路运放缓冲、低通滤波(截止频率100Hz)保护电路TVS二极管、自恢复保险丝2.2 电流采样电路使用电流互感器(CT)或分流器(Shunt)将大电流转换为小电压信号调理电路运放放大、偏置调整、低通滤波保护电路双向TVS二极管2.3 微控制器电路核心STM32F407ZGT6(ARM Cortex-M4, 168MHz)外设多通道ADC(16位分辨率)定时器(用于PWM、捕获、时基)UART、SPI、I2C(用于通信)GPIO(用于LCD、按键、指示灯)2.4 通信接口电路RS485MAX485芯片半双工通信红外IRDA收发器无线LoRa模块(SX1278)2.5 电源电路输入AC/DC转换(85-265V AC转5V DC)输出3.3V(给MCU及数字电路)±12V(给模拟电路)三、代码实现1. 系统初始化#includestm32f4xx_hal.h#includeadc.h#includetim.h#includeusart.h#includegpio.h// 系统时钟配置voidSystemClock_Config(void){RCC_OscInitTypeDef RCC_OscInitStruct{0};RCC_ClkInitTypeDef RCC_ClkInitStruct{0};// 配置主PLLRCC_OscInitStruct.OscillatorTypeRCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEStateRCC_HSE_ON;RCC_OscInitStruct.PLL.PLLStateRCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSourceRCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLM8;RCC_OscInitStruct.PLL.PLLN336;RCC_OscInitStruct.PLL.PLLPRCC_PLLP_DIV2;RCC_OscInitStruct.PLL.PLLQ7;HAL_RCC_OscConfig(RCC_OscInitStruct);// 配置系统时钟RCC_ClkInitStruct.ClockTypeRCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSourceRCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDividerRCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDividerRCC_HCLK_DIV4;RCC_ClkInitStruct.APB2CLKDividerRCC_HCLK_DIV2;HAL_RCC_ClockConfig(RCC_ClkInitStruct,FLASH_LATENCY_5);}// 外设初始化voidPeripheral_Init(void){MX_GPIO_Init();MX_ADC1_Init();MX_ADC2_Init();MX_TIM2_Init();MX_USART1_UART_Init();MX_I2C1_Init();}2. ADC采样与处理// ADC采样数据结构typedefstruct{floatUa,Ub,Uc;// 三相电压floatIa,Ib,Ic;// 三相电流floatPa,Pb,Pc;// 三相有功功率floatQa,Qb,Qc;// 三相无功功率floatSa,Sb,Sc;// 三相视在功率floatPFa,PFb,PFc;// 三相功率因数floatFreq;// 频率floatTotalEnergy;// 总有功电能}PowerData;// ADC DMA缓冲区uint32_tadcBuffer[6];// 6通道ADC数据// 启动ADC采样voidStart_ADC_Sampling(void){HAL_ADC_Start_DMA(hadc1,(uint32_t*)adcBuffer,6);}// 处理ADC数据voidProcess_ADC_Data(PowerData*data){// 转换ADC原始值为实际电压/电流值// 假设ADC参考电压3.3V12位分辨率(0-4095)// 电压分压比: 1000:1, 电流变比: 1000:1// 电压采样值 (0-3.3V对应0-500V)data-Ua(adcBuffer[0]*3.3/4095)*(500/3.3);data-Ub(adcBuffer[1]*3.3/4095)*(500/3.3);data-Uc(adcBuffer[2]*3.3/4095)*(500/3.3);// 电流采样值 (0-3.3V对应-50A-50A)data-Ia((adcBuffer[3]*3.3/4095)-1.65)*(50/1.65);data-Ib((adcBuffer[4]*3.3/4095)-1.65)*(50/1.65);data-Ic((adcBuffer[5]*3.3/4095)-1.65)*(50/1.65);// 计算功率和电能Calculate_Power(data);Calculate_Energy(data);}// 计算功率参数voidCalculate_Power(PowerData*data){// 计算三相有功功率: P U * I * cosφ// 这里简化处理实际需根据相位角计算data-Padata-Ua*data-Ia;data-Pbdata-Ub*data-Ib;data-Pcdata-Uc*data-Ic;// 计算总功率floatP_totaldata-Padata-Pbdata-Pc;// 计算功率因数 (简化处理)data-PFa(data-Ua!0data-Ia!0)?data-Pa/(data-Ua*data-Ia):0;data-PFb(data-Ub!0data-Ib!0)?data-Pb/(data-Ub*data-Ib):0;data-PFc(data-Uc!0data-Ic!0)?data-Pc/(data-Uc*data-Ic):0;// 计算频率 (使用过零检测)data-FreqCalculate_Frequency();}// 计算电能voidCalculate_Energy(PowerData*data){staticuint32_tlastTime0;uint32_tcurrentTimeHAL_GetTick();floatdeltaTime(currentTime-lastTime)/3600000.0;// 小时if(lastTime!0){// 累加电能: E P * tdata-TotalEnergy(data-Padata-Pbdata-Pc)*deltaTime;}lastTimecurrentTime;}3. 通信协议实现(Modbus RTU)// Modbus寄存器映射#defineREG_VOLTAGE_A0x0000#defineREG_VOLTAGE_B0x0001#defineREG_VOLTAGE_C0x0002#defineREG_CURRENT_A0x0003#defineREG_CURRENT_B0x0004#defineREG_CURRENT_C0x0005#defineREG_POWER_P0x0006#defineREG_ENERGY0x0007#defineREG_FREQ0x0008#defineREG_PF0x0009// Modbus RTU帧处理voidProcess_Modbus_Frame(uint8_t*frame,uint16_tlen){uint8_taddressframe[0];uint8_tfunctionframe[1];uint16_tcrc*(uint16_t*)(framelen-2);// 验证CRCif(Calculate_CRC(frame,len-2)!crc)return;// 处理不同功能码switch(function){case0x03:// 读保持寄存器Handle_Read_Registers(frame,len);break;case0x06:// 写单个寄存器Handle_Write_Register(frame,len);break;case0x10:// 写多个寄存器Handle_Write_Registers(frame,len);break;default:Send_Modbus_Exception(address,function,0x01);// 非法功能}}// 处理读寄存器请求voidHandle_Read_Registers(uint8_t*frame,uint16_tlen){uint8_taddressframe[0];uint16_tstartReg(frame[2]8)|frame[3];uint16_tnumRegs(frame[4]8)|frame[5];// 构建响应帧uint8_tresponse[256];response[0]address;response[1]0x03;response[2]numRegs*2;// 字节数// 填充寄存器值for(inti0;inumRegs;i){uint16_tregValueRead_Register(startRegi);response[3i*2](regValue8)0xFF;response[4i*2]regValue0xFF;}// 计算CRCuint16_tcrcCalculate_CRC(response,3numRegs*2);response[3numRegs*2](crc8)0xFF;response[4numRegs*2]crc0xFF;// 发送响应HAL_UART_Transmit(huart1,response,5numRegs*2,100);}// 读取寄存器值uint16_tRead_Register(uint16_tregAddr){PowerData data;Get_Current_PowerData(data);// 获取当前电力数据switch(regAddr){caseREG_VOLTAGE_A:return(uint16_t)(data.Ua*10);caseREG_VOLTAGE_B:return(uint16_t)(data.Ub*10);caseREG_VOLTAGE_C:return(uint16_t)(data.Uc*10);caseREG_CURRENT_A:return(uint16_t)(data.Ia*100);caseREG_CURRENT_B:return(uint16_t)(data.Ib*100);caseREG_CURRENT_C:return(uint16_t)(data.Ic*100);caseREG_POWER_P:return(uint16_t)((data.Padata.Pbdata.Pc)*10);caseREG_ENERGY:return(uint16_t)(data.TotalEnergy);caseREG_FREQ:return(uint16_t)(data.Freq*10);caseREG_PF:return(uint16_t)(data.PFa*1000);default:return0;}}4. LCD显示驱动// LCD显示数据结构typedefstruct{charline1[17];// 16字符结束符charline2[17];charline3[17];charline4[17];}LCD_Display;// 更新LCD显示voidUpdate_LCD_Display(PowerData*data){LCD_Display display;// 格式化显示内容snprintf(display.line1,17,Ua:%.1fV Ub:%.1fV,data-Ua,data-Ub);snprintf(display.line2,17,Uc:%.1fV I:%.2fA,data-Uc,(data-Iadata-Ibdata-Ic)/3);snprintf(display.line3,17,P:%.1fW E:%.1fkWh,data-Padata-Pbdata-Pc,data-TotalEnergy/1000);snprintf(display.line4,17,F:%.1fHz PF:%.2f,data-Freq,data-PFa);// 发送到LCDLCD_SetCursor(0,0);LCD_PrintString(display.line1);LCD_SetCursor(1,0);LCD_PrintString(display.line2);LCD_SetCursor(2,0);LCD_PrintString(display.line3);LCD_SetCursor(3,0);LCD_PrintString(display.line4);}// LCD底层驱动函数voidLCD_SetCursor(uint8_trow,uint8_tcol){// 实现LCD光标定位}voidLCD_PrintString(char*str){// 实现LCD字符串显示}5. 主程序逻辑intmain(void){// HAL库初始化HAL_Init();// 系统时钟配置SystemClock_Config();// 外设初始化Peripheral_Init();// 启动ADC采样Start_ADC_Sampling();// 初始化LCDLCD_Init();LCD_Clear();LCD_PrintString(三相多功能电表);HAL_Delay(1000);// 主循环PowerData currentData;while(1){// 处理ADC数据Process_ADC_Data(currentData);// 更新显示Update_LCD_Display(currentData);// 处理通信Process_Communication();// 检查报警条件Check_Alarms(currentData);// 延时HAL_Delay(500);}}// 处理通信voidProcess_Communication(void){uint8_trxBuffer[256];uint16_trxLen;// 检查UART接收if(HAL_UART_Receive(huart1,rxBuffer,sizeof(rxBuffer),10)HAL_OK){// 处理Modbus帧Process_Modbus_Frame(rxBuffer,sizeof(rxBuffer));}}// 检查报警条件voidCheck_Alarms(PowerData*data){// 过压报警if(data-Ua250||data-Ub250||data-Uc250){Trigger_Alarm(OVER_VOLTAGE);}// 欠压报警if(data-Ua180||data-Ub180||data-Uc180){Trigger_Alarm(UNDER_VOLTAGE);}// 过流报警if(fabs(data-Ia)30||fabs(data-Ib)30||fabs(data-Ic)30){Trigger_Alarm(OVER_CURRENT);}// 缺相报警if(fabs(data-Ia)0.1||fabs(data-Ib)0.1||fabs(data-Ic)0.1){Trigger_Alarm(PHASE_LOSS);}}// 触发报警voidTrigger_Alarm(AlarmType type){// 设置报警灯HAL_GPIO_WritePin(ALARM_LED_GPIO_Port,ALARM_LED_Pin,GPIO_PIN_SET);// 发送报警信息charmsg[50];switch(type){caseOVER_VOLTAGE:snprintf(msg,sizeof(msg),过压报警!);break;caseUNDER_VOLTAGE:snprintf(msg,sizeof(msg),欠压报警!);break;caseOVER_CURRENT:snprintf(msg,sizeof(msg),过流报警!);break;casePHASE_LOSS:snprintf(msg,sizeof(msg),缺相报警!);break;}// 显示报警信息LCD_Clear();LCD_PrintString(!!! 报警 !!!);LCD_SetCursor(1,0);LCD_PrintString(msg);// 蜂鸣器报警HAL_GPIO_WritePin(BUZZER_GPIO_Port,BUZZER_Pin,GPIO_PIN_SET);HAL_Delay(1000);HAL_GPIO_WritePin(BUZZER_GPIO_Port,BUZZER_Pin,GPIO_PIN_RESET);}参考代码 三相多功能电表电路原理图源码设计说明www.youwenfan.com/contentcss/160735.html四、系统功能基本测量功能三相电压、电流有效值三相有功/无功/视在功率总电能计量频率、功率因数测量通信功能Modbus RTU协议RS485/RS232接口红外通信无线LoRa通信显示功能LCD液晶显示LED状态指示背光控制报警功能过压/欠压报警过流报警缺相报警失压报警逆相序报警数据存储电能数据冻结历史事件记录参数设置存储安全功能密码保护防窃电功能自检功能五、系统特点高精度测量电压/电流精度0.5级功率精度1.0级电能精度1.0级宽范围测量电压0-500V电流0-100A频率45-65Hz高可靠性工业级元器件宽工作温度范围(-25℃~70℃)抗电磁干扰设计易用性中文菜单大屏幕LCD显示按键操作扩展性支持多种通信协议可配置输入输出接口支持固件升级六、应用实例1. 工业配电监控工厂配电室变电站工业生产线2. 商业建筑能源管理商场写字楼酒店3. 智能电网分布式能源监控微电网管理需求侧响应七、总结本三相多功能电表系统通过精心设计的电路和高效的代码实现实现了对三相交流电力参数的精确测量、显示、存储和通信功能。系统采用模块化设计各功能独立实现便于维护和扩展。系统特点高精度测量满足工业级应用需求丰富的通信接口支持多种组网方式完善的保护和报警功能确保系统安全友好的用户界面便于操作和配置工业级设计适应恶劣工作环境

相关新闻