前言
一直以来就在忍受许多芯片应用和调试经验方面无资料可查的困窘。没有用过的抓耳挠腮,用过的人经验烂在肚子里,这辈子能不能再翻出来都另说。受够里这种毫无效率的重复,所以决定从我做起,果断分享实际经验。为的是以一个应用者而非芯片设计者的视角提供一份应用指南。
这款芯片的应用根本原因是电子设计竞赛,最终在很多人的帮助下得到了一等奖,只可惜是省级比赛,自我感觉对于这款芯片也算基本摸清,除了芯片官方手册各种不严谨之外,在性能上不得不承认这是款不错的芯片,国产芯片发展不易,能用国产还是用国产。
概况
ATT7022B是7022A的升级版,7022A是由炬力公司生产,后来转到了上海钜泉,感觉上这两家公司渊源很深,从名字也看的出来,打电话的时候炬力公司的工作人员直接把钜泉的电话给了我,让我感觉整个是一家人。之所以说这个是想说找资料的话还是要到钜泉的网站上去查询。http://www.hitrendtech.com/cn/About.aspx
因为在旧版的7022A的资料中,生产商仍然是炬力,至今钜泉网站上挂出来的资料上仍然没有改变。但7022B资料就改为了钜泉,手册的编写条理完整了许多,所以尽量以7022B手册为准。
ATT7022B使用了几个7022A的NC引脚,也就是说引脚定义不完全一致,所以不可以按照7022A的封装对NC脚做轻率处理。
一、硬件设计
硬件的设计芯片本身没有什么好说,按照典型应用即可。值得一提的是互感器的选择,我们使用的是三相四线三元件测法,即电压电流互感器各3个。不管互感器的变比如何,应当使电压互感器的额定输出为0.5V,电流互感器额定电流下经负载电阻取样后电压应为0.1V。电压互感器的变比一定,没有什么文章可做,手册中建议可以采用更低的输出,并通过芯片的电压通道增益来将电压升至0.5V,可以提高精度。但个人认为只要互感器靠谱直接取到0.5V即可,220/0.5是常用变比,互感器选择较为容易。
而对于电流互感器,它的输出决定于两个因素,一是电流变比,二是负载电阻,最终输入芯片的是负载电阻上的电压。所以在电流互感器变比的选择上有了较大的灵活性。
推荐一个互感器生产商 淄博元星 http://www.yuanxing.net/chinese/company.asp
我们使用的是它的叠片式电压互感器 TV3154 和零磁通电流互感器 TA23B17,测试线性度极佳。
二、软件设计
7022B说简单也简单,说复杂也复杂,重要的是耐着性子拿着手册慢慢去摸清。但官方手册一个很要命的地方就是组织的有点混乱。国外厂商喜欢把一项功能的全部东西都放在一起,非常容易查询,偶尔需要参考其他部分的也有注释指引,但是钜泉的手册就有些让人摸不着头脑,不看上四五遍想找什么东西基本上找不到。
1)模拟SPI通信
ATT7022B工作十分稳定,一旦晶振起振并且几个REF输出电压正常,则基本可以确定芯片已经开始工作。如果读不出数据,就不要想着芯片不工作的可能。
建议一定在正式调试通信协议前核实芯片处于工作状态,需要检测的部分有:
1.芯片供电电压是否正常
2.互感器输出电压电流信号是否接入芯片
3.晶振是否起振
4.SPI接口与单片机接线是否正确
请不要不屑于检查这些东西,用“应该”没错这样的话来搪塞自己,最后如果是因为这些原因调不出来,你冤不冤。
SPI协议调试完成,基本上芯片的应用你就成功了大半,所以要舍得花时间来调试通信。SPI通信最为重要的就是搞清其时钟极性及时钟相位。对于7022B,它的时钟极性为0,即闲置时CLK电平为低。时钟相位指数据的采样时间,7022B为高电平锁存,下降沿取样。搞清楚这两个关键在模拟SPI时或是使用硬件SPI进行寄存器设置时都十分的重要。官方手册给出的读写时序的伪代码是极为可靠的,严格按照手册的伪代码转化为实际的程序,只要不犯低级错误,读写操作一般会是成功的。会有人为省去CS线而直接将CS引脚接地,这样做是否可行有待验证,如果严格按手册的表述,这样做是不可以的。
请注意:
存放所读取数据的变量为保险起见一律初始化为0。7022B的数据格式为24位,我们一般会定义长整型变量以存放数据,在模拟SPI中,存放的方法往往是位操作而不会出现直接的赋值,这样高8位的数据可能不为0(因编译器而异,有些编译器在变量声明时是自动将其赋0的)。我是这个问题的受害者。
只要可以在示波器上看到返回的数据,则证明在时序上SPI已经通过,如果数据错误,则需要检查自己对数据的处理。
调试通信中的示波器使用
很久以来发现一个悲哀的现实,那就是示波器在我们大多数人手里只有一个键是有用的,那就是'AUTOSET'.曾有人告诉我某单位面试题目就是使用示波器,凡是一上来auto的全部被踢。我只能说这面试官实在聪明加英明。可以说Auto在实际调试中几乎无法起到任何实质作用。请一定记得在我们的面板上有一个叫做Trigmenu的按键(泰克的一般都是这样,但是如果某位大牛用的是LeCroy或是Angilent,可能不一样,抱歉。不过估计这样的人也不会屑于看我在这扯淡)。按下它,你可以选择你想要的触发方式,当你选择正常触发,上升沿触发,并通过level旋钮调节合适的触发电平之后,你会发现原来你可以在示波器上读出你的通信数据而它是如此的稳定,不会乱跳。详细的操作大家自己研究下,示波器这样的关键性工具值得我们为它花些时间。
2)初始化设置
这一部分只讲要使芯片正常工作的设置,校表的步骤将在下文详述。
首先强调,设置操作属于写寄存器操作,地址最高位需要取1。例如你写一个0x3F寄存器,你写入芯片地址时要写的就是0xBF。
最重要的设置即是HFconst设置。对于这个寄存器的理解可以借助于其值的计算公式来理解。HFconst=INT[576000000*G*G*Vi*Vu/(Un*Ib*N)]
其中,G为芯片的增益,Vi为电流输入端口的输入电压(额定电流下),Vu为电压输入端口的输入电压(额定电压下),Un为额定电压,Ib为额定电流。
显然,当抛开取整,系数的运算来分析,分子是芯片输入的采样电压值,分母则是这些采样值对应得实际值。很明显,这个寄存器之所以重要就是在于它建立了芯片取样与实际值之间的联系,也就是说,如果不能正确设定这个寄存器,你所得到的电能量就不是实际的电量。而系数N则是脉冲系数,其实我更愿意称之为分辨率。它将1KWh划分为N等分,而这1/N KWh就是电能计量的最小计量值。推荐值为3200。
其次电压通道ADC增益选择,如果你的电压互感器输出选用了比220/0.5V更大的变比以获得更高的准确级,则可以使用ADC增益选择将电压处理到0.5V。只是这个增益寄存器只能将电压扩大2,4,8,16倍,这一点需要注意。
其他参数如启动电流,失压阈值等建议采用默认值,无需设置。
基波测量等功能我没有使用,在此不敢妄谈。
3)参数读取
首先要注意的是电能的读取。建议使用读后清零寄存器,累加模式的寄存器需要判断溢出情况,这无疑会降低读取速度,而且掉电保护等方面反而不方便。读后清零寄存器读出后直接累加,这样免去了寄存器溢出的担心,毕竟判断寄存器的溢出要比判断变量的溢出麻烦。另外注意读后清零寄存器读取后累加寄存器同样会被清零。
电能读取的是一个计数值,计量的是1/N KWh 的整数倍。这在HFconst设置中已经提到。需要注意的是,为了转换为实际的以KWh为单位的值,需要除以3200。注意不要想当然的取出数据除以3200然后累加到自己定义的电能变量里。因为这样做其实一直在加0。道理很简单,取样的周期一般比较短,取出的读后清零寄存器的值不大,一旦除以3200,必然只剩下0。正确的做法是将原始数据累加,然后处理出实际值用以显示,而原始值始终在累加。当然记得防溢出。这是我曾经犯的错误。
对其他的数据不再一一介绍,现将要点总结如下:
1.避免浮点运算。我们在用单片机,让它算浮点太残忍了。如果需要显示2位小数,把原数据乘以100,用整型运算,则剩下的位数就会被舍去。显示的时候我们自己心里有数,在相应的位置显示小数点即可。四舍五入的玩法是比如data除以x,要四舍五入则如下处理:result=(data+data/2)/x
IMPORTANT:
2.注意可正可负的数据处理。正数好说,补码即原码。而负数求原码,只需判断正负,如果为负则取反加1,或者如手册2^24-data。但是注意功率因数,如果在功率因素为1时显示原始数据,发现它在0x7FFFFF和0x800000之间跳变。如果严格按照补码运算,这是在8388607(处理后是0.9999)与-8388608(处理后是-1)之间跳变。这显然不可能。所以推断这是芯片设计的bug,即功率因数这项参数0x800000是正数最大值而非负数。
这个实在是太坑人,让我一度怀疑自己的数据处理是否正确,借助于示波器发现数据显示的就是芯片所传的数据太终于放心。对于其他的寄存器是否存在同样的bug,我不太清楚,因为其他寄存器基本没有到达到0x800000的可能。希望有机会验证的人探究一下,是否所有的寄存器都错了。
3)电压寄存器校准后读取的即是真实值,而电流输入为额定的时候电流值接近60A,需要除以一个系数转化为真实值。
4)校表
大多数人在纠结校表的时候没有校表台。其实用自耦变压器调一下电压,带个电饭锅之类的负载测下电流完全可以校。但是得益于我们是电气学院,不至于寒碜到找不到三相交流源。我们使用的是继电保护测试仪,所有的电参数只要在上位机改一下即可,而且频率,相位基本是随便调,大大提高了校表的效率。
而有人也认为电能不好校,其实电能是功率的积分值,只要校准了功率电能就是准确的。
功率校正最好有专门的功率表,我们用山东省计量科学院的一台标准表(这时候我才不得不感叹果然是电气学院,怎么啥都有)进行的功率校准,效果极佳。
所有有些人看手册喜欢忽略一些逻辑的框图什么的,这是极为不好的习惯。因为图是为了说明文字难以表述的问题,而当这个问题值得用个图来说明,就一定有重要的信息。(题外话)。那么如果看清楚了7022A手册中的数字信号处理框图,则可以大体确定校表的顺序。
即 电压
--- 有功功率----相位校正
电流
基本上校准这几项即可获得极高的精度。前三项需要三相分别校正。电流的校准目标位额定60A,然后除以比例系数。手册上在流程中将电压电流校正放在了最后,不知是和用意,我用这个顺序校正得到了极高的精度。基本无需分段校正,即将同一项目写相同值即可。值得一提的是相位校正,可能如果不像我们有这种方便的三相交流源很难得到功率因素0.5的条件,但是要强调的是相位校正可以很好的改善在功率因数不为1是功率测量的准确度。
无功功率无需校准也没有寄存器。因为无功功率不参与计费,没有必要太准也很难测得太准,基本0.5级的电表无功测量精度只有2级。
对于寄存器写入值的计算需要严格参照手册。
另外我在校表时犯了一个理解性的错误。手册中讲校表必须在各校表寄存器为0的情况下进行。我误解为寄存器必须是0,特意进行了清寄存器操作,其实完全没有必要,这句话针对校表过程,寄存器里有值显然是不能获得正确的校表信息。
5)其他功能
只用到了相序检测,电压检测可以随时检测。按照手册要求电流相序检测随测随开,测完即关。
应用总结及不足
ATT7022B是应用较广的电能测量芯片,具有较佳的性能,结合较好的校表仪器可以实现极高精度的三相电参数测量。但比赛时间较紧,一周左右的世界,许多功能没能进一步挖掘,现将应用不足总结如下:
1.没有很好的应用其基波和谐波测量的功能。由于非线性负载的存在,对电网产生了较大的谐波无染,然而传统的电能表往往将负载发出的负序谐波电能从总电能中减掉,造成无污染电网者反而被少计费,而线性负载用户一方面要承担谐波对电器带来的损害还要为吸收的谐波电能买单,造成计费的不合理。如今谐波与基波计量功能在电子电能表中广泛应用,但本方案没能够将此功能应用起来。
2.虽然实现了计费功能却由于比赛期间信息不畅没能够把握国家阶梯电价政策趋势,没有在方案中应用。
3.电表的精确度可以进一步提升,因为电流互感器精度可达0.02级,而电压互感器也有0.2级。
个人水平所限,难免有错漏之处,望交流指正。
*博客内容为网友个人发布,仅代表博主个人观点,如有侵权请联系工作人员删除。