嵌入式开发_电能计量芯片HLW8110与HLW8112
1 芯片简介
HLW8110/HLW8112 是一款高精度的电能计量IC,它采用CMOS 制造工艺,主要用于单相应用。它能够测量线电压和电流,并能计算有功功率,视在功率和功率因素。
HLW8110与HLW8112都有1路电压检测通道。
支持3.3V/5V
HLW8110
HLW8110有1路电流通道。UART接口进行数据通讯。
HLW8112
HLW8112有2路电流通道,多出的一路电流通道常用来检测漏电流。支持UART和SPI接口进行数据通讯。
2 项目说明
这个项目应客户要求,使用STC89C52RC单片机,驱动LCD1602显示数据,再通过485发送测量结果。
电路设计
高低压电路之间做了隔离,485和控制部分也做了隔离。由于是客户定制项目,所以电路图就不放出来了。基本上是参照合力为的参考电路做的。485部分可以参照我的USB转串口电路。
由于需要485通讯占用串口,所以选用HLW8112进行SPI通讯,SPI口单独做了引出,以方便调试。
由于是用的89C52单片机,资源极其有限,只有一个串口,下载又必须占用串口,数据通讯也要用串口,就只能分时使用。放一个拨动开关开切换工作状态。
吐槽一下
1602的驱动,和SPI接口,都用的是IO口模拟时序的方式,最头疼的是这个MCU资源太少了,FLASH才8K,稍微不小心就超容量了。
还有调试过程,Keil C51这个开发环境,举个例子,4个字节组合成一个32位的long,
val = w<<24 | x<<16 | y<<8 | z;
组完了以后,低16位正常,高16位不对,你要说他是8位机,必须用以下的方式吧,但上面的写法组16位int又是正确的
val = (u32)w<<24 | (u32)x<<16 | (u32)y<<8 | (u32)z;
编译器还有一个出错,具体是啥情况我忘了,反正就是各种不好用。
避坑
之前做信号处理时,都是芯片直接到MCU,这次是过了隔离芯片才到的MCU,所以有一个信号延迟的问题,开始没有注意,耽误了一些时间,发出来让大家避个坑。
如下图:
从上到下依次是MOSI,MISO,CLK,CS,读出来的数据是0x8502,实际应该是0x0A04,其实这时数据已经对了,只是由于HLW8112与MCU之间过了一个隔离用的π141U31,它支持的速度是150K,而SPI时钟频率仅为20K,理论上是没问题的。
但是就因为隔离芯片的延迟,导致数据错位了。
取下隔离芯片,直接将输入输出短路,波形和解码均正常。
最后在逻辑分析仪上调整了一下,将时钟的有效改为下降沿,也就是延迟半个时钟周期再做协议分析,结果就正常了。如下图:
软件处理,由于是IO口模拟SPI时序,所以很容易的做一个延时采样,发送完上升沿之后,再延时一段时间(好像是100us),再做数据采样,就行了。