7、每个A/D转换结束(每个瞬态电流和电压的采样周期)后,CRDY位都将被置位,同时若CRDY位未被屏蔽(在屏蔽寄存器中),INT引脚将有效。
8、CRDY被置位表示新的24位瞬态电压和电流采样值已获得,并且他们相乘获得了相应的24位瞬时功率值。
9、DRDY被置位表示一次计算周期结束,即完成了一次Vrms、Irms和电能的计算和更新。
如果屏蔽寄存器的DRDY位没有被屏蔽,则INT引脚有效。
10、CRCY在每次A/D转换后置位,DRDY在每次计算周期结束后置位,置位后必须子下次置位之前对其清零,以使其能够在INT引脚上发新的中断事件。
11、如果周期计数寄存器N=1,则所有的输出计算都是瞬态值,当瞬态计算完成后DRDY将有效。
若需要RMS,则周期计数寄存器的设置值必须大于10。
计算周期频率由主时钟确定,其值为(MCLK/k)/(1024*N)。
缺省条件下XIN=4.096MHZ,K=1/*K[0:
3]在配置寄存器里*,K是时钟分频系数/,则电流、电压和功率的瞬态A/D转换速率为4000Sps,因为N默认是4000,所以RMS和电能计算速率是1Sps(即每秒计算一次有效电流、有效电压和有功功率!
)。
12、单计算周期C=0/*在启动转换命令寄存器里C代表Conversion的意识*/即执行完一个计算周期后DRDY位被置位。
然后读取数据完毕后,串行接口返回到命令模式以等待新的命令被发出。
13、连续计算周期C=1。
芯片将保持在激活状态下。
连续的计算周期在电压和电流通道重复进行(每N次转换进行一次)。
注意用户不能在单个通道上启动/中止计算周期。
每个计算周期结束后,DRDY位被置位。
读取一个寄存器需要32个SCLK时钟信号,前8个SCLK时钟信号用于确定被读寄存器地址(即我们常说的写命令),后24个SCLK时钟信号用来读出计算结果。
在这种模式下,thedesigner/programmermaychoosetoacquire(read)onlythosecalculationsrequiredfortheirparticularapplication,asDRDYrepeatedlyindicatestheavailabilityofnewdata.NoteagainthattheMCUfirmwaremustresettheDRDYbitto“0”beforeitcanbeassertedagain.
14、用户写命令启动转换后且C=1时,芯片将保持在激活状态下。
一旦进入”连续计算周期”数据采集模式,CS5460A将连续在电压/电流通道进行A/D转换及后续计算,直到:
a)从串口接到”上电/暂停”命令;b)芯片掉电;c)用户确认配置寄存器中的RS位置1(Startachipresetcyclewhenset1.Theresetcyclelastsforlessthan10XINcycles.Thebitisautomaticallyreturnedto0bytheresetcycle)。
d)硬件复位。
/*Chapter2*/--SerialPort
1、记住所有寄存器都是24位的。
命令不是24位的命令是8位的!
所有的寄存器都是可读写
2、上图是读写命令寄存器。
W/R位:
0à读寄存器操作;1à写寄存器操作;
RA[4:
0]:
24位寄存器的地址位。
详细见datasheet!
3、串行接口:
1>CS(有个上划线,word不知道怎么表达,所以省去了):
片选,低电平有效;CS=1时,SDI、SDO、SCLK输出将保持高阻抗。
2>SDI:
串行数据输入脚(数据写进5460);
3>SDO:
串行数据输出脚(数据从5460出来让你从单片机中读);
4>SCLK:
串行时钟输入脚,控制数据移出或移入。
每个上升沿就将一个数据位进行读出或写入,即每个数据位操作都伴随一个时钟脉冲。
4、串口读/写:
下图为时序图。
注意高位在前,先把高位送出去或读进来,即左移数据。
RegisterWrite
Whenacommandinvolvesawriteoperation,theserialportwillcontinuetoclockinthedatabits(MSBfirst)ontheSDIpinforthenext24SCLKcycles.Commandwordsinstructingaregisterwritemustbefollowedby24bitsofdata(这24比特跟随这24个时钟脉冲走).
RegisterRead
当启动了读命令,串口将在下面8个、16个或24个SCLK周期启动SDO脚上的寄存器内容的转移(从高位开始)。
寄存器读指令可以终止在8位的边界上(如,读出时可只读8、16或24位)。
同样,数据寄存器读出允许采用“命令链”。
因此,读寄存器时,MCU可同时发送新指令,新指令将被立即执行,并可能终止读操作。
例如,命令字写入后用来读取某一输出寄存器的值,进行了16个连续的读数据+串行时钟脉冲后,执行写命令字(如状态寄存器清零命令),数据从SDI引脚输入,同时剩下的8位读出数据被传送到SDO引脚。
又如,用户仅需从读操作中获取16位有效位时,可在SDO读出8位数据后从SDI输入第二个读命令(一般不需要这样,直接读出24位数据,中途无需在写入命令,这样操作有点复杂,除非你是高手。
我们一般都是读出24位数据,中途没写入其他命令。
)。
在读周期,当从SDO引脚输出数据时,必须用SYNC0(NOP)使SDI引脚处于选通状态。
(ENGLISH)Whenareadcommandisinitiated,theserialportwillstarttransferringregistercontentbits(MSBfirst)ontheSDOpinforthenext8,16,or24SCLKcycles.Duringthereadcycle,theSYNC0command(NOP)shouldbestrobedontheSDIportwhileclockingthedatafromtheSDOport.
5、串口初始化:
串口与SCK不同步是有可能的。
一旦发生这种情况,任何输入5460的有效都有可能产生奇异的动作。
因此初始化是任何写和读的前提!
因此需要初始化串口:
1>5460上电(若已上电,recyclethepower)
2>硬件复位
3>向串口发初始化序列,3个SYNC1(0xFF)或更多,紧随着一个SYN0(0xFE)
6、5460上电后进入有效状态(不在睡眠状态或等待状态中)。
下列操作哦可保证5460工作在有效状态:
1>5460上电(若已上电,recyclethepower)
2>硬件复位
3>软件复位
当芯片工作在睡眠状态或等待状态时,将其唤醒的指令(上电/暂停)同样可使芯片进入有效状态。
但需要注意的是用户必须确保串口已经初始化过,否则先对串口初始化然后才能写上电/暂停命令。
7、5460可以由2.5~20MHZ范围的时钟驱动。
用户应适当设置分频比K,以确保MCLK/K处于2.5~5MHZ.TheKdividervalueissetwiththeK[3:
0]bitsintheConfigurationRegister
/*Chapter3*/--Calibration
1、对于电压和电流通道,都有AC和DC校准。
不管哪种校准都有两种模式:
系统偏移量校准和系统增益校准。
Duringthecalibrationsequences,properinputcalibrationsignalstothe“+”and“-“pinsofthevoltage-/current-channelinputsmustbesupplied.Theseinputcalibrationsignalsrepresentfull-scalelevels(forgaincalibrations)andgroundinputlevels(foroffsetcalibration).其中AC和DC校准不同。
2、5460有一系列的校准寄存器,当某一校准命令执行后相应的寄存器会保留校准产生的修正值,用户可以读取这些校准寄存器,并将其保存到外部非易失性存储器(如EEPROM)里,在系统重新上电启动时,可以从NV里读取存入的值并写入相应的校准寄存器,不必重新执行校准。
3、总共六个校准寄存器:
1>DC直流电压偏置寄存器(0xD1)
2>DC直流电流偏置寄存器(0xC9)
3>电压增益寄存器(--)
4>电流增益寄存器(--)
5>AC交流电压偏置寄存器(0xD5)
6>AC交流电流偏置寄存器(0xDD)
4、AC偏移量寄存器用于存储进行加法运算的校正值。
由DataFlow图可以看出,直流偏移量的值在信号通道的更前端就加入电压/电流信号,因此DC偏移量寄存器的值将影响5460的所有结果。
对于交流偏移量校正则并非如此。
AC偏移量寄存器的值只影响电压有效值和电流有效值的计算结果。
5、AC和DC的增益校准寄存器是一个!
因次用户在校准前就必须决定是执行AC增益校准还是DC增益校准。
因此AC和DC增益校准只能取其一。
6、由于电压和电流通道具有各自的偏移量和增益寄存器,系统偏移量和系统增益校准可分别进行,互不影响。
校准命令
7、校准顺序
1>在校准之前,必须使得5460处于活动状态,同时使其准备接收有效命令并清除DRDY位;
2>将合适的校准信号加到电压电流通道的输入端。
一般来说,在执行偏置校准时,应加入零信号,在执行增益校准时应加入设定的满度信号;
3>写校准控制命令字;
4>检查状态寄存器的DRDY位,直到置1后才读相应的校准寄存器,并将其保存在NV里以防日后再用。
注意:
当用户发送校准命令到5460时,5460不能处于A/D转换状态,加入在转换状态,用户必须发送一个Powe_halt/*在上电/暂停命令寄存器里*/t命令以终止A/D转换,之后才能发送校准命令,一下举例一个完整的交流校准过程,其直流校准过程与之雷同
步骤1、输入电压电流为零,电路连接图如下图:
步骤2、清除DRDY位,发送Power_Halt命令:
VoidClear_DRDY()
{
unsignedcharbuf[4];
buf[0]=0x5e;
Buf[0]=0xff;
Buf[0]=0xff;
Buf[0]=0xff;
Write_CS5460A(buf,4);//写状态寄存器
}
voidwait_DRDY_High()
{
unsignedcharbuf[4];
while
(1)
{
Read_CS5460A(buf,0x1e);
If(buf[3]&0x80)break;
}
}
Clear_DRDY();
buf[0]=0xa0;
Write_CS5460A(buf,1);//发送power_halt命令
步骤3、交流电流偏置校准:
Clear_DRDY();
buf[0]=0xcd;
Write_CS5460A(buf,1);//写校准命令寄存器
Wait_DRDY_HIGH();//等待校准完成
Read_CS5460A(buf,0x20);//读校准寄存器的值
Write_AT24C01(buf,addr,len);//将值存入NV中
步骤4、交流电压偏置校准:
Clear_DRDY();
buf[0]=0xd5;
Write_CS5460A(buf,1);//写校准命令
Wait_DRDY_HIGH();//等待校准完成
步骤5、使输入电压电流为满量程。
假如设置的满度电压为220V,满度电流为12A,则在电压输入端加入AC220V电压信号,在电流输入端加入AC-12A电流信号。
接线图如下:
步骤6、交流电流增益校准:
Clear_DRDY();
buf[0]=0xce;
Write_CS5460A(buf,1);
Wait_DRDY_HIGH();
步骤7、交流电压增益校准
Clear_DRDY();
buf[0]=0xd6;
Write_CS5460A(buf,1);
Wait_DRDY_HIGH();
/*交流校准完成*/
以下为各种校准的总结:
//AC-OFFCalibration
1>AC电流偏移校准时将IIN±接地,AC电压偏移校准时将VIN±接地。
2>发0xA0命令(停止计算,中止A/D转换)
3>把电压通道与电流AC偏移寄存器值写为默认值:
0x000000
4>发0xDD命令(电压/电流通道AC偏移校准命令)
5>发0x1E命令,读状态寄存器DRDY位直到为1,置位后表示校准已完成,不为1则等待。
或者不读DRDY位直接等待8秒
6>校准完成,发0x22命令,去读电压通道AC偏移寄存器值并存储到NV中;发0x20,读取电流通道AC偏移值,并把值存入NV中
//AC-GainCalibration
1>在指定电压范围内输入交流信号到芯片的VIN±、IIN±。
如:
电压通道最大输入电压为±250mv,是176mv(RMS),为使电压变大时不超出此值,则输入交流信号一般取110mv(RMS);电流通道亦然。
2>发0xA0命令(停在计算,中止A/D转换)
3>把电压通道与电流通道AC增益寄存器值写为默认值:
0x000000
4>发0x1E命令,读状态寄存器DRDY位直到为1,置位后表示校准已完成,不为1则等待。
或者不读DRDY位直接等待8秒
5>校准完成后,(这时Vrms和Irms寄存器值近似等于0x999999,即0.6),发0x08命令,去读取电压通道AC增益寄存器值并存储在NV中;发0x04命令,去读取电流通道AC增益寄存器值并把它存到NV中
注意:
偏移量校准中,交直流校准信号是一样的,只是将电压/电流通道的正负引脚接地。
使用时不应同时进行偏移量和增益校准,否则会引起不符合要求的计算结果。
Ifbothgainandoffsetcalibrationarerequired,istorunoffsetcalibrationbeforegaincalibration;andifbothACandDCoffsetcalibrationarerequired,DCoffsetshouldbecalibratedfirst.
交流电压增益校准算法的出发点是调整电压通道增益寄存器的值,意识的对应输入端校准参考信号电平的电压有效值寄存器的值为0.6。
校准信号加在通道的正负引脚上,电平由用户决定。
在交流电压增益校准时,电压有效值寄存器的值被调整成0.6,存放于电压通道增益寄存器。
看懂下图差不多就明白了:
换算关系的建立:
(对上图的解释)
解释:
第一个是未校准AC电压增益的情况,电压增益默认的是1.0(0.999……):
250mV满度对应的是1.0,输入是电平是230mv的幅值,对应的瞬态电压寄存器的值是230/250=0.92,有效电压的还得除以一个根号2即0.92除以根号2后是0.65054,这个值将保存在电压有效值寄存器中。
。
同理,反过来。
你可以通过读取有效值寄存器的值来算出最后测量的实际电压。
。
。
。
第二个是经过校准后的AC电压增益,目的是使得电压有效寄存器的值为0.6(这样做是为了适应更大电压范围,预防数值超量程?
),{但这个0.6到底要不要写进有效值寄存器中呢?
,5460在校准的时候没有自动写进有效值寄存器中}0.6乘以根号2就是电压瞬时值寄存器里的值了即0.84853,然后由于输入的是230mv,满度是250mv,所以增益值就可以算出了即0.92231。
这个时候把0.9223存入电压增益寄存器中。
。
这样就可以建立起换算关系了。
校准所需要时间:
周期计数寄存器的N确定了在给定校准过程内的A/D转换数。
对于直流偏移量/增益校准,校准过程至少需要N+30个转换周期完成。
对于交流偏移量/增益校准,校准过程至少需要6N+30个A/D转换周期完成(约6个计算周期)。
增加N可提高校准结果的精度。
最终换算关系总结:
1>互感器的作用就是将电流和电压转换成交流电压使得IIN和VIN在最大250mv(5460最大可以测得的数据)以下。
所以互感器的匝比是不需要在计算中体现的。
2>假设您的电路上流过的最大电流是10A(这就是所谓的最大满度负载),然后写校准命令后,5460电流有效值寄存器的值应该是0.6(0x99,0x99,0x99如果是0x99,0x[][],0x[][]也就差不多了)左右。
这个值可以用来检查是否校准好。
同时公式也就建立起来了:
10AX1=0.6X2
其中X2是在接X1负载时5460测的有效值寄存器的值,这个时候X1就可以求出来了X1=(10*X2)/0.6,这是程序代码里需要写进的等式。
3>电压校准也如上述一样,假设您的满度负载是220V交流电。
写校准命令后220V对应的5460电压有效值寄存器的值应该是0.6,然后等式:
220VX1=0.6X2
X1=(220*X2)/0.6
FAQ
1、如果在CRDY位置位后我不做清零操作,后果将会如何?
两种情况:
第一是5460继续它的A/D转操作,继续瞬态电压、瞬态电流和瞬态功率的更新(C=1连续计算周期),情况是如果不需要INT操作的话。
第二是5460停下来不做任何采样了……
2、如果在DRDY位置位后我不做清零操作,后果将会如何?
两种情况:
第一是5460继续它的周期计算,即继续它的Irms、Vrms和有功功率计算和更新(C=1连续计算周期),情况是如果不需要INT操作的话。
第二是5460停下来不做任何采样了除非清零……
答:
不清除DRDY位和CRDY位5460可以继续采集数据,如果你不需要中断的话这样可以。
3、我不校准将会怎样?
答(官方):
5460并非必须要校准。
当系统上电并复位后,芯片就可以工作了,此时成为“激活态”。
在收到“启动转换”命令时,芯片可在不校准的情况下进行测量,但其输出值受到校准寄存器的影响。
若不进行校准,寄存器内的值为缺省值(增益=1.0,DC偏移量=0.0,AC偏移量=0)。
尽管不进行偏移量和增益校准芯片也能工作,但不保证读书准确度在0.1%的范围内。
4、如果我不接负载的话,它是否会采集数据呢?
答:
会。
。
。
5、校准完成后是否会自动将HALT模式转换为启动模式?
答:
不会,要发送0xE8来启动A/D转换。
6、如何判断校准效果?
答:
1>电压通道:
加额定电压(即满量程最大电压如310V),上位机发送读取电压有效值命令给MCU,MCU再发送0x18给5460读取电压有效值寄存器的值,判断该值是否是0.6,即对应的5460寄存器值为0x99,0x99,0x99,若电压通道校准不好,则读出的电压有效值偏离0.6较大。
注意:
读出5460电压有效值寄存器的值,转化成浮点值Vrms,在转化成实际的电压值u:
u=(Un*Vrms)/0.6其中:
Un为电压量程(比如220V)
2>加标定电流(已知的),上位机发送读取电流有效值命令给MCU,MCU收到此
命令后,发送0x16给5460来读取电流有效值,判断是否是0.6左右,即对应
的5460寄存器值为0x99,0x99,0x99,(最少也要保持0x9[],0x[][],0x[][])如偏
离较大需重新校准。
然后