第二章 系统总体架构:需求分析与软硬件设计
好,咱们进入正题。这一章讲的是系统总体架构,说白了就是回答三个问题:电表要干什么?硬件怎么搭?软件怎么写?我做了这么多年智能电网项目,发现很多新手一上来就画电路图、写代码,结果做到一半发现需求没理清,推倒重来。嗯,咱们别走弯路。
2.1 系统功能需求分析
先聊聊功能需求。智能电表不是简单计个电度数就完事了,多费率计量系统要干的事还挺多。
核心功能我归纳为四点:
- 多费率计量:支持尖、峰、平、谷至少四个时段,每个时段电价不同。我记得有个项目,用户要求支持12个时段,当时硬件存储差点不够用。
- 数据存储与冻结:每天零点冻结总电量,每个费率时段结束时冻结该时段电量。数据要存至少3个月,这是国网标准。
- 通信交互:支持RS485、红外、载波至少两种通信方式。远程抄表、参数设置、费率切换都靠它。
- 事件记录:掉电、上电、编程、清零、开盖等事件都要记录,带时间戳。我曾经遇到一个纠纷,用户说电表不准,一查事件记录发现他私自开盖过,问题就清楚了。
避坑指南:我曾经在需求阶段忽略了「费率切换平滑性」这个点。结果现场运行时,费率切换瞬间电流突变,导致计量芯片读数跳变。后来加了软件滤波和硬件缓冲才解决。所以,需求分析时一定要考虑边界条件。
2.2 硬件架构设计
硬件架构这块,我习惯从芯片选型开始讲起。你想想看,电表要跑几年甚至十年不关机,可靠性是第一位的。
典型的硬件架构分三层:
| 层级 | 核心器件 | 我的选型建议 |
|---|---|---|
| 主控层 | MCU(如STM32F103、复旦微FM33系列) | 选工业级,-40~85℃,带RTC和LCD驱动 |
| 计量层 | 专用计量芯片(如RN8302、ATT7022) | 精度0.5S级,支持谐波分析更好 |
| 通信层 | 载波模块、RS485芯片、红外收发 | 载波模块注意和主控的SPI速率匹配 |
我个人习惯把电源部分单独拿出来说。电表电源要支持宽电压输入(80V~380V),还要有掉电检测。我做过一个项目,掉电检测电路设计得太简单,结果掉电瞬间数据没保存,第二天数据全丢了。后来加了超级电容和掉电中断,才算稳了。
小技巧:计量芯片和MCU之间用SPI通信,注意加光耦隔离。我见过不少板子因为没隔离,雷击时整个通信口烧掉。隔离成本不高,但能省大麻烦。
2.3 软件架构设计
软件架构,说白了就是让硬件按规矩干活。我建议采用前后台系统,简单可靠,适合电表这种实时性要求不高的场景。
软件模块划分:
- 任务调度模块:主循环轮询,定时中断处理关键任务。比如1ms中断处理计量数据读取,10ms中断处理按键扫描,100ms中断处理通信。
- 计量处理模块:读取计量芯片寄存器,计算功率、电量、需量。注意单位换算,我见过有人把kW和kWh搞混,数据差1000倍。
- 费率管理模块:根据当前时间匹配费率时段,切换计费规则。这里要处理好夏令时、闰年这些特殊情况。
- 存储管理模块:操作EEPROM或Flash,保存电量、事件、参数。写操作要加校验,防止数据损坏。
- 通信协议栈:实现DL/T 645协议,这是国标。帧格式、校验、应答超时都要处理到位。
我举个例子,费率切换的伪代码大概长这样:
// 费率切换任务,每100ms执行一次
void RateSwitchTask(void)
{
uint8_t currentHour = RTC_GetHour();
uint8_t currentMin = RTC_GetMinute();
// 判断当前时段
if (currentHour >= 8 && currentHour < 12)
rateType = RATE_PEAK; // 峰时段
else if (currentHour >= 12 && currentHour < 17)
rateType = RATE_FLAT; // 平时段
else if (currentHour >= 17 && currentHour < 21)
rateType = RATE_VALLEY; // 谷时段
else
rateType = RATE_SHARP; // 尖时段
// 更新计量芯片的费率寄存器
MeterChip_SetRate(rateType);
}
注意:费率切换时,一定要先读取当前累计电量,再切换费率,最后清零临时寄存器。顺序错了,电量数据会乱。我调试时吃过这个亏,查了两天才找到原因。
嗯,软件架构还有个容易被忽略的点——看门狗。电表要长期运行,万一程序跑飞了,看门狗能自动复位。我建议喂狗放在主循环里,不要在中断里喂,否则中断卡死时看门狗也救不了你。
好了,这一章就讲到这里。系统总体架构是后面所有章节的基础,你把它理清楚了,后面做具体设计时就会顺手很多。下一章咱们聊计量芯片的选型与驱动开发,到时候我会分享一些实际调试中的波形和寄存器配置经验。