STM32单片机系统:功能集成,电力监测与远程控制
功能描述: 本系统由STM32单片机核心板、交流电压电流检测模块、WIFI模块、指示灯组成。 1、220V市电经过互感器后产生微弱交流电,经过整流滤波后变为直流,然后通过单片机AD转换,然后换算出实际值。电压电流采集分别使用电压互感器TV1005M和电流互感器TA1005M。 2、手机APP和WiFi模块互联后,可以实时显示交流电压、交流电流、功率和电量实时显示在手机上。功率=电压*电流,电量是功率*时间。 3、当功率超过200W时,继电器自动断开。功率不超过200W时,可以手动控制继电器的开关。 4、手机APP和设备WiFi模块连接后,手机上显示计时时间。
最近在搞一个基于STM32的智能用电监控装置,这玩意儿能实时监测家用电器参数,还能手机远程查看数据。别看它外壳就巴掌大,里面可是藏着220V强电处理的硬核操作。今天带大家看看这套系统怎么玩转交流电参数采集,顺便扒几段关键代码聊聊实现逻辑。
功能描述: 本系统由STM32单片机核心板、交流电压电流检测模块、WIFI模块、指示灯组成。 1、220V市电经过互感器后产生微弱交流电,经过整流滤波后变为直流,然后通过单片机AD转换,然后换算出实际值。电压电流采集分别使用电压互感器TV1005M和电流互感器TA1005M。 2、手机APP和WiFi模块互联后,可以实时显示交流电压、交流电流、功率和电量实时显示在手机上。功率=电压*电流,电量是功率*时间。 3、当功率超过200W时,继电器自动断开。功率不超过200W时,可以手动控制继电器的开关。 4、手机APP和设备WiFi模块连接后,手机上显示计时时间。
先说最刺激的电压电流采集部分。市电经过TV1005M电压互感器后,原本220V的交流电瞬间变成0-5V的弱电信号。这里有个坑:交流信号需要整流滤波才能给ADC采集。我们用了全桥整流搭配π型滤波电路,实测纹波控制在30mV以内。ADC配置这块,STM32的规则组双通道采集稳得一批:
//ADC初始化关键配置 hadc1.Instance = ADC1; hadc1.Init.ScanConvMode = ENABLE; hadc1.Init.ContinuousConvMode = ENABLE; hadc1.Inchannels[0].Channel = ADC_CHANNEL_0; //电压通道 hadchannels[1].Channel = ADC_CHANNEL_1; //电流通道 HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, 2); //DMA双缓冲采集到的原始数据需要转换实际值。这里有个校准系数,是我拿万用表蹲实验室三天测出来的经验值:
float get_voltage(){ float raw = adc_buffer[0] * 3.3 / 4096; return raw * 65.8 + 2.1; //65.8是电压比,2.1是零点补偿 }WiFi模块用的是ESP-12F,通过AT指令和STM32交互。数据上传要注意JSON格式打包,别让手机端解析炸了。看这段数据打包代码:
char json_buf[128]; sprintf(json_buf, "{\"V\":%.1f,\"A\":%.2f,\"W\":%.0f,\"KWH\":%.3f,\"T\":%d}", voltage, current, power, kwh, seconds); HAL_UART_Transmit(&huart2, (uint8_t*)json_buf, strlen(json_buf), 100);过载保护逻辑看似简单,实际要考虑消抖处理。直接上状态机实现:
if(power > 200.0){ overload_counter++; if(overload_counter > 30){ //持续3秒超载 RELAY_OFF(); overload_flag = 1; } }else{ overload_counter = 0; }计时功能用STM32的基本定时器实现,注意秒数变量要加volatile修饰:
__IO uint32_t seconds = 0; //放在定时中断里自增 void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){ if(htim->Instance == TIM6){ seconds++; update_display_flag = 1; } }开发过程中被互感器相位差坑过——电压电流采样不同步会导致功率计算误差。后来用双ADC交替采样+软件补偿才搞定。还有个隐藏技能:电量统计其实是把功率对时间积分,代码里每5秒累加一次:
kwh += (power * 5.0 / 3600.0) / 1000; //单位转kWh最后说个血泪教训:调试强电部分务必做好隔离!有次误碰滤波电容,体验了一把"触电的感觉",现在操作都养成单手接线的习惯。完整工程已开源,需要源码的私信甩邮箱,下次可能做个带用电异常识别的升级版。
