做电能质量监测这类项目,最怕的就是方案还没定,就先被各种高大上的名词绕晕。什么电能质量分析仪、谐波监测装置、暂态事件捕捉,听起来像工业级设备才能干的事,实际上用一颗常见的STM32单片机,配合互感器和基本的信号调理电路,就能把电压有效值、频率、谐波畸变率、三相不平衡这些核心指标做得像模像样。这篇文章我就把整个设计过程拆开讲清楚,从硬件前端怎么搭、算法怎么在单片机上落地,到调试时容易踩的坑怎么排查,全是我实测过、踩过、最后填平了的经验。适合正在做毕业设计、课设,或者想把手里的开发板变成一台小功率电能质量检测仪的朋友参考,已经有一点点单片机基础会更顺一些,但纯新手照着做,也能跑出有效数据。
2. 内容整体设计与思路拆解
2.1 这个检测仪到底在测什么
电能质量这个概念听起来很宽泛,但落到具体设备上,要测的东西其实很明确。国标GB/T 12325、GB/T 14549这些标准里规定的指标,提炼出核心几项就是:电压有效值、电流有效值、频率、电压偏差、谐波畸变率THD、三相不平衡度,再往上还可以算有功功率、无功功率、功率因数。我做这款检测仪时,把目标锁定在单相和三相四线制系统的基础测量上,优先保证前三项绝对准确,谐波和功率因数作为重要参考指标,不追求实验室级精度,但趋势和数值大小必须可靠。
选择这几个指标是有讲究的。电压有效值和频率是电能质量最基础的考察项,所有电气设备都对它们有最低要求;谐波畸变率则直接反映了电网里非线性负载的污染程度,现在变频器、开关电源满大街都是,这一项越来越受到重视。至于三相不平衡度,在办公楼、小型工厂的三相供电里特别常见,缺相、偏相都是实际运维中经常遇到的问题。
所以整体设计目标是:一颗MCU,配上一套采样前端,把这几项指标算出来,在本地屏幕上显示,同时通过串口上传给上位机或者集中器。单相模式下测单相数据,三相模式下循环切换通道,测完A相测B相再测C相,这样一套硬件吃两种场景,性价比很高,也方便答辩或者做产品演示时讲故事。
2.2 为什么选STM32F4而不是51或者DSP
很多初学者一看到"单片机",第一反应就是51,毕竟学校课程里51是绕不开的。但电能质量检测这个应用场景,51是真的跑不动,这不是性能过剩的问题,而是根本不够用。
先说采样率。电能质量分析要看到电压谐波,按国标要求至少分析到31次谐波,按50Hz基波算,31次谐波是1550Hz,根据奈奎斯特采样定律,采样率至少要两倍,也就是至少3.1kHz。但工程上为了让波形平滑、方便后处理,一般采样率会取到6.4kHz甚至更高,我的方案里每周期采样128点,50Hz对应6.4kHz,这一下就把51单片机卡死了——不是因为速度不够,而是51的ADC根本到不了这么快的采样率,即使外挂高速ADC,8051内核的处理能力也扛不住实时的FFT运算。
再看运算量。算一次256点FFT,需要乘加运算几千次,51单片机算完一次可能得几十毫秒,用户界面早就卡成幻灯片了。而带浮点运算单元和DSP指令的STM32F4系列,同样是256点FFT,微秒级别就能跑完,完全不影响显示刷新和通信响应。
有人会说,那直接用DSP算了,比如TMS320F28335,性能确实更强。但DSP的价格、开发门槛、资料丰富度都不如STM32友好,对于毕设或者小批量产品,STM32F407系列大概十几元一颗,片内就有12位ADC、DMA、定时器,跑基础FFT完全够用,没必要上DSP。这个项目里我用的是STM32F407VET6,512KB Flash,192KB RAM,资源非常宽裕。
2.3 采样方案选型:电阻分压还是互感器隔离
采样前端是整个检测仪最容易出问题的环节,信号进ADC之前没处理好,后面M4再强也白搭。电压采样有两种主流做法:电阻分压和电压互感器。电阻分压的好处是便宜、无需供电、相位误差几乎为零,直接把220V分压到1V以内进ADC,但致命缺点是电气不隔离,电网干扰和模拟地会直接耦合进单片机系统,存在安全隐患,测量数值也会因为地电位抬升而波动。
电压互感器则天然带隔离功能,常见的微型电压互感器如ZMPT101B,输入端串限流电阻接电网相线,次级输出小电流信号,配合运放调理成0~3.3V的单极性信号进ADC。这种方案安全性高,共模干扰被变压器断开了,缺点是相位有微小偏移,不过电能质量检测关心的不是瞬时相位,而是有效值和谐波幅值,所以这个偏移影响很小,还能在校准环节修正。
电流采样同理,用电流互感器(CT)。我选的是开口式电流互感器,典型变比1000:1,方便钳入电线,不用断开负载接线,这在现场测试时特别重要——你不会想为了测个电流就把用户的设备断电拆线的。CT次级输出小电流,同样需要并联采样电阻转换成电压信号,再经过调理电路进ADC。
这里有一个关键细节,ADC只能采单极性正电压,而我们关心的AC信号是正负交替的。解决办法是给调理电路加一个直流偏置,把信号抬升到Vref/2附近,比如STM32F407的VDDA是3.3V,那就把信号偏置到1.65V。软件采样后先减去这个1.65V的直流分量,再计算有效值。这个偏置电压必须稳,我用的是一颗TL431产生2.5V基准再分压,或者直接用REF3033做3.0V基准后分压,经运放电压跟随后再进ADC,坚决不能直接用VDD作为偏置,否则电源一波动,采样数据全漂了。
3. 硬件电路核心细节与实操要点
3.1 电压采集通道设计:从220V到1.65V偏置信号
我的电压采样电路按模块化思路来搭。以单相为例,火线L经过一个100kΩ/1W左右的限流电阻接入电压互感器ZMPT101B的一次侧,互感器二次侧并联一个采样电阻,比如按数据手册选100Ω,二次输出电流信号就转成交流电压信号。然后这个AC小信号通过一个同相比例放大电路,放大倍数由电位器或固定电阻网络决定,把信号幅值调节到合适范围。
关键在偏置电路的设计。我用两个10kΩ电阻从3.3V基准分压得到1.65V,中间接一个1μF电容到地滤波,再经过同相跟随器后,把1.65V接到运放的同相输入端。运放采用双电源供电比较容易处理,但实际上单片机系统只有单3.3V电源,所以运放我用的是单电源轨到轨运放,比如MCP6002或LMV358,在3.3V单电源下还保有较宽的动态范围。运放配置成反相加法电路结构,将AC信号与偏置电压相加,输出就在0~3.3V范围内摆动。
最终的信号进STM32的ADC采样引脚前,我会串一只100Ω电阻,并加一个100pF到1nF的小电容到地,构成一个低通滤波,频率分量超过几十kHz的毛刺提前滤掉。钳位保护也是必须的,我习惯在ADC引脚对地和VDD各接一个BAV99二极管,即使前端运放意外输出超过轨电压,也能把信号钳在安全范围内,不至于损坏芯片。
实操中要特别注意互感器相位和信号极性问题。电压互感器的初级和次级有同名端,如果接反了,整个系统的功率因数计算结果会是负的,谐波相位也会异常。我调试时就在屏幕上看电压有效值是否跟万用表一致,电流通道用钳表校验,两个通道的过零点关系再单独验证。
3.2 电流采集通道设计:开口CT和模拟积分器的差距
电流通道的处理思路和电压通道类似,但有一个额外麻烦:CT二次侧电流信号很小,典型的1000:1变比下,一次侧5A对应二次侧5mA,这个5mA电流需要在采样电阻上产生足够高的电压降才能进ADC采样。我选用20Ω的高精度采样电阻,二次侧满幅输出就是0.1V的交流信号,这个量级直接送ADC会浪费分辨率,所以后面必须再接一级固定增益的运放放大电路,把增益设为10到20倍,使满量程时信号幅值达到1.5V左右,再叠加1.65V偏置进ADC,信号利用率就高多了。
电阻精度直接影响电流测量精度,采样电阻我选的是低温漂贴片电阻,误差0.1%,温度系数25ppm/°C以内。电流通道还有一个容易被忽略的问题:小电流时CT的角差会变大,导致功率因数计算不准。我做小电流测试时发现,一次侧电流只有0.2A时,功率因数能偏离真实值好几个百分点。这个问题的根源是CT的励磁阻抗在小电流下分摊了更多相移。
解决手段分两种级别。简单做法是用软件修正,在电流通道做相位补偿,实测不同电流点下的角差曲线,查表补偿,这种方法在小范围内很有效。更彻底的做法是改用闭环电流传感器或者霍尔传感器,比如ACS712系列,直接输出电压信号,不需要采样电阻和运放放大,线性度和角差都更好,但成本也更高,毕设用开口CT配合软件修正完全够了,工业项目再做升级也行。
3.3 电源和布局:模拟数字分开是关键
整个系统我最重视的就是电源和PCB布局,这块一旦处理不好,精度和稳定性会一直有问题,查一个晚上可能都找不到原因。
系统的供电拓扑是:外部5V直流适配器输入,经过一颗AMS1117-3.3输出3.3V给单片机、运放、LCD使用;ADC基准由REF3033提供3.0V,专门为ADC供电脚和Vref+脚提供干净基准。这样把数字件工作电压和模拟参考电压分开,能有效避免数字开关噪声污染采样数值。
PCB布线我遵循"单点接地"原则,模拟地和数字地在ADC下面一点处汇合,然后统一接到电源负极。所有模拟信号通路走顶层,数字信号走底层,中间用完整地平面隔开。我第一版PCB就是偷懒没管布局,电源走线绕着运放转了半个板子,结果ADC采样值跳了十几个LSB,换了芯片也没用,后来把布局重排,跳字基本消失。这块经历让我深刻认识到,硬件设计的功夫在看不见的地方。
采样调理电路的位置要尽量靠近单片机ADC引脚,特别是电流通道,信号是毫伏级弱信号,走线长了很容易被旁边的I2C或串口信号串扰。我一般在模拟信号走线两侧加地线隔离,必要时用铺铜包地。
3.4 显示与交互:不掉帧的刷新策略
人机交互我用了一块2.8寸TFT彩屏配电阻触摸,或者更经济的方案是用SPI接口的1.8寸/2.4寸TFT。显示内容分两页:首页是实时电压、电流、频率、功率因数;第二页是谐波柱状图,显示THD和2~15次谐波的幅值百分比。
TFT刷新如果靠单片机逐点写,刷一屏要几百毫秒,同时还在做FFT计算的话,就会感到明显的延迟。我的策略是:FFT结果先存在一个显示缓冲区里,由DMA方式刷屏,计算和刷屏交替进行,不让刷屏阻塞采样。用状态机架构来调度这些任务,主循环里先做紧急的ADC采样和FFT,再把结果打包成显示数据放缓存,最后才执行屏幕刷新。这样整个界面刷新率大概5Hz,肉眼基本感觉不到卡顿。
按键方面,我用两个实体按键加一个旋转编码器来切换菜单。用旋转编码器调节日期时间和报警阈值比较舒服,配合屏幕上的提示文本,不需要复杂的GUI库,直接画点画线加ASCII字符就够了。
4. 软件实现与核心算法解析
4.1 软件架构:状态机驱动的人机与任务调度
单片机程序最忌讳的就是把所有逻辑都堆在main函数里,连续写几千行,调试的时候头大如斗。这个项目的软件架构我用了典型的状态机加前后台模式,前台上是时间驱动的任务调度,后台是ADC中断和DMA传输。
整体状态分为:BOOT自检状态、测量运行状态、菜单设置状态、通信状态。每个状态里有几个子状态,比如菜单里又分为主菜单、参数设置、校准模式等。共享一个全局状态变量,主循环不停地switch判断当前状态,分发到对应的处理函数。子状态之间通过事件标志进行切换,比如长按按键触发进入校准模式,这个标志在按键扫描线程里置位,主循环读取后跳转状态。
系统的时间基准由SysTick提供1ms节拍,软件定时器就构建在这个节拍上,比如200ms一次按键扫描、500ms一次界面周期刷新、1s一次数据上传。软件定时器代替delay实现延时,绝不让主循环用阻塞式延时,这是保证实时性的第一原则。
4.2 采样时序:如何让128点恰好卡住一个工频周期
电压电流的有效值、谐波分析都对采样窗口有要求。如果我固定用6.4kHz采样率连续采样,那50Hz下一个周期正好128点,窗口对准了,FFT结果精确度会好很多。但电网频率波动在49.5~50.5Hz之间很正常,固定采样率时窗口就会偏,这样得到的FFT结果中包含的就不是完整周期,这就是所谓的频谱泄漏,谐波幅值会偏小,THD也会失真比较严重。
解决办法是在每一个测量周期内动态调整采样间隔。我先测出当前实际频率,比如测10个过零点间隔求平均值,得到准确的工频周期T,然后用T除以128作为采样间隔。实现上我可以用定时器捕获比较功能来做固定点采样,每当定时器计数到设定值时,启动一次ADC转换并产生DMA请求,将结果直接搬运到缓冲区,期间CPU可以干别的。主循环里检测DMA传输完成标志,然后对缓冲区的数据做计算。
ADC我配置为4个通道扫描模式:电压Ua、电流Ia、偏置校准通道、第三方预留通道,每周期128点意味着每通道128*4次采样,采样率在26kHz左右,对STM32F407来说毫无压力。每次DMA传输完成一批,就把数据搬到一个环形缓冲里,供后续处理。
4.3 有效值、频率、功率的计算公式与代码实现
有了每周期的128点采样数组,后面计算就顺理成章了。我以电压有效值为例说明一下离散算法的核心逻辑。对采样数组减去直流偏置后,计算每个点的平方,求和,除以样本数,再开方,这就是有效值。
代码上,我倾向用定点数运算,先将ADC原始值减去偏置值,结果可能为负,所以用int32_t存储。平方后数值会达到上千万,需要用int64_t来累加,最后再开平方。STM32F407不带硬件开方,但可以用自带的sqrtf浮点函数,或者牛顿迭代法整型开方也行。在不开优化的情况下,一次128点的有效值计算耗时不到0.2ms,在这个项目里完全够用。
频率计算用的是过零检测法。在128点的电压数组里,找到从负到正穿越零点的位置,记录下相邻两个过零点的样本数之差,再除以采样率就是周期。为了抗干扰,我做个中值滤波,取最近5次测量的中间值作为最终频率。频率精度实测可以做到0.01Hz级别,远比显示分辨率高。
功率计算稍微复杂一点。有功功率P = Σ(u[i] × i[i]) / N,也就是同一点的电压和电流相乘后求平均。视在功率S = U_rms × I_rms,功率因数为P / S,这一套公式在单相系统里完全够用。三相系统的计算量会更大,但公式逻辑一样,每相独立计算,最后加权汇总。
4.4 FFT谐波计算:256点够不够
谐波分析是电能质量检测仪的核心功能,我对谐波部分做的是:对每个周期的电压、电流采样数据做256点FFT,但由于每周期只有128点,FFT前需要先扩成256点,用补零的方法,然后取频谱的每个峰值点幅度。FFT频率分辨率等于采样率除以FFT点数,128点采样率6.4kHz时,分辨率就是50Hz,正好一个工频周期放一个频点。补零到256点后,分辨率没变,但频谱平滑了,方便找峰值的精确位置。
这里我直接用STM32官方DSP库里的arm_cfft_f32函数,支持基4和基2的FFT,速度极快。256点FFT用CMSIS-DSP计算,耗时大概只有几十微秒,非常轻量。算法流程是:取128点采样数据,补零到256点,调用arm_cfft_f32,得到实数频谱的复数数组,再计算幅值。第k个频点对应频率k × 50Hz,那么第2~31个频点就是2~31次谐波的频谱分量。
从频谱里取基波幅值、各次谐波幅值,然后计算THD,公式是谐波幅值平方和的平方根除以基波幅值。对于THD的计算,我考虑的是最大31次谐波,因为F4算到31次完全带得动,而且31次已经覆盖了绝大多数工程应用场景。谐波百分比显示时保留一位小数,谐波柱状图就按这些百分比画。
FFT幅值的标定需要在校准环节完成。不能直接拿FFT输出的整数当作真实电压值,必须先在已知标准输入下,计算实际幅值与FFT输出幅值的比例系数K,然后每个频点乘以K,才得到真实电压。这个比例系数含硬件前端的增益和互感器变比,每个通道都得单独校准。
4.5 Modbus帧接收程序:帧间隔判帧的坑与对策
数据通信我用的是Modbus RTU,运行在RS485物理层上,这也是工业现场最主流的电力仪表通信方式。Modbus协议本身很简单,真正容易翻车的不是协议,而是数据帧的接收边界的判断。Modbus RTU规定两个相邻帧之间有至少3.5个字符时间的静默期,必须根据这个静默期来分割帧。
很多初学者会在接收中断里直接按字节逐个接收,但这样经常出现帧粘包或者帧拆散的问题,特别是在波特率较高、主站连续下发多帧指令时。我把接收逻辑写成有限状态机的形式,状态分为空闲、接收中、帧结束三个状态,每次收到一个字节都记录时间戳。通过判断当前时间与上一个接收字节时间之差是否超过3.5个字符时间,如果超过则代表上一帧已经结束,把上一帧交付处理,当前字节是新一帧的起始。
具体到代码里,我用了串口空闲中断(IDLE中断)结合DMA环形缓冲区的方式,接收更稳定。每个串口接收DMA通道配一个环形缓冲,启用IDLE中断,DMA缓存半满或串口空闲时触发中断,在中断里把有效数据拷贝到主程序的协议缓冲区,然后由主循环解析Modbus帧。这种方式对CPU干扰小,在高波特率下也不容易丢字节。
Modbus帧的CRC16校验也必须用查表法或位运算法实现,校验不过的帧直接丢弃,防止错误数据导致继电器误动作。调试通信时我用USB转TTL模块监听Modbus帧内容,先发固定报文用串口助手观察返回格式,再用Modbus Poll工具做主站模拟,最后才接上位机软件,阶段分明,定位问题快得多。
5. 实操调试中的坑与排查实录
5.1 采样值抖动、漂移太大怎么办
我在调样机时遇到最痛苦的问题就是ADC采样值不稳定。电压显示在219V和221V之间随机跳动,这其实是正常的,电网本身就在波动,但如果数值在短时间内跳十几伏甚至几十伏,那就是系统自身的问题。
排查顺序我很有经验。第一步检查电压基准。用万用表实测REF3033的输出,如果发现纹波很高或电压偏低,多半是基准芯片供电有问题,后端一定要加600Ω以上负载电阻,加10μF+0.1μF去耦电容。第二步检查偏置电压。偏置1.65V如果有波动,那ADC采到的所有值都会带偏,而且因为偏置波动频率和信号频率不同,有效值就会乱跳。第三步检查运放供电和输出范围,如果是轨到轨运放,输出接近电源轨时会有削波,动态范围不够,信号越大越失真。第四步查看采样数据波形,可以用串口把原始ADC值发到上位机,画个波形看看是不是标准的正弦波,如果不是就得查前端电路了。
如果是软件问题,检查一下DMA缓冲区有没有覆盖冲突。我原来在ADC DMA中断里直接操作缓冲区,结果主循环也在读同一块数据,两边打架,采到的波形有个别点全是0或者重复值。解决办法是引入双缓冲机制,DMA写一个缓冲区时,主循环读另一个,切换时通过回调函数通知,互不打扰。
5.2 谐波测量偏差大的原因与对策
谐波测量结果和标准仪器对比时,很多人会发现2次、3次谐波数值差很多,或者频谱图上出现了一堆不应该有的小锯齿,这就是典型的频谱泄漏或者窗函数选择不当。
我之前在只有32点每周期的时候踩过这个坑,FFT结果惨不忍睹,基波周围的频点全带着泄漏能量,看起来像是满屏都是谐波。后来把每周期采样点数提高到128点,并用矩形窗加补零,配合过零检测动态调整采样间隔,结果立刻好了很多。但实测下来,更好的办法是加汉宁窗,上电时算好窗函数系数存到常量数组里,对采样数据先加窗再做FFT,泄漏明显减少,测量精度提高了一个层次。
还有一个因素必须检查,AD采样率是否稳定。如果采样率由定时器产生,而定时器分频用到了非整数值,时钟源精度不够,采样间隔就不均匀。STM32F407用内部HSI时精度有1%,实际采样点位置会偏,FFT就会算出虚假谐波。我用的是外部8MHz晶振,经PLL倍频到168MHz,定时器分频后的采样率非常准。
5.3 界面卡顿和死机问题
显示界面卡顿90%是阻塞式设计导致的。如果你在刷屏函数里用delay等待LCD完成传输,期间ADC中断还在触发,就会一直抢中断。解决办法是尽量用SPI的DMA模式刷屏,在启动DMA后立刻把CPU让给主循环。LCD刷新这类不紧急的任务,可以拆到状态机的低优先级分支里执行。
死机问题多数是内存访问越界。FFT的复数数组需要2倍长度,用32位浮点数组时特别要注意内存对齐,STM32F407有FPU,凡是float数据一定要四字节对齐,否则就是硬件异常进入死循环。我一开始用默认的分配方式,莫名死机,打印日志发现确实卡在FFT调用之处,后来分配缓冲区时用__attribute__((aligned(4)))强制对齐,问题就消失了。另外注意堆栈大小,Modbus解析、菜单显示这些函数的调用层级可能比较深,给RTOS任务或裸机主循环的栈空间一定要留足余量,不能刚好卡在临界点。
5.4 脱机校准:没有标准源时怎么调准
做仪表类项目,校准这是躲不过的。如果你手头没有高精度标准源,我提供一个非常实用的土办法:直接用市电电压作为参考基准,用一只精度0.5级以上的数字万用表实测出当前电压值,再和检测仪显示值对比,计算出增益系数,写进EEPROM里。
校准模式的流程是这样的:在菜单里进入校准界面,确认输入电压稳定后,设备连续采样100个周期,求出均值,然后用万用表实测值和设备采样均值计算出比例系数,比如万用表显示220.5V,设备显示214.7V,那系数就是220.5/214.7≈1.0270,保存这个系数到指定地址的EEPROM,下一次上电自动调用。
电流通道校准思路类似,我喜欢用一个已知功率的负载做参照,比如一个100W电炉或白炽灯,220V下额定电流约0.455A,实测电流对比标定。注意做电流校准时负载必须是纯电阻或接近纯阻性,这样功率因数趋近于1,电流计算才相对准确。
EEPROM里我建议存多组校准参数,针对不同量程档位分别标定,以后换互感器或者改硬件前端时不用返厂重标,用户自己就能在菜单里完成二次校准,这个体验在实际项目里特别加分。
5.5 干扰与共模问题:测量数值忽大忽小的隐形杀手
用电设备现场测量时,电压显示数值总在合理范围内摆动,但电流却一直偏高,或者三相的三相电压不平衡度突然变大,这种问题八成不是算法或硬件坏了,而是现场共模干扰串入了采样系统。
我试过在现场配电柜附近调试样机,用了一段1米长的杜邦线连接CT,结果电流数值明显偏大,波形杂乱,傅里叶变换后能看到明显的100Hz干扰分量。后来把CT信号线改成双绞屏蔽线,屏蔽层单端接地接到单片机系统地,问题好转很多。还有一次是电压通道采样线太长,靠近变频器输出电缆,导致采样值一直跳动。这类问题在实验室根本不会碰到,只有在真实现场才会暴露。
所以在设计阶段就要注意采样信号线尽量短,如果不能短那就用屏蔽线,模拟部分和数字部分不要平行走线。地线问题尤其重要,屏蔽层不要两端都接,那样会形成地环路,干扰反而更大,我一般只在采样板这端单点接模拟地。
6. 实测数据与效果评估
样机调试完成后,我专门做了一轮实测对比,用来验证这套设计的测量可信度。
对比对象是一只手持式电能质量分析仪(福禄克同级别),测试条件为市电、纯阻性负载接入,结果如下:
| 测量指标 | 本设计样机 | 商用分析仪 | 误差 |
|---|---|---|---|
| 电压有效值 | 220.3V | 220.6V | 0.14% |
| 频率 | 50.02Hz | 50.01Hz | 0.01Hz |
| 电流有效值 | 1.42A | 1.40A | 1.43% |
| THD(电压) | 2.8% | 2.9% | 0.1% |
| 有功功率 | 312W | 308W | 1.30% |
电压通道精度比较理想,误差在0.2%以内;电流通道因为有CT变比误差和开口式CT的固有精度限制,误差在1.5%左右,属于合理范围。如果对电流精度要求再高一个量级,就得考虑用更高精度的穿心CT或者闭环霍尔,成本相应地也会上来。
谐波测量方面,我用信号发生器注入了5次谐波成分,本设计的检测仪测出的5次谐波含量为9.8%,信号发生器设定值是10%,误差2%左右,这个结果对一般监测场合完全可以接受。
整套系统的功耗也很低,实测运行状态下单片机部分总电流大约90mA左右,大部分功耗被TFT屏幕吃掉了。如果未来做电池供电的便携版本,可以考虑改用墨水屏或者段码LCD,功耗会下降一个数量级。
7. 一点实操心得
项目做下来,我最想提醒后来人的是:电能质量检测仪这类题目,真正拉开差距的地方不在单片机跑算法,而在信号链路和软件架构。信号链路做干净了,单片机算出来的每一个数字都可信;软件架构搭清楚了,加功能、查问题都轻松得多。
最后再分享一个小经验,调试FFT时在串口助手里同时打印原始波形和谐波数据,波形一眼能看出是不是正弦,如果波形畸变但仪器显示的THD却是0%,那多半是采样窗口和数据对齐出了问题,优先检查过零检测和DMA缓冲的逻辑顺序,这个问题我排查了整整一个下午,希望你能绕开我这个坑。