搜索
bottom↓
回复: 43

ATT7022E只接B相,电压电流读取正确,有功读取不正确,求助

[复制链接]

出155入0汤圆

发表于 2014-7-10 11:37:11 | 显示全部楼层 |阅读模式
本帖最后由 yijingkun 于 2014-7-11 11:11 编辑

问题已经解决,谢谢楼下各位帮助


三相只接了B相,电压直接接的交流220V,电流串接一个50欧的陶瓷功率电阻,应该是纯阻性的负载,目前读出电压值、电流值都比较接近(实测电压差几伏,电流差不到1A),但是有功功率至少应该是1000多W,可我读到的是34W还是负值,不知道哪里的问题,是不是校表程序有问题呢?求助。电压互感器是电流型的,2mA/2mA,电流互感器额定输入5A,输出2.5mA,电流实测接功率电阻后4.15A,互感器输出2.08mA。

功率校准和HFconst有关系吗,我写不同的HFCONST值,读到的有功都是-34W,有功功率是否只是和电压电流、相位角有关系?


  1. /*校表函数*/
  2. void ATT_Adjust(void)
  3. {
  4.         u32 read1=0x55;

  5.         SPI_ATT_Write(0xC3, 0x000000);                //清校表数据
  6.         SPI_ATT_Write(0xC9, 0x00005A);                //打开校准数据写

  7.         SPI_ATT_Write(0x01, 0xB9FE);                //填写模式配置寄存器
  8.         SPI_ATT_Write(0x03, 0xF804);                //填写EMU单元配置寄存器
  9.         SPI_ATT_Write(0x31, 0x3437);                //填写模拟模块使能寄存器
  10.         SPI_ATT_Write(0x02, 0x0000);                //各路ADC增益均为1

  11.         SPI_ATT_Write(0x6D, 0xFF00);                //
  12.         SPI_ATT_Write(0x6E, 0x0DB8);                //
  13.         SPI_ATT_Write(0x6F, 0xD1DA);                //

  14.         SPI_ATT_Write(UADC, 0x000000);                //电压通道增益为1
  15. //        SPI_ATT_Write(HFconst, 0x00016D);        //高频输出参数为1511
  16. ///*----------------------------------------
  17. //    分相电压电流校准参数
  18. //-----------------------------------------*/
  19. //        SPI_ATT_Write(UgainA, 0x000000);
  20. //        SPI_ATT_Write(UgainB, 0x000000);
  21. //        SPI_ATT_Write(UgainC, 0x8172F5);        //8483573

  22.         SPI_ATT_Write(0xC9, 0x000001);                //关闭校准数据写

  23.         SPI_ATT_Write(0xC6, 0x00005A);                //校表数据读出使能
  24.         read1=SPI_ATT_Read(0x00);
  25.         printf("\r\nIn 0xC6 with 0x5A: 0x00 is %x !\r\n",read1);
  26.         read1=0x55;

  27.         read1=SPI_ATT_Read(0x01);
  28.         printf("\r\nModeCfg is %x !\r\n",read1);
  29.         read1=0x55;

  30.         read1=SPI_ATT_Read(0x03);
  31.         printf("\r\nEMUCfg is %x !\r\n",read1);
  32.         read1=0x55;

  33.         read1=SPI_ATT_Read(0x31);
  34.         printf("\r\nModuleCfg is %x !\r\n",read1);
  35.         read1=0x55;

  36.         SPI_ATT_Write(0xC6, 0x000001);                //计量数据读出使能
  37.         read1=SPI_ATT_Read(0x00);
  38.         printf("\r\nIn 0xC6 without 0x5A: 0x00 is %x !\r\n",read1);
  39. }

  40. /*试验函数(为了避免main中太多代码而设)*/
  41. void ATT_Test(void)
  42. {
  43.         u32 read=0x55;

  44.         read=SPI_ATT_Read(0x00);
  45.         printf("\r\nDevice ID is %x !\r\n",read);
  46.         read=0x55;

  47. //         printf("\r\nReading A...\r\n");
  48. //         Read_ATT_AData();

  49.         printf("\r\nReading B...\r\n");
  50.         Read_ATT_BData();

  51. //         printf("\r\nReading C...\r\n");
  52. //         Read_ATT_CData();

  53. //         printf("\r\nReading T...\r\n");
  54. //         Read_ATT_TData();
  55. }
复制代码


  1. /*读B相结果函数*/
  2. void Read_ATT_BData(void)
  3. {
  4.         BDataTypeDef.P=SPI_ATT_Read(r_Pb);
  5.         BDataTypeDef.Q=SPI_ATT_Read(r_Qb);
  6.         BDataTypeDef.S=SPI_ATT_Read(r_Sb);
  7.         BDataTypeDef.URms=SPI_ATT_Read(r_UbRms);
  8.         BDataTypeDef.IRms=SPI_ATT_Read(r_IbRms);
  9.         BDataTypeDef.Pf=SPI_ATT_Read(r_Pfb);
  10.         if(BDataTypeDef.P>0x800000){
  11.                 BDataTypeDef.Rp=0x1000000-BDataTypeDef.P;
  12.                 BDataTypeDef.Rp=-(BDataTypeDef.Rp/256.0);    //   2^15/2^23
  13.         }
  14.         else
  15.                 BDataTypeDef.Rp=BDataTypeDef.P/256.0;
  16.         if(BDataTypeDef.Q>0x800000){
  17.                 BDataTypeDef.Rq=0x1000000-BDataTypeDef.Q;
  18.                 BDataTypeDef.Rq=-(BDataTypeDef.Rq/256.0);
  19.         }
  20.         else
  21.                 BDataTypeDef.Rq=BDataTypeDef.Q/256.0;
  22.         BDataTypeDef.Rs=BDataTypeDef.S/256.0;
  23.         BDataTypeDef.Rurms=BDataTypeDef.URms/8192.0;   //   2^10/2^23
  24.         BDataTypeDef.Rirms=BDataTypeDef.IRms/8192.0;
  25.         if(BDataTypeDef.Pf>0x800000){
  26.                 BDataTypeDef.Rpf=0x1000000-BDataTypeDef.Pf;
  27.                 BDataTypeDef.Rpf=-(BDataTypeDef.Rpf/8388608.0);
  28.         }
  29.         else
  30.                 BDataTypeDef.Rpf=BDataTypeDef.Pf/8388608.0;

  31.         Lcd_Clr();
  32.         sprintf(disp0,"B phase:");
  33.         Lcd_Puts(7,0,disp0);
  34.         Output_ATT(BDataTypeDef);
  35. }
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出155入0汤圆

 楼主| 发表于 2014-7-10 12:40:50 | 显示全部楼层
自己顶一下,勿沉

出0入0汤圆

发表于 2014-7-10 13:01:54 | 显示全部楼层
不知道什么原因,随便说一下!
会不会设置为三相三线模式了?

出155入0汤圆

 楼主| 发表于 2014-7-10 13:03:39 | 显示全部楼层
abbott 发表于 2014-7-10 13:01
不知道什么原因,随便说一下!
会不会设置为三相三线模式了?

没有,SEL管脚我已经接高了。不过多谢回复。

出0入0汤圆

发表于 2014-7-10 13:13:58 | 显示全部楼层
yijingkun 发表于 2014-7-10 13:03
没有,SEL管脚我已经接高了。不过多谢回复。

寄存器中是否也有相关设置?
功率因数也看一下,会不会功率因数导致不正确?

出155入0汤圆

 楼主| 发表于 2014-7-10 13:27:52 | 显示全部楼层
abbott 发表于 2014-7-10 13:13
寄存器中是否也有相关设置?
功率因数也看一下,会不会功率因数导致不正确? ...

我再仔细看看手册,不过我校表程序中没有写功率因数相关的寄存器啊。

出155入0汤圆

 楼主| 发表于 2014-7-10 13:31:48 | 显示全部楼层
有功功率读数是 ffddfa,手册上说是补码,怎么会是负值啊,读出数来到底怎么计算啊,我没用标准功率源和标准表,HFconst和EC到底怎么确定啊

出155入0汤圆

 楼主| 发表于 2014-7-10 13:43:43 | 显示全部楼层
给上海焗泉打电话,让把电流反接,现在读到的数是0x2130,但是怎么计算出正确有功功率值啊

出155入0汤圆

 楼主| 发表于 2014-7-10 14:28:45 | 显示全部楼层
顶,勿沉

出0入0汤圆

发表于 2014-7-10 14:36:40 | 显示全部楼层
楼主是刚开始做电力行业产品吗?
功率为负,首先想到的就是电流接反了。

出155入0汤圆

 楼主| 发表于 2014-7-10 15:09:53 | 显示全部楼层
本帖最后由 yijingkun 于 2014-7-10 15:12 编辑

对,以前没干电力行业,现在功率是正的了,读数是0x2130,我搞不懂怎么换算成实际的功率值,HFconst、EC怎么确定,我又没用到功率源、标准表,手册上说HFconst是高频脉冲常数,这个我理解和脉冲输出有关系的,和有功功率采集应该没关系啊,EC手册上有的地方说是脉冲常数,有的地方又说是电表常数,有点儿晕。

出0入0汤圆

发表于 2014-7-10 15:23:35 | 显示全部楼层
电表常数就是脉冲常数。
先定义好HFconst吧,不然出来的值不对。
要显示正确,必须进行校正。

出0入0汤圆

发表于 2014-7-10 15:28:15 | 显示全部楼层
ATT7022E/26E/28E功率寄存器采用补码形式给出,最高位是符号位,所以根据ATT7022E/26E/28E
功率寄存器给出的有功和无功功率的方向,可以直接得到当前所处的象限。视在功率总是大于或者等
于0,所以视在功率的符号位始终为0。
功率寄存器格式定义:
A/B/C分相功率参数:X
X:24位数据,补码形式
如果X>2^23,则XX=X-2^24
否则 XX=X
实际的A/B/C分相功率参数为:XXX=XX*K(其中K为功率参数系数,所有功率参数共用)。
A/B/C合相功率参数:T
T:24位数据,补码形式
如果T>2^23,则TT=T-2^24
否则 TT=T
实际的合相功率参数为:TTT=TT*2*K(其中K为功率参数系数,所有功率参数共用)。
单位:功率单位是瓦(W),功率系数K=2.592*10^10/(HFconst*EC*2^23)
其中HFconst为寄存器HFconst写入值,EC为电表常数


用户手册上写了啊

出0入0汤圆

发表于 2014-7-10 15:30:27 | 显示全部楼层
#define Meter_Ib        5.0                        //基本电流
#define Meter_Im        50.0                //最大电流
#define Meter_CT        5000.0                //互感器变比
#define Meter_Un        220.0                //参比电压
#define Meter_Ec        100                        //脉冲常数
#define Meter_Igain        2                        //电流通道ADC增益
//#define Meter_Vr
#define Meter_Ir        10.0                //电流取样电阻
#define        Meter_Vu        183.18                //电压取样输入mV       

//电流取样输入mV
#define Meter_Vi        (1000.0*Meter_Ir*Meter_Ib*Meter_Igain/Meter_CT)       
#define Meter_G                1.163                //ATT7022E常数
#define Meter_nI        6.0                        //电流比例常数

//高频脉冲常数
#define Meter_HFConst        ((2.592*Meter_G*Meter_G*Meter_Vi*Meter_Vu*10000.0)/(Meter_Ib*Meter_Un*Meter_Ec))
#define Meter_K                        (3089.9/(Meter_HFConst*Meter_Ec))

给你个我的定义,供你参考

出155入0汤圆

 楼主| 发表于 2014-7-10 15:49:52 | 显示全部楼层
本帖最后由 yijingkun 于 2014-7-10 15:57 编辑
binghe167 发表于 2014-7-10 15:28
ATT7022E/26E/28E功率寄存器采用补码形式给出,最高位是符号位,所以根据ATT7022E/26E/28E
功率寄存器给出 ...


先谢谢你的答复,我就是这段看不明白:

如果X>2^23,则XX=X-2^24
否则 XX=X
实际的A/B/C分相功率参数为:XXX=XX*K(其中K为功率参数系数,所有功率参数共用)。XX=X,XX是什么意思啊?是X的平方吗?还有我没有用标准表,怎么确定电表常数啊?所以也没法确定HFconst的值。
我是三相电只接了B相,电压直接接的交流220V,电流串接一个50欧的陶瓷功率电阻,万用表测电流,通过负载电流是4.15A,电流互感器输出2.05毫安。

实际的A/B/C分相功率参数为:XXX=XX*K,XXX又是什么意思?

电流接线反接一下现在是正值了,读寄存器是0x2130,也就是十进制的:8,496,这个值肯定不是实际功率值,没法确定EC、就没法确定HFconst、就没法确定K。

我的理解:读到电压和电流值,只要误差不太大,7022E芯片就可以计算出B相的有功功率了,只是精度可能受HFconst等参数的影响,所以才需要校表,但是现在是读到的0x2130这个值,我不知道怎么换算成实际功率值,220V×4.15A,
功率应该是一千多W才对,也不知道读到的0x2130是否正确的。

出155入0汤圆

 楼主| 发表于 2014-7-10 16:12:09 | 显示全部楼层
UP,求助ing

出0入0汤圆

发表于 2014-7-10 17:19:39 | 显示全部楼层
我在14楼都已经给出这些值得定义了啊
有功功率=0x2130*Meter_K

出155入0汤圆

 楼主| 发表于 2014-7-10 17:22:09 | 显示全部楼层
本帖最后由 yijingkun 于 2014-7-10 17:24 编辑

[quote]binghe167 发表于 2014-7-10 17:19
我在14楼都已经给出这些值得定义了啊
有功功率=0x2130*Meter_K

可是我现在确定不了EC啊,EC确定不了,还是得不到K是多少啊?你的定义是:#define Meter_K                        (3089.9/(Meter_HFConst*Meter_Ec))

出0入0汤圆

发表于 2014-7-10 17:41:28 | 显示全部楼层
Ec自己随便定的啊

出155入0汤圆

 楼主| 发表于 2014-7-11 09:09:13 | 显示全部楼层
binghe167 发表于 2014-7-10 17:41
Ec自己随便定的啊

算出来了,给上海的打电话,EC让按照3200定,现在算出来有功是1174W,谢楼上了。得到单相的电压,电流,确定了常数EC就可以算出功率了,只是如果需要提高精度,那么就必须认真校表了。至于手册中关于功率计算的描述,
什么XX=X,还是没搞明白什么意思。

出0入0汤圆

发表于 2014-7-19 22:59:40 | 显示全部楼层
各位,呵呵,用7022E,有效值,不做平均处理的话,按1.76Hz的更新速率,U和I,跳变大吗?我不会又人品爆发了吧?目前情况比较惨。可没有以前的CS5460稳。正在处理中。

出155入0汤圆

 楼主| 发表于 2014-7-28 16:30:22 | 显示全部楼层
zhangsai 发表于 2014-7-19 22:59
各位,呵呵,用7022E,有效值,不做平均处理的话,按1.76Hz的更新速率,U和I,跳变大吗?我不会又人品爆发 ...

我还没调到这一步,只是数据都读到了,误差不是太离谱,还要校表,所以没法确定跳变大不大

出0入0汤圆

发表于 2014-8-11 16:03:06 | 显示全部楼层
MARK,值得借鉴

出0入0汤圆

发表于 2014-8-25 16:19:37 | 显示全部楼层
MARK,学习中

出155入0汤圆

 楼主| 发表于 2014-8-25 16:33:29 | 显示全部楼层
目前进度汇报,三相电压、电流、有功、无功、PF、频率神马的都出来了,我没有三相标准功率源,ABC三相都是单相测试的,不校准情况下,先提高硬件精度,硬件主要是调PT、CT的采样电阻,然后不校准情况下,读出来的数据误差稍大,电压值比较准、电流值差了3~5%,功率值差的多一些,有功实测1.2k,标准表1.1k,无功1.2k,标准表1.5k。
有个问题不知道为什么,7022E的CT按照手册上应该接5.1R的,我是接0.88R才能比较准,没找的原因。校表不打算写7022E的寄存器,直接把电压、电流、功率的校正值写到板子的EEPROM里面,再计算出校准后的值就可以了。

出155入0汤圆

 楼主| 发表于 2014-8-25 16:43:31 | 显示全部楼层
项目正在做,没法全部代码都公开,就把main、7022.c、7022.H放上来吧,事先说明,不是我原创的,核心的7022代码,是从PUDN下载下来然后修改的,程序模板用的原子的战舰版的例程。

7022.h
  1. #ifndef _ATT7022_H_
  2. #define _ATT7022_H_

  3. #include "STM32F10X.h"
  4. #include "math.h"

  5. /*
  6.    RST        PC3
  7.    CS        PC6
  8.    SCL        PC7
  9.    DIN        PC8
  10.    DOUT        PC9        (DATA)
  11. */

  12. #define RST_Port        GPIOB
  13. #define CS_Port                GPIOB
  14. #define SCL_Port        GPIOB
  15. #define DATA_Port        GPIOB
  16. #define DIN_Port        GPIOB

  17. #define RST_Pin                GPIO_Pin_0
  18. #define CS_Pin                GPIO_Pin_12
  19. #define SCL_Pin                GPIO_Pin_13
  20. #define DATA_Pin        GPIO_Pin_15
  21. #define DIN_Pin                GPIO_Pin_14

  22. #define Set_CS                 GPIO_SetBits (CS_Port, CS_Pin)
  23. #define Clr_CS                 GPIO_ResetBits (CS_Port, CS_Pin)
  24. #define Rev_CS                GPIO_WriteBit(CS_Port, CS_Pin, (BitAction)(1 - GPIO_ReadOutputDataBit(CS_Port, CS_Pin)))

  25. #define Set_SCL          GPIO_SetBits (SCL_Port, SCL_Pin)
  26. #define Clr_SCL          GPIO_ResetBits (SCL_Port, SCL_Pin)
  27. #define Rev_SCL                GPIO_WriteBit(SCL_Port, SCL_Pin, (BitAction)(1 - GPIO_ReadOutputDataBit(SCL_Port, SCL_Pin)))

  28. #define Set_DATA        GPIO_SetBits (DATA_Port, DATA_Pin)
  29. #define Clr_DATA          GPIO_ResetBits (DATA_Port, DATA_Pin)
  30. #define Rev_DATA        GPIO_WriteBit(DATA_Port, DATA_Pin, (BitAction)(1 - GPIO_ReadOutputDataBit(DATA_Port, DATA_Pin)))

  31. #define Set_RST         GPIO_SetBits (RST_Port, RST_Pin)
  32. #define Clr_RST         GPIO_ResetBits (RST_Port, RST_Pin)
  33. #define Rev_RST                GPIO_WriteBit(RST_Port, LED54_Pin, (BitAction)(1 - GPIO_ReadOutputDataBit(RST_Port, RST_Pin)))

  34. #define Rd_MISO                GPIO_ReadInputDataBit(DIN_Port, DIN_Pin)==1

  35. #define r_Pflag 0x3D  //功率方向
  36. #define R_Sflag 0x2C  //状态寄存器

  37. #define r_Pa 0x01
  38. #define r_Pb 0x02
  39. #define r_Pc 0x03
  40. #define r_Pt 0x04    //有功功率

  41. #define r_Qa 0x05
  42. #define r_Qb 0x06
  43. #define r_Qc 0x07
  44. #define r_Qt 0x08    //无功功率

  45. #define r_Sa 0x09
  46. #define r_Sb 0x0A
  47. #define r_Sc 0x0B
  48. #define r_St 0x0C    //视在功率

  49. #define r_UaRms 0x0D
  50. #define r_UbRms 0x0E
  51. #define r_UcRms 0x0F
  52. #define r_UtRms 0x2B
  53. #define r_IaRms 0x10
  54. #define r_IbRms 0x11
  55. #define r_IcRms 0x12
  56. #define r_ItRms 0x13  //电压电流有效值

  57. #define r_Pfa 0x14
  58. #define r_Pfb 0x15
  59. #define r_Pfc 0x16
  60. #define r_Pft 0x17     //功率因数

  61. #define r_Freq 0x1C  //线网频率

  62. #define r_Epa 0x1E
  63. #define r_Epb 0x1F
  64. #define r_Epc 0x20
  65. #define r_Ept 0x21    //累加型有功电能

  66. #define r_Eqa 0x22
  67. #define r_Eqb 0x23
  68. #define r_Eqc 0x24
  69. #define r_Eqt 0x25    //累加型无功电能

  70. #define r_Epa2 0x31
  71. #define r_Epb2 0x32
  72. #define r_Epc2 0x33
  73. #define r_Ept2 0x34    //清零型有功电能

  74. #define r_Eqa2 0x35
  75. #define r_Eqb2 0x36
  76. #define r_Eqc2 0x37
  77. #define r_Eqt2 0x38    //清零型无功电能

  78. #define HFconst        0xA0   //高频输出参数
  79. #define UADC        0xBF   //电压通道增益
  80. #define UgainA        0x9B
  81. #define UgainB        0x9C
  82. #define UgainC        0x9D
  83. #define IgainA        0x1A
  84. #define IgainB        0x1B
  85. #define IgainC        0x1C   //分相电压电流校准

  86. #define PgainB        0x05         //B相有功功率增益

  87. #define Vu  0.190                //电压通道采样电压
  88. #define Vi  0.003                //电流通道采样电压
  89. #define Un  220                        //额定电压
  90. #define In  4.15                //额定电流
  91. #define Meter_G                1.163                //ATT7022E常数
  92. //#define Meter_HFConst        ((2.592*1E10*Meter_G*Meter_G*Vu*Vi)/(In*Un*Meter_Ec))
  93. #define Meter_HFConst        ((2.592*pow(10,10)*Meter_G*Meter_G*Vu*Vi)/(In*Un*Meter_Ec))
  94. #define Meter_K                        (2.592*pow(10,10)/(Meter_HFConst*Meter_Ec*pow(2,23)))

  95. extern u16 Meter_Ec;                        //电表常数
  96. // extern float I_Amp_Factor;                //电流放大倍数
  97. // extern float V_Amp_Factor;                //电压放大倍数
  98. // extern float Pa_Gain_compensation;                //A相有功功率补偿系数
  99. // extern float Pha_compensation;                //A相相位补偿补偿系数


  100. typedef struct
  101. {
  102.         u32 P;           //有功功率
  103.         float Rp;
  104.         u32 Q;           //无功功率
  105.         float Rq;
  106.         u32 S;           //视在功率
  107.         float Rs;
  108.         u32 URms;        //电压有效值
  109.         float Rurms;
  110.         u32 IRms;        //电流有效值
  111.         float Rirms;
  112.         u32 Pf;          //功率因数
  113.         float Rpf;
  114.         u32 Freq;        //线网频率
  115.         float Rfreq;
  116. }DataTypeDef;

  117. extern DataTypeDef ADataTypeDef,BDataTypeDef,CDataTypeDef,TDataTypeDef;

  118. typedef struct
  119. {
  120. // u16 Meter_Ec;                        //电表常数
  121. float I_Amp_Factor;                //电流放大倍数
  122. float V_Amp_Factor;                //电压放大倍数
  123. float P_Gain_compensation;                //A相有功功率补偿系数
  124. float Ph_compensation;                //A相相位补偿补偿系数
  125. }Meter_Adj_Val_Stru_Def;

  126. extern Meter_Adj_Val_Stru_Def PhaseA,PhaseB,PhaseC;


  127. extern void delay_ms(u16 time);
  128. extern void delay_us(u32 nus);
  129. u32 SPI_ATT_Read(u8 data);             //  SIG --> Sflag.7
  130. void SPI_ATT_Write(u8 com_add,u32 data2);//  0xD3,0x000000 可进行软件复位
  131. void ATT7022_Init(void);
  132. void ATT_Adjust(void);
  133. void ATT_Test(void);
  134. void Read_ATT_AData(void);
  135. void Read_ATT_BData(void);
  136. void Read_ATT_CData(void);
  137. void Read_ATT_TData(void);

  138. void Output_ATT(DataTypeDef output);
  139. void Read_ATT_TestData(void);

  140. #endif
复制代码


7022.c
  1. #include "ATT7022.h"
  2. #include "stdio.h"
  3. #include "Lcd1602.h"

  4. extern int fputc(int ch, FILE *f);
  5. extern char disp0[25];
  6. extern char disp1[25];
  7. extern char disp2[25];
  8. extern char disp3[25];
  9. extern DataTypeDef ADataTypeDef,BDataTypeDef,CDataTypeDef,TDataTypeDef;

  10. DataTypeDef ADataTypeDef,BDataTypeDef,CDataTypeDef,TDataTypeDef;
  11. Meter_Adj_Val_Stru_Def PhaseA={1.0,1.0,0.0,0.0},PhaseB={1.0,1.0,0.0,0.0},PhaseC={1.0,1.0,0.0,0.0};

  12. u16 Meter_Ec = 3200;                        //电表常数

  13. //7022初始化
  14. void ATT7022_Init(void)
  15. {
  16.         GPIO_InitTypeDef GPIO_InitStructure;

  17.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能PORTA,PORTE时钟
  18.           GPIO_InitStructure.GPIO_Pin = RST_Pin|CS_Pin|SCL_Pin|DATA_Pin;
  19.           GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  20.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;   //复用推挽输出
  21.           GPIO_Init(GPIOB,&GPIO_InitStructure);

  22.         Clr_SCL;
  23.        
  24.     GPIO_InitStructure.GPIO_Pin = DIN_Pin;
  25.           GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   //浮空输入
  26.           GPIO_Init(DIN_Port,&GPIO_InitStructure);

  27.         //硬件复位
  28.         Clr_RST;
  29.         delay_us(30);
  30.         Set_RST;
  31.         delay_us(600);
  32. }

  33. /*校表函数*/
  34. void ATT_Adjust(void)
  35. {
  36.         u32 read1=0x55;

  37.         SPI_ATT_Write(0xC3, 0x000000);                //清校表数据
  38.         SPI_ATT_Write(0xC9, 0x00005A);                //打开校准数据写

  39.         SPI_ATT_Write(0x01, 0xB9FE);                //填写模式配置寄存器
  40.         SPI_ATT_Write(0x03, 0xF804);                //填写EMU单元配置寄存器
  41.         SPI_ATT_Write(0x31, 0x3437);                //填写模拟模块使能寄存器
  42.         SPI_ATT_Write(0x02, 0x0000);                //各路ADC增益均为1

  43.         SPI_ATT_Write(0x6D, 0xFF00);                //
  44.         SPI_ATT_Write(0x6E, 0x0DB8);                //
  45.         SPI_ATT_Write(0x6F, 0xD1DA);                //

  46.         SPI_ATT_Write(UADC, 0x000000);                //电压通道增益为1
  47.        
  48. //        SPI_ATT_Write(HFconst, 0x00016D);        //高频输出参数为1511
  49. ///*----------------------------------------
  50. //    分相电压电流校准参数
  51. //-----------------------------------------*/
  52. //        SPI_ATT_Write(UgainA, 0x000000);
  53. //        SPI_ATT_Write(UgainB, 0x000000);
  54. //        SPI_ATT_Write(UgainC, 0x8172F5);        //8483573

  55.         SPI_ATT_Write(0xC9, 0x000001);                //关闭校准数据写

  56.         SPI_ATT_Write(0xC6, 0x00005A);                //校表数据读出使能
  57.         read1=SPI_ATT_Read(0x00);
  58.         printf("\r\nIn 0xC6 with 0x5A: 0x00 is %x !\r\n",read1);
  59.         read1=0x55;

  60.         read1=SPI_ATT_Read(0x01);
  61.         printf("\r\nModeCfg is %x !\r\n",read1);
  62.         read1=0x55;

  63.         read1=SPI_ATT_Read(0x03);
  64.         printf("\r\nEMUCfg is %x !\r\n",read1);
  65.         read1=0x55;

  66.         read1=SPI_ATT_Read(0x31);
  67.         printf("\r\nModuleCfg is %x !\r\n",read1);
  68.         read1=0x55;

  69.         SPI_ATT_Write(0xC6, 0x000001);                //计量数据读出使能
  70.         read1=SPI_ATT_Read(0x00);
  71.         printf("\r\nIn 0xC6 without 0x5A: 0x00 is %x !\r\n",read1);
  72. }

  73. /*试验函数(为了避免main中太多代码而设)*/
  74. void ATT_Test(void)
  75. {
  76.         u32 read=0x55;

  77.         read=SPI_ATT_Read(0x00);
  78.         printf("\r\nDevice ID is %x !\r\n",read);
  79.         read=0x55;

  80.         printf("\r\nReading A...\r\n");
  81.         Read_ATT_AData();
  82.         delay_ms(1000);
  83.         delay_ms(1000);
  84.         delay_ms(1000);

  85.         printf("\r\nReading B...\r\n");
  86.         Read_ATT_BData();
  87.         delay_ms(1000);
  88.         delay_ms(1000);
  89.         delay_ms(1000);

  90.         printf("\r\nReading C...\r\n");
  91.         Read_ATT_CData();
  92.         delay_ms(1000);
  93.         delay_ms(1000);
  94.         delay_ms(1000);

  95. //         printf("\r\nReading T...\r\n");
  96. //         Read_ATT_TData();
  97. }

  98. /*SPI读操作*/
  99. u32 SPI_ATT_Read(u8 data)
  100. {
  101.         u8 i;
  102.         u32 temp=0;
  103.         Set_CS;
  104.         Clr_SCL;
  105.         Clr_CS;     //片选为低,开始操作
  106.            for(i=0;i<8;i++)
  107.         {
  108.                 Set_SCL;
  109.                 delay_us(50);
  110.                    if(data&0x80)
  111.                            Set_DATA;
  112.                    else
  113.                            Clr_DATA;
  114.                 delay_us(3);   //稳定数据
  115.                    Clr_SCL;
  116.                 delay_us(50);
  117.                 data<<=1;//左移数据
  118.           }
  119.         delay_us(3);         //稳定数据       
  120.         for(i=0;i<24;i++)
  121.         {
  122.                 temp<<=1;
  123.                    Set_SCL;
  124.                 delay_us(50);
  125.                    if(Rd_MISO)
  126.                            temp|=0x01;
  127.                    Clr_SCL;
  128.                 delay_us(50);
  129.         }
  130.         Set_CS;
  131.           return (temp);
  132. }

  133. /*SPI写操作*/
  134. void SPI_ATT_Write(u8 com_add,u32 data2)
  135. {
  136.         u8 i,data1;
  137.         data1=0x80|com_add;
  138.         Set_CS;
  139.         Clr_SCL;
  140.         Clr_CS;     //片选为低,开始操作
  141.            for(i=0;i<8;i++)
  142.         {
  143.                 Set_SCL;
  144.                 delay_us(50);
  145.                    if(data1&0x80)
  146.                            Set_DATA;
  147.                    else
  148.                            Clr_DATA;
  149.                 delay_us(3);
  150.                    Clr_SCL;
  151.                 delay_us(50);
  152.                 data1<<=1;//左移数据
  153.           }
  154.         for(i=0;i<24;i++)
  155.         {
  156.                    Set_SCL;
  157.                 delay_us(50);
  158.                    if(data2&0x00800000)
  159.                            Set_DATA;
  160.                    else
  161.                            Clr_DATA;
  162.                 delay_us(3);
  163.                    Clr_SCL;
  164.                 delay_us(50);

  165.                    data2<<=1;
  166.         }
  167.         Set_CS;
  168. }

  169. //以下为各相常用数据读取
  170. void Read_ATT_AData(void)
  171. {
  172.         ADataTypeDef.P=SPI_ATT_Read(r_Pa);
  173.         ADataTypeDef.Q=SPI_ATT_Read(r_Qa);
  174.         ADataTypeDef.S=SPI_ATT_Read(r_Sa);
  175.         ADataTypeDef.URms=SPI_ATT_Read(r_UaRms);
  176.         ADataTypeDef.IRms=SPI_ATT_Read(r_IaRms);
  177.         ADataTypeDef.Pf=SPI_ATT_Read(r_Pfa);
  178.         ADataTypeDef.Freq=SPI_ATT_Read(r_Freq);
  179.         if(ADataTypeDef.P>0x800000){
  180.                 ADataTypeDef.Rp=0x1000000-ADataTypeDef.P;
  181.                 ADataTypeDef.Rp=-((ADataTypeDef.Rp*Meter_K*fabs(PhaseA.I_Amp_Factor)*fabs(PhaseA.V_Amp_Factor))\
  182.                 -((ADataTypeDef.Rp*Meter_K*fabs(PhaseA.I_Amp_Factor)*fabs(PhaseA.V_Amp_Factor))*PhaseA.P_Gain_compensation));    //   2^15/2^23
  183.         }
  184.         else
  185.                 ADataTypeDef.Rp=(ADataTypeDef.P*Meter_K*fabs(PhaseA.I_Amp_Factor)*fabs(PhaseA.V_Amp_Factor))\
  186.                 -((ADataTypeDef.P*Meter_K*fabs(PhaseA.I_Amp_Factor)*fabs(PhaseA.V_Amp_Factor))*PhaseA.P_Gain_compensation);
  187.         if(ADataTypeDef.Q>0x800000){
  188.                 ADataTypeDef.Rq=0x1000000-ADataTypeDef.Q;
  189.                 ADataTypeDef.Rq=-((ADataTypeDef.Rq*Meter_K*fabs(PhaseA.I_Amp_Factor)*fabs(PhaseA.V_Amp_Factor))\
  190.                 -((ADataTypeDef.Rq*Meter_K*fabs(PhaseA.I_Amp_Factor)*fabs(PhaseA.V_Amp_Factor))*PhaseA.P_Gain_compensation));
  191.         }
  192.         else
  193.                 ADataTypeDef.Rq=(ADataTypeDef.Q*Meter_K*fabs(PhaseA.I_Amp_Factor)*fabs(PhaseA.V_Amp_Factor))\
  194.                 -((ADataTypeDef.Q*Meter_K*fabs(PhaseA.I_Amp_Factor)*fabs(PhaseA.V_Amp_Factor))*PhaseA.P_Gain_compensation);
  195.         ADataTypeDef.Rs=ADataTypeDef.S/256.0;
  196.         ADataTypeDef.Rurms=ADataTypeDef.URms/8192.0*PhaseA.V_Amp_Factor;   //   2^10/2^23
  197.         ADataTypeDef.Rirms=ADataTypeDef.IRms/8192.0*PhaseA.I_Amp_Factor;
  198.         if(ADataTypeDef.Pf>0x800000){
  199.                 ADataTypeDef.Rpf=0x1000000-ADataTypeDef.Pf;
  200.                 ADataTypeDef.Rpf=-((ADataTypeDef.Rpf/8388608.0)-((ADataTypeDef.Rpf/8388608.0)*PhaseA.Ph_compensation));
  201.         }
  202.         else
  203.                 ADataTypeDef.Rpf=(ADataTypeDef.Pf/8388608.0)-((ADataTypeDef.Pf/8388608.0)*PhaseA.Ph_compensation);
  204.         ADataTypeDef.Rfreq=ADataTypeDef.Freq/8192.0;

  205. //         Lcd_Clr();
  206. //         sprintf(disp0,"A phase:");
  207. //         Lcd_Puts(7,0,disp0);
  208. //        Output_ATT(ADataTypeDef);
  209. }

  210. void Read_ATT_BData(void)
  211. {
  212.         BDataTypeDef.P=SPI_ATT_Read(r_Pb);
  213.         BDataTypeDef.Q=SPI_ATT_Read(r_Qb);
  214.         BDataTypeDef.S=SPI_ATT_Read(r_Sb);
  215.         BDataTypeDef.URms=SPI_ATT_Read(r_UbRms);
  216.         BDataTypeDef.IRms=SPI_ATT_Read(r_IbRms);
  217.         BDataTypeDef.Pf=SPI_ATT_Read(r_Pfb);
  218.         BDataTypeDef.Freq=SPI_ATT_Read(r_Freq);
  219.         if(BDataTypeDef.P>0x800000){
  220.                 BDataTypeDef.Rp=0x1000000-BDataTypeDef.P;
  221.                 BDataTypeDef.Rp=-((BDataTypeDef.Rp*Meter_K*fabs(PhaseB.I_Amp_Factor)*fabs(PhaseB.V_Amp_Factor))\
  222.                 -((BDataTypeDef.Rp*Meter_K*fabs(PhaseB.I_Amp_Factor)*fabs(PhaseB.V_Amp_Factor))*PhaseB.P_Gain_compensation));    //   2^15/2^23
  223.         }
  224.         else
  225.                 BDataTypeDef.Rp=(BDataTypeDef.P*Meter_K*fabs(PhaseB.I_Amp_Factor)*fabs(PhaseB.V_Amp_Factor))\
  226.                 -((BDataTypeDef.P*Meter_K*fabs(PhaseB.I_Amp_Factor)*fabs(PhaseB.V_Amp_Factor))*PhaseB.P_Gain_compensation);
  227.         if(BDataTypeDef.Q>0x800000){
  228.                 BDataTypeDef.Rq=0x1000000-BDataTypeDef.Q;
  229.                 BDataTypeDef.Rq=-((BDataTypeDef.Rq*Meter_K*fabs(PhaseB.I_Amp_Factor)*fabs(PhaseB.V_Amp_Factor))\
  230.                 -((BDataTypeDef.Rq*Meter_K*fabs(PhaseB.I_Amp_Factor)*fabs(PhaseB.V_Amp_Factor))*PhaseB.P_Gain_compensation));
  231.         }
  232.         else
  233.                 BDataTypeDef.Rq=(BDataTypeDef.Q*Meter_K*fabs(PhaseB.I_Amp_Factor)*fabs(PhaseB.V_Amp_Factor))\
  234.                 -((BDataTypeDef.Q*Meter_K*fabs(PhaseB.I_Amp_Factor)*fabs(PhaseB.V_Amp_Factor))*PhaseB.P_Gain_compensation);
  235.         BDataTypeDef.Rs=BDataTypeDef.S/256.0;
  236.         BDataTypeDef.Rurms=BDataTypeDef.URms/8192.0*PhaseB.V_Amp_Factor;   //   2^10/2^23
  237.         BDataTypeDef.Rirms=BDataTypeDef.IRms/8192.0*PhaseB.I_Amp_Factor;
  238.         if(BDataTypeDef.Pf>0x800000){
  239.                 BDataTypeDef.Rpf=0x1000000-BDataTypeDef.Pf;
  240.                 BDataTypeDef.Rpf=-((BDataTypeDef.Rpf/8388608.0)-((BDataTypeDef.Rpf/8388608.0)*PhaseB.Ph_compensation));
  241.         }
  242.         else
  243.                 BDataTypeDef.Rpf=(BDataTypeDef.Pf/8388608.0)-((BDataTypeDef.Pf/8388608.0)*PhaseB.Ph_compensation);
  244.         BDataTypeDef.Rfreq=BDataTypeDef.Freq/8192.0;

  245. //         Lcd_Clr();
  246. //         sprintf(disp0,"B phase:");
  247. //         Lcd_Puts(7,0,disp0);
  248. //         Output_ATT(BDataTypeDef);
  249. }

  250. void Read_ATT_CData(void)
  251. {
  252.         CDataTypeDef.P=SPI_ATT_Read(r_Pc);
  253.         CDataTypeDef.Q=SPI_ATT_Read(r_Qc);
  254.         CDataTypeDef.S=SPI_ATT_Read(r_Sc);
  255.         CDataTypeDef.URms=SPI_ATT_Read(r_UcRms);
  256.         CDataTypeDef.IRms=SPI_ATT_Read(r_IcRms);
  257.         CDataTypeDef.Pf=SPI_ATT_Read(r_Pfc);
  258.         CDataTypeDef.Freq=SPI_ATT_Read(r_Freq);
  259.         if(CDataTypeDef.P>0x800000){
  260.                 CDataTypeDef.Rp=0x1000000-CDataTypeDef.P;
  261.                 CDataTypeDef.Rp=-((CDataTypeDef.Rp*Meter_K*fabs(PhaseC.I_Amp_Factor)*fabs(PhaseC.V_Amp_Factor))\
  262.                 -((CDataTypeDef.Rp*Meter_K*fabs(PhaseC.I_Amp_Factor)*fabs(PhaseC.V_Amp_Factor))*PhaseC.P_Gain_compensation));    //   2^15/2^23
  263.         }
  264.         else
  265.                 CDataTypeDef.Rp=(CDataTypeDef.P*Meter_K*fabs(PhaseC.I_Amp_Factor)*fabs(PhaseC.V_Amp_Factor))\
  266.                 -((CDataTypeDef.P*Meter_K*fabs(PhaseC.I_Amp_Factor)*fabs(PhaseC.V_Amp_Factor))*PhaseC.P_Gain_compensation);
  267.         if(CDataTypeDef.Q>0x800000){
  268.                 CDataTypeDef.Rq=0x1000000-CDataTypeDef.Q;
  269.                 CDataTypeDef.Rq=-((CDataTypeDef.Rq*Meter_K*fabs(PhaseC.I_Amp_Factor)*fabs(PhaseC.V_Amp_Factor))\
  270.                 -((CDataTypeDef.Rq*Meter_K*fabs(PhaseC.I_Amp_Factor)*fabs(PhaseC.V_Amp_Factor))*PhaseC.P_Gain_compensation));
  271.         }
  272.         else
  273.                 CDataTypeDef.Rq=(CDataTypeDef.Q*Meter_K*fabs(PhaseC.I_Amp_Factor)*fabs(PhaseC.V_Amp_Factor))\
  274.                 -((CDataTypeDef.Q*Meter_K*fabs(PhaseC.I_Amp_Factor)*fabs(PhaseC.V_Amp_Factor))*PhaseC.P_Gain_compensation);
  275.         CDataTypeDef.Rs=CDataTypeDef.S/256.0;
  276.         CDataTypeDef.Rurms=CDataTypeDef.URms/8192.0*PhaseC.V_Amp_Factor;   //   2^10/2^23
  277.         CDataTypeDef.Rirms=CDataTypeDef.IRms/8192.0*PhaseC.I_Amp_Factor;
  278.         if(CDataTypeDef.Pf>0x800000){
  279.                 CDataTypeDef.Rpf=0x1000000-CDataTypeDef.Pf;
  280.                 CDataTypeDef.Rpf=-((CDataTypeDef.Rpf/8388608.0)-((CDataTypeDef.Rpf/8388608.0)*PhaseC.Ph_compensation));
  281.         }
  282.         else
  283.                 CDataTypeDef.Rpf=(CDataTypeDef.Pf/8388608.0)-((CDataTypeDef.Pf/8388608.0)*PhaseC.Ph_compensation);
  284.         CDataTypeDef.Rfreq=CDataTypeDef.Freq/8192.0;

  285. //         Lcd_Clr();
  286. //         sprintf(disp0,"C phase:");
  287. //         Lcd_Puts(7,0,disp0);
  288. //         Output_ATT(CDataTypeDef);
  289. }

  290. void Read_ATT_TData(void)
  291. {
  292.         TDataTypeDef.P=SPI_ATT_Read(r_Pt);
  293.         TDataTypeDef.Q=SPI_ATT_Read(r_Qt);
  294.         TDataTypeDef.S=SPI_ATT_Read(r_St);
  295.         TDataTypeDef.URms=SPI_ATT_Read(r_UtRms);
  296.         TDataTypeDef.IRms=SPI_ATT_Read(r_ItRms);
  297.         TDataTypeDef.Pf=SPI_ATT_Read(r_Pft);
  298.         TDataTypeDef.Freq=SPI_ATT_Read(r_Freq);
  299.         if(TDataTypeDef.P>0x800000){
  300.                 TDataTypeDef.Rp=0x1000000-TDataTypeDef.P;
  301.                 TDataTypeDef.Rp=-(TDataTypeDef.Rp/64.0);    //   2^17/2^23
  302.         }
  303.         else
  304.                 TDataTypeDef.Rp=TDataTypeDef.P/64.0;
  305.         if(TDataTypeDef.Q>0x800000){
  306.                 TDataTypeDef.Rq=0x1000000-TDataTypeDef.Q;
  307.                 TDataTypeDef.Rq=-(TDataTypeDef.Rq/64.0);
  308.         }
  309.         else
  310.                 TDataTypeDef.Rq=TDataTypeDef.Q/64.0;
  311.         TDataTypeDef.Rs=TDataTypeDef.S/64.0;
  312.         TDataTypeDef.Rurms=TDataTypeDef.URms/8192.0;   //   2^10/2^23
  313.         TDataTypeDef.Rirms=TDataTypeDef.IRms/8192.0;
  314.         if(TDataTypeDef.Pf>0x800000){
  315.                 TDataTypeDef.Rpf=0x1000000-TDataTypeDef.Pf;
  316.                 TDataTypeDef.Rpf=-(TDataTypeDef.Rpf/8388608.0);
  317.         }
  318.         else
  319.                 TDataTypeDef.Rpf=TDataTypeDef.Pf/8388608.0;
  320.         TDataTypeDef.Rfreq=TDataTypeDef.Freq/8192.0;

  321.         Output_ATT(TDataTypeDef);
  322. }

  323. void Output_ATT(DataTypeDef output)
  324. {
  325.         sprintf(disp1,"U:%.2fV,I:%.2fA",output.Rurms,output.Rirms);
  326.         if(output.Rp<=999.9)
  327.                 sprintf(disp2,"P:%.2fW,Q:%.2fVar",output.Rp,output.Rq);
  328.         if(output.Rp>999.9)
  329.                 sprintf(disp2,"P:%.1fkW,Q:%.1fkVar",(output.Rp/1000.0),(output.Rq/1000.0));
  330.         sprintf(disp3,"Pf:%.3f,F:%.3fHz",output.Rpf,output.Rfreq);
  331.         Lcd_Puts(0,1,disp1);
  332.         Lcd_Puts(0,2,disp2);
  333.         Lcd_Puts(0,3,disp3);
  334.         printf("\r\n********************\r\n");
  335.         printf("\r\nP = %x !\r\n",output.P);
  336.         printf("\r\n    %f !\r\n",output.Rp);
  337.         printf("\r\nQ = %x !\r\n",output.Q);
  338.         printf("\r\n    %f !\r\n",output.Rq);       
  339.         printf("\r\nS = %x !\r\n",output.S);
  340.         printf("\r\n    %f !\r\n",output.Rs);
  341.         printf("\r\nURms = %x !\r\n",output.URms);
  342.         printf("\r\n       %f !\r\n",output.Rurms);
  343.         printf("\r\nIRms = %x !\r\n",output.IRms);
  344.         printf("\r\n       %f !\r\n",output.Rirms);
  345.         printf("\r\nPf = %x !\r\n",output.Pf);
  346.         printf("\r\n     %f !\r\n",output.Rpf);
  347.         printf("\r\nFreq = %x !\r\n",output.Freq);
  348.         printf("\r\n       %f !\r\n",output.Rfreq);
  349.         printf("\r\n********************\r\n");
  350. }
复制代码


main.c
  1. //                           _ooOoo_
  2. //                          o8888888o
  3. //                          88" . "88
  4. //                          (| -_- |)
  5. //                          O\  =  /O
  6. //                       ____/`---'\____
  7. //                     .'  \\|     |//  `.
  8. //                    /  \\|||  :  |||//  \
  9. //                   /  _||||| -:- |||||-  \
  10. //                   |   | \\\  -  /// |   |
  11. //                   | \_|  ''\---/''  |   |
  12. //                   \  .-\__  `-`  ___/-. /
  13. //                 ___`. .'  /--.--\  `. . __
  14. //              ."" '<  `.___\_<|>_/___.'  >'"".
  15. //             | | :  `- \`.;`\ _ /`;.`/ - ` : | |
  16. //             \  \ `-.   \_ __\ /__ _/   .-` /  /
  17. //        ======`-.____`-.___\_____/___.-`____.-'======
  18. //                           `=---='
  19. //
  20. //
  21. //        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  22. //                   佛祖保佑       永不死机
  23. //                   心外无法       法外无心

  24. #include "led.h"
  25. #include "delay.h"
  26. #include "key.h"
  27. #include "sys.h"
  28. #include "usart.h"
  29. #include "Lcd1602.h"
  30. #include "24C02.h"
  31. #include "..\RTC\rtc.h"
  32. #include "ATT7022.h"
  33. #include "string.h"
  34. //ALIENTEK战舰STM32开发板实验4
  35. //串口实验
  36. //技术支持:www.openedv.com
  37. //广州市星翼电子科技有限公司
  38. extern void ATT7022_Init(void);
  39. extern void ATT_Adjust(void);
  40. extern void ATT_Test(void);
  41. extern void Read_ATT_AData(void);
  42. extern void Read_ATT_BData(void);
  43. extern void Read_ATT_CData(void);

  44. char disp0[25]={0};
  45. char disp1[25]={0};
  46. char disp2[25]={0};
  47. char disp3[25]={0};

  48. char ABC_Phase_val='C';
  49. uint8_t test[10]={'0','I','V','U','4','5','6'};
  50. uint8_t test2[10]={0};

  51. void C_Phase_Cal(void)                //C相校表程序
  52. {
  53.         u8 tmp = 0,tmp1=0;                                         //临时变量
  54.         float tmp2=0.0;                         //临时变量,作为校表时控制当前位数用

  55.         Lcd_Puts(0,0,"C phase Adjust");
  56.         delay_ms(1000);
  57. //进入校表显示界面,先输入电表常数
  58.         Lcd_Puts(0,1,"Enter Meter EC");
  59.         memset(disp0,'0',25);
  60.         sprintf(disp0,"%d",Meter_Ec);
  61.         Lcd_Puts(0,2,"                   ");
  62.         tmp1=0;
  63.         tmp=3;
  64.         Lcd_FlickerChar(tmp1,2);
  65.         while(PAin(3)!=0)                //key4按下表示退出电表常数设置界面
  66.         {
  67.                 if(PAin(0)==0)
  68.                 {
  69.                         delay_ms(300);
  70.                         Meter_Ec=Meter_Ec+(1*pow(10,tmp));                //设置值递增 key1按下递增
  71.                 }
  72.                 if(PAin(2)==0)
  73.                 {
  74.                         delay_ms(300);
  75.                         Meter_Ec=Meter_Ec-(1*pow(10,tmp));                //设置值递减
  76.                 }
  77.                 if(PAin(1)==0)                //个十百千位调整和显示光标调整 key2按下递减
  78.                 {
  79.                         delay_ms(300);
  80.                         tmp--;
  81.                         tmp1++;
  82.                         if(tmp1>3)
  83.                         {
  84.                                 tmp1=0;                //防止设置参数溢出千位
  85.                                 tmp=3;
  86.                         }
  87.                 }
  88.                 if((Meter_Ec>9999)||(Meter_Ec<1))                 //防止常数设置错误,恢复默认值3200
  89.                 {
  90.                         Meter_Ec=3200;
  91.                         tmp=3;
  92.                         tmp1=0;
  93.                         memset(disp0,0x00,25);
  94.                         Lcd_Puts(0,2,disp0);
  95.                 }
  96.                 sprintf(disp0,"%04d",Meter_Ec);
  97.                 Lcd_Puts(0,2,disp0);
  98.                 Lcd_FlickerChar(tmp1,2);
  99.                 delay_ms(300);
  100.         }
  101. //进入电流放大倍数设置界面
  102.         while(PAin(3)==0);
  103.         Lcd_Puts(0,1,"Enter I Amp Factor");
  104.         memset(disp0,0x00,25);
  105.         sprintf(disp0,"%+07.1f",PhaseC.I_Amp_Factor);
  106.         Lcd_Puts(0,2,"                   ");
  107.         tmp1=1;
  108.         tmp2=3.0;
  109.         Lcd_FlickerChar(tmp1,2);
  110.         while(PAin(3)!=0)                //key4按下表示退出电流放大倍数设置界面
  111.         {
  112.                 if(PAin(0)==0)
  113.                 {
  114.                         delay_ms(300);
  115.                         if(PhaseC.I_Amp_Factor>=0)
  116.                                 PhaseC.I_Amp_Factor=PhaseC.I_Amp_Factor+(1*pow(10,tmp2));                //设置值递增 key1按下递增
  117.                         else
  118.                                 PhaseC.I_Amp_Factor=PhaseC.I_Amp_Factor-(1*pow(10,tmp2));                //设置值递增 key1按下递增
  119.                 }
  120.                 if(PAin(2)==0)
  121.                 {
  122.                         delay_ms(300);
  123.                         if(PhaseC.I_Amp_Factor>=0)
  124.                                 PhaseC.I_Amp_Factor=PhaseC.I_Amp_Factor-(1*pow(10,tmp2));                //设置值递减
  125.                         else
  126.                                 PhaseC.I_Amp_Factor=PhaseC.I_Amp_Factor+(1*pow(10,tmp2));                //设置值递增 key1按下递增
  127.                 }
  128.                 if(PAin(1)==0)                //个十百千位调整和显示光标调整 key2按下递减
  129.                 {
  130.                         delay_ms(300);
  131.                         tmp2--;
  132.                         tmp1++;
  133.                         if(tmp1==5)
  134.                                 tmp1++;                //如果光标在小数位,移位到下一位
  135.                         if(tmp1>6)
  136.                         {
  137.                                 tmp1=1;                //防止设置参数溢出千位
  138.                                 tmp2=3.0;
  139.                         }
  140.                 }
  141.                 if((PhaseC.I_Amp_Factor>9999.9)||(PhaseC.I_Amp_Factor<-9999.9))                 //防止常数设置错误,恢复默认值1,电流最大放大999倍
  142.                 {
  143.                         PhaseC.I_Amp_Factor=1.0;
  144.                         tmp2=3.0;
  145.                         tmp1=1;
  146.                         memset(disp0,0x00,25);
  147.                         Lcd_Puts(0,2,"                   ");
  148.                 }
  149.                 sprintf(disp0,"%+07.1f",PhaseC.I_Amp_Factor);
  150.                 Lcd_Puts(0,2,disp0);
  151.                 Lcd_FlickerChar(tmp1,2);
  152.                 delay_ms(300);
  153.         }
  154. //进入设置电压放大倍数界面
  155.         while(PAin(3)==0);
  156.         Lcd_Puts(0,1,"Enter V Amp Factor");
  157.         memset(disp0,0x00,25);
  158.         sprintf(disp0,"%+07.1f",PhaseC.V_Amp_Factor);
  159.         Lcd_Puts(0,2,"                   ");
  160.         tmp1=1;
  161.         tmp2=3.0;
  162.         Lcd_FlickerChar(tmp1,2);
  163.         while(PAin(3)!=0)                //key4按下表示退出电压放大倍数设置界面
  164.         {
  165.                 if(PAin(0)==0)
  166.                 {
  167.                         delay_ms(300);
  168.                         if(PhaseC.V_Amp_Factor>=0)
  169.                                 PhaseC.V_Amp_Factor=PhaseC.V_Amp_Factor+(1*pow(10,tmp2));                //设置值递增 key1按下递增
  170.                         else
  171.                                 PhaseC.V_Amp_Factor=PhaseC.V_Amp_Factor-(1*pow(10,tmp2));                //设置值递增 key1按下递增
  172.                 }
  173.                 if(PAin(2)==0)
  174.                 {
  175.                         delay_ms(300);
  176.                         if(PhaseC.V_Amp_Factor>=0)
  177.                                 PhaseC.V_Amp_Factor=PhaseC.V_Amp_Factor-(1*pow(10,tmp2));                //设置值递减 key3按下递减
  178.                         else
  179.                                 PhaseC.V_Amp_Factor=PhaseC.V_Amp_Factor+(1*pow(10,tmp2));                //设置值递增 key1按下递增
  180.                 }
  181.                 if(PAin(1)==0)                //个十百千位调整和显示光标调整 key2按下
  182.                 {
  183.                         delay_ms(300);
  184.                         tmp2--;
  185.                         tmp1++;
  186.                         if(tmp1==5)
  187.                                 tmp1++;                //如果光标在小数位,移位到下一位
  188.                         if(tmp1>6)
  189.                         {
  190.                                 tmp1=1;                //防止设置参数溢出千位
  191.                                 tmp2=3.0;
  192.                         }
  193.                 }
  194.                 if((PhaseC.V_Amp_Factor>9999.0)||(PhaseC.V_Amp_Factor<-9999.9))                 //防止常数设置错误,恢复默认值1,电压最大放大9999.9倍
  195.                 {
  196.                         PhaseC.V_Amp_Factor=1.0;
  197.                         tmp2=3.0;
  198.                         tmp1=1;
  199.                         memset(disp0,0x00,25);
  200.                         Lcd_Puts(0,2,"                   ");
  201.                 }
  202.                 sprintf(disp0,"%+07.1f",PhaseC.V_Amp_Factor);
  203.                 Lcd_Puts(0,2,disp0);
  204.                 Lcd_FlickerChar(tmp1,2);
  205.                 delay_ms(300);
  206.         }
  207. //进入功率增益补偿设置界面
  208.         while(PAin(3)==0);
  209.         Lcd_Puts(0,1,"                   ");
  210.         Lcd_Puts(0,1,"Enter PgC");
  211.         memset(disp0,'0',25);
  212.         sprintf(disp0,"%+04.2f",PhaseC.P_Gain_compensation);
  213.         Lcd_Puts(0,2,"                   ");
  214.         tmp1=1;
  215.         tmp2=0.0;
  216.         Lcd_FlickerChar(tmp1,2);
  217.         while(PAin(3)!=0)                //key4按下表示退出功率增益设置界面
  218.         {
  219.                 if(PAin(0)==0)
  220.                 {
  221.                         delay_ms(300);
  222.                         if(PhaseC.P_Gain_compensation>=0)
  223.                                 PhaseC.P_Gain_compensation=PhaseC.P_Gain_compensation+(1*pow(10,tmp2));                //设置值递增 key1按下递增
  224.                         else
  225.                                 PhaseC.P_Gain_compensation=PhaseC.P_Gain_compensation-(1*pow(10,tmp2));                //设置值递增 key1按下递增
  226.                 }
  227.                 if(PAin(2)==0)
  228.                 {
  229.                         delay_ms(300);
  230.                         if(PhaseC.P_Gain_compensation>=0)
  231.                                 PhaseC.P_Gain_compensation=PhaseC.P_Gain_compensation-(1*pow(10,tmp2));                //设置值递减
  232.                         else
  233.                                 PhaseC.P_Gain_compensation=PhaseC.P_Gain_compensation+(1*pow(10,tmp2));                //设置值递减
  234.                 }
  235.                 if(PAin(1)==0)                //个十百千位调整和显示光标调整 key2按下递减
  236.                 {
  237.                         delay_ms(300);
  238.                         tmp2--;
  239.                         tmp1++;
  240.                         if(tmp1==2)
  241.                                 tmp1++;                //如果光标在小数位,移位到下一位
  242.                         if(tmp1>4)
  243.                         {
  244.                                 tmp1=1;                //防止设置参数溢出
  245.                                 tmp2=0.0;
  246.                         }
  247.                 }
  248.                 if((PhaseC.P_Gain_compensation>+9.9)||(PhaseC.P_Gain_compensation<-9.9))                 //防止常数设置错误,恢复默认值0.0
  249.                 {
  250.                         PhaseC.P_Gain_compensation=0.0;
  251.                         tmp2=0.0;
  252.                         tmp1=1;
  253.                         memset(disp0,0x00,25);
  254.                         Lcd_Puts(0,2,"                   ");
  255.                 }
  256.                 sprintf(disp0,"%+04.2f",PhaseC.P_Gain_compensation);
  257.                 Lcd_Puts(0,2,disp0);
  258.                 Lcd_FlickerChar(tmp1,2);
  259.                 delay_ms(300);
  260.         }
  261. //相位校正界面
  262.         while(PAin(3)==0);
  263.         Lcd_Puts(0,1,"                   ");
  264.         Lcd_Puts(0,1,"Enter PhA");
  265.         memset(disp0,'0',25);
  266.         sprintf(disp0,"%+04.2f",PhaseC.Ph_compensation);
  267.         Lcd_Puts(0,2,"                   ");
  268.         tmp1=1;
  269.         tmp2=0.0;
  270.         Lcd_FlickerChar(tmp1,2);
  271.         while(PAin(3)!=0)                //key4按下表示退出相位设置界面
  272.         {
  273.                 if(PAin(0)==0)
  274.                 {
  275.                         delay_ms(300);
  276.                         if(PhaseC.Ph_compensation>=0)
  277.                                 PhaseC.Ph_compensation=PhaseC.Ph_compensation+(1*pow(10,tmp2));                //设置值递增 key1按下递增
  278.                         else
  279.                                 PhaseC.Ph_compensation=PhaseC.Ph_compensation-(1*pow(10,tmp2));                //设置值递增 key1按下递增
  280.                 }
  281.                 if(PAin(2)==0)
  282.                 {
  283.                         delay_ms(300);
  284.                         if(PhaseC.Ph_compensation>=0)
  285.                                 PhaseC.Ph_compensation=PhaseC.Ph_compensation-(1*pow(10,tmp2));                //设置值递减
  286.                         else
  287.                                 PhaseC.Ph_compensation=PhaseC.Ph_compensation+(1*pow(10,tmp2));                //设置值递减
  288.                 }
  289.                 if(PAin(1)==0)                //个十百千位调整和显示光标调整 key2按下递减
  290.                 {
  291.                         delay_ms(300);
  292.                         tmp2--;
  293.                         tmp1++;
  294.                         if(tmp1==2)
  295.                                 tmp1++;                //如果光标在小数位,移位到下一位
  296.                         if(tmp1>4)
  297.                         {
  298.                                 tmp1=1;                //防止设置参数溢出
  299.                                 tmp2=0.0;
  300.                         }
  301.                 }
  302.                 if((PhaseC.Ph_compensation>+2.0)||(PhaseC.Ph_compensation<-2.0))                 //防止常数设置错误,恢复默认值0.0
  303.                 {
  304.                         PhaseC.Ph_compensation=0.0;
  305.                         tmp2=0.0;
  306.                         tmp1=1;
  307.                         memset(disp0,0x00,25);
  308.                         Lcd_Puts(0,2,"                   ");
  309.                 }
  310.                 sprintf(disp0,"%+04.2f",PhaseC.Ph_compensation);
  311.                 Lcd_Puts(0,2,disp0);
  312.                 Lcd_FlickerChar(tmp1,2);
  313.                 delay_ms(300);
  314.         }
  315. }

  316. void A_Phase_Cal(void)                //A相校表程序
  317. {
  318.         u8 tmp = 0,tmp1=0;                                         //临时变量
  319.         float tmp2=0.0;                         //临时变量,作为校表时控制当前位数用

  320.         Lcd_Puts(0,0,"A phase Adjust");
  321.         delay_ms(1000);
  322. //进入校表显示界面,先输入电表常数
  323.         Lcd_Puts(0,1,"Enter Meter EC");
  324.         memset(disp0,'0',25);
  325.         sprintf(disp0,"%d",Meter_Ec);
  326.         Lcd_Puts(0,2,"                   ");
  327.         tmp1=0;
  328.         tmp=3;
  329.         Lcd_FlickerChar(tmp1,2);
  330.         while(PAin(3)!=0)                //key4按下表示退出电表常数设置界面
  331.         {
  332.                 if(PAin(0)==0)
  333.                 {
  334.                         delay_ms(300);
  335.                         Meter_Ec=Meter_Ec+(1*pow(10,tmp));                //设置值递增 key1按下递增
  336.                 }
  337.                 if(PAin(2)==0)
  338.                 {
  339.                         delay_ms(300);
  340.                         Meter_Ec=Meter_Ec-(1*pow(10,tmp));                //设置值递减
  341.                 }
  342.                 if(PAin(1)==0)                //个十百千位调整和显示光标调整 key2按下递减
  343.                 {
  344.                         delay_ms(300);
  345.                         tmp--;
  346.                         tmp1++;
  347.                         if(tmp1>3)
  348.                         {
  349.                                 tmp1=0;                //防止设置参数溢出千位
  350.                                 tmp=3;
  351.                         }
  352.                 }
  353.                 if((Meter_Ec>9999)||(Meter_Ec<1))                 //防止常数设置错误,恢复默认值3200
  354.                 {
  355.                         Meter_Ec=3200;
  356.                         tmp=3;
  357.                         tmp1=0;
  358.                         memset(disp0,0x00,25);
  359.                         Lcd_Puts(0,2,disp0);
  360.                 }
  361.                 sprintf(disp0,"%04d",Meter_Ec);
  362.                 Lcd_Puts(0,2,disp0);
  363.                 Lcd_FlickerChar(tmp1,2);
  364.                 delay_ms(300);
  365.         }
  366. //进入电流放大倍数设置界面
  367.         while(PAin(3)==0);
  368.         Lcd_Puts(0,1,"Enter I Amp Factor");
  369.         memset(disp0,0x00,25);
  370.         sprintf(disp0,"%+07.1f",PhaseA.I_Amp_Factor);
  371.         Lcd_Puts(0,2,"                   ");
  372.         tmp1=1;
  373.         tmp2=3.0;
  374.         Lcd_FlickerChar(tmp1,2);
  375.         while(PAin(3)!=0)                //key4按下表示退出电流放大倍数设置界面
  376.         {
  377.                 if(PAin(0)==0)
  378.                 {
  379.                         delay_ms(300);
  380.                         if(PhaseA.I_Amp_Factor>=0)
  381.                                 PhaseA.I_Amp_Factor=PhaseA.I_Amp_Factor+(1*pow(10,tmp2));                //设置值递增 key1按下递增
  382.                         else
  383.                                 PhaseA.I_Amp_Factor=PhaseA.I_Amp_Factor-(1*pow(10,tmp2));                //设置值递增 key1按下递增
  384.                 }
  385.                 if(PAin(2)==0)
  386.                 {
  387.                         delay_ms(300);
  388.                         if(PhaseA.I_Amp_Factor>=0)
  389.                                 PhaseA.I_Amp_Factor=PhaseA.I_Amp_Factor-(1*pow(10,tmp2));                //设置值递减
  390.                         else
  391.                                 PhaseA.I_Amp_Factor=PhaseA.I_Amp_Factor+(1*pow(10,tmp2));                //设置值递增 key1按下递增
  392.                 }
  393.                 if(PAin(1)==0)                //个十百千位调整和显示光标调整 key2按下递减
  394.                 {
  395.                         delay_ms(300);
  396.                         tmp2--;
  397.                         tmp1++;
  398.                         if(tmp1==5)
  399.                                 tmp1++;                //如果光标在小数位,移位到下一位
  400.                         if(tmp1>6)
  401.                         {
  402.                                 tmp1=1;                //防止设置参数溢出千位
  403.                                 tmp2=3.0;
  404.                         }
  405.                 }
  406.                 if((PhaseA.I_Amp_Factor>9999.9)||(PhaseA.I_Amp_Factor<-9999.9))                 //防止常数设置错误,恢复默认值1,电流最大放大999倍
  407.                 {
  408.                         PhaseA.I_Amp_Factor=1.0;
  409.                         tmp2=3.0;
  410.                         tmp1=1;
  411.                         memset(disp0,0x00,25);
  412.                         Lcd_Puts(0,2,"                   ");
  413.                 }
  414.                 sprintf(disp0,"%+07.1f",PhaseA.I_Amp_Factor);
  415.                 Lcd_Puts(0,2,disp0);
  416.                 Lcd_FlickerChar(tmp1,2);
  417.                 delay_ms(300);
  418.         }
  419. //进入设置电压放大倍数界面
  420.         while(PAin(3)==0);
  421.         Lcd_Puts(0,1,"Enter V Amp Factor");
  422.         memset(disp0,0x00,25);
  423.         sprintf(disp0,"%+07.1f",PhaseA.V_Amp_Factor);
  424.         Lcd_Puts(0,2,"                   ");
  425.         tmp1=1;
  426.         tmp2=3.0;
  427.         Lcd_FlickerChar(tmp1,2);
  428.         while(PAin(3)!=0)                //key4按下表示退出电压放大倍数设置界面
  429.         {
  430.                 if(PAin(0)==0)
  431.                 {
  432.                         delay_ms(300);
  433.                         if(PhaseA.V_Amp_Factor>=0)
  434.                                 PhaseA.V_Amp_Factor=PhaseA.V_Amp_Factor+(1*pow(10,tmp2));                //设置值递增 key1按下递增
  435.                         else
  436.                                 PhaseA.V_Amp_Factor=PhaseA.V_Amp_Factor-(1*pow(10,tmp2));                //设置值递增 key1按下递增
  437.                 }
  438.                 if(PAin(2)==0)
  439.                 {
  440.                         delay_ms(300);
  441.                         if(PhaseA.V_Amp_Factor>=0)
  442.                                 PhaseA.V_Amp_Factor=PhaseA.V_Amp_Factor-(1*pow(10,tmp2));                //设置值递减 key3按下递减
  443.                         else
  444.                                 PhaseA.V_Amp_Factor=PhaseA.V_Amp_Factor+(1*pow(10,tmp2));                //设置值递增 key1按下递增
  445.                 }
  446.                 if(PAin(1)==0)                //个十百千位调整和显示光标调整 key2按下
  447.                 {
  448.                         delay_ms(300);
  449.                         tmp2--;
  450.                         tmp1++;
  451.                         if(tmp1==5)
  452.                                 tmp1++;                //如果光标在小数位,移位到下一位
  453.                         if(tmp1>6)
  454.                         {
  455.                                 tmp1=1;                //防止设置参数溢出千位
  456.                                 tmp2=3.0;
  457.                         }
  458.                 }
  459.                 if((PhaseA.V_Amp_Factor>9999.0)||(PhaseA.V_Amp_Factor<-9999.9))                 //防止常数设置错误,恢复默认值1,电压最大放大9999.9倍
  460.                 {
  461.                         PhaseA.V_Amp_Factor=1.0;
  462.                         tmp2=3.0;
  463.                         tmp1=1;
  464.                         memset(disp0,0x00,25);
  465.                         Lcd_Puts(0,2,"                   ");
  466.                 }
  467.                 sprintf(disp0,"%+07.1f",PhaseA.V_Amp_Factor);
  468.                 Lcd_Puts(0,2,disp0);
  469.                 Lcd_FlickerChar(tmp1,2);
  470.                 delay_ms(300);
  471.         }
  472. //进入A相功率增益补偿设置界面
  473.         while(PAin(3)==0);
  474.         Lcd_Puts(0,1,"                   ");
  475.         Lcd_Puts(0,1,"Enter Pga");
  476.         memset(disp0,'0',25);
  477.         sprintf(disp0,"%+04.2f",PhaseA.P_Gain_compensation);
  478.         Lcd_Puts(0,2,"                   ");
  479.         tmp1=1;
  480.         tmp2=0.0;
  481.         Lcd_FlickerChar(tmp1,2);
  482.         while(PAin(3)!=0)                //key4按下表示退出功率增益设置界面
  483.         {
  484.                 if(PAin(0)==0)
  485.                 {
  486.                         delay_ms(300);
  487.                         if(PhaseA.P_Gain_compensation>=0)
  488.                                 PhaseA.P_Gain_compensation=PhaseA.P_Gain_compensation+(1*pow(10,tmp2));                //设置值递增 key1按下递增
  489.                         else
  490.                                 PhaseA.P_Gain_compensation=PhaseA.P_Gain_compensation-(1*pow(10,tmp2));                //设置值递增 key1按下递增
  491.                 }
  492.                 if(PAin(2)==0)
  493.                 {
  494.                         delay_ms(300);
  495.                         if(PhaseA.P_Gain_compensation>=0)
  496.                                 PhaseA.P_Gain_compensation=PhaseA.P_Gain_compensation-(1*pow(10,tmp2));                //设置值递减
  497.                         else
  498.                                 PhaseA.P_Gain_compensation=PhaseA.P_Gain_compensation+(1*pow(10,tmp2));                //设置值递减
  499.                 }
  500.                 if(PAin(1)==0)                //个十百千位调整和显示光标调整 key2按下递减
  501.                 {
  502.                         delay_ms(300);
  503.                         tmp2--;
  504.                         tmp1++;
  505.                         if(tmp1==2)
  506.                                 tmp1++;                //如果光标在小数位,移位到下一位
  507.                         if(tmp1>4)
  508.                         {
  509.                                 tmp1=1;                //防止设置参数溢出
  510.                                 tmp2=0.0;
  511.                         }
  512.                 }
  513.                 if((PhaseA.P_Gain_compensation>+9.9)||(PhaseA.P_Gain_compensation<-9.9))                 //防止常数设置错误,恢复默认值0.0
  514.                 {
  515.                         PhaseA.P_Gain_compensation=0.0;
  516.                         tmp2=0.0;
  517.                         tmp1=1;
  518.                         memset(disp0,0x00,25);
  519.                         Lcd_Puts(0,2,"                   ");
  520.                 }
  521.                 sprintf(disp0,"%+04.2f",PhaseA.P_Gain_compensation);
  522.                 Lcd_Puts(0,2,disp0);
  523.                 Lcd_FlickerChar(tmp1,2);
  524.                 delay_ms(300);
  525.         }
  526. //A相相位校正界面
  527.         while(PAin(3)==0);
  528.         Lcd_Puts(0,1,"                   ");
  529.         Lcd_Puts(0,1,"Enter Pha");
  530.         memset(disp0,'0',25);
  531.         sprintf(disp0,"%+04.2f",PhaseA.Ph_compensation);
  532.         Lcd_Puts(0,2,"                   ");
  533.         tmp1=1;
  534.         tmp2=0.0;
  535.         Lcd_FlickerChar(tmp1,2);
  536.         while(PAin(3)!=0)                //key4按下表示退出相位设置界面
  537.         {
  538.                 if(PAin(0)==0)
  539.                 {
  540.                         delay_ms(300);
  541.                         if(PhaseA.Ph_compensation>=0)
  542.                                 PhaseA.Ph_compensation=PhaseA.Ph_compensation+(1*pow(10,tmp2));                //设置值递增 key1按下递增
  543.                         else
  544.                                 PhaseA.Ph_compensation=PhaseA.Ph_compensation-(1*pow(10,tmp2));                //设置值递增 key1按下递增
  545.                 }
  546.                 if(PAin(2)==0)
  547.                 {
  548.                         delay_ms(300);
  549.                         if(PhaseA.Ph_compensation>=0)
  550.                                 PhaseA.Ph_compensation=PhaseA.Ph_compensation-(1*pow(10,tmp2));                //设置值递减
  551.                         else
  552.                                 PhaseA.Ph_compensation=PhaseA.Ph_compensation+(1*pow(10,tmp2));                //设置值递减
  553.                 }
  554.                 if(PAin(1)==0)                //个十百千位调整和显示光标调整 key2按下递减
  555.                 {
  556.                         delay_ms(300);
  557.                         tmp2--;
  558.                         tmp1++;
  559.                         if(tmp1==2)
  560.                                 tmp1++;                //如果光标在小数位,移位到下一位
  561.                         if(tmp1>4)
  562.                         {
  563.                                 tmp1=1;                //防止设置参数溢出
  564.                                 tmp2=0.0;
  565.                         }
  566.                 }
  567.                 if((PhaseA.Ph_compensation>+2.0)||(PhaseA.Ph_compensation<-2.0))                 //防止常数设置错误,恢复默认值0.0
  568.                 {
  569.                         PhaseA.Ph_compensation=0.0;
  570.                         tmp2=0.0;
  571.                         tmp1=1;
  572.                         memset(disp0,0x00,25);
  573.                         Lcd_Puts(0,2,"                   ");
  574.                 }
  575.                 sprintf(disp0,"%+04.2f",PhaseA.Ph_compensation);
  576.                 Lcd_Puts(0,2,disp0);
  577.                 Lcd_FlickerChar(tmp1,2);
  578.                 delay_ms(300);
  579.         }
  580. }


  581. void B_Phase_Cal(void)                //B相校表程序
  582. {
  583.         u8 tmp = 0,tmp1=0;                                         //临时变量
  584.         float tmp2=0.0;                         //临时变量,作为校表时控制当前位数用

  585.         Lcd_Puts(0,0,"B phase Adjust");
  586.         delay_ms(1000);
  587. //进入校表显示界面,先输入电表常数
  588.         Lcd_Puts(0,1,"Enter Meter EC");
  589.         memset(disp0,'0',25);
  590.         sprintf(disp0,"%d",Meter_Ec);
  591.         Lcd_Puts(0,2,"                   ");
  592.         tmp1=0;
  593.         tmp=3;
  594.         Lcd_FlickerChar(tmp1,2);
  595.         while(PAin(3)!=0)                //key4按下表示退出电表常数设置界面
  596.         {
  597.                 if(PAin(0)==0)
  598.                 {
  599.                         delay_ms(300);
  600.                         Meter_Ec=Meter_Ec+(1*pow(10,tmp));                //设置值递增 key1按下递增
  601.                 }
  602.                 if(PAin(2)==0)
  603.                 {
  604.                         delay_ms(300);
  605.                         Meter_Ec=Meter_Ec-(1*pow(10,tmp));                //设置值递减
  606.                 }
  607.                 if(PAin(1)==0)                //个十百千位调整和显示光标调整 key2按下递减
  608.                 {
  609.                         delay_ms(300);
  610.                         tmp--;
  611.                         tmp1++;
  612.                         if(tmp1>3)
  613.                         {
  614.                                 tmp1=0;                //防止设置参数溢出千位
  615.                                 tmp=3;
  616.                         }
  617.                 }
  618.                 if((Meter_Ec>9999)||(Meter_Ec<1))                 //防止常数设置错误,恢复默认值3200
  619.                 {
  620.                         Meter_Ec=3200;
  621.                         tmp=3;
  622.                         tmp1=0;
  623.                         memset(disp0,0x00,25);
  624.                         Lcd_Puts(0,2,disp0);
  625.                 }
  626.                 sprintf(disp0,"%04d",Meter_Ec);
  627.                 Lcd_Puts(0,2,disp0);
  628.                 Lcd_FlickerChar(tmp1,2);
  629.                 delay_ms(300);
  630.         }
  631. //进入电流放大倍数设置界面
  632.         while(PAin(3)==0);
  633.         Lcd_Puts(0,1,"Enter I Amp Factor");
  634.         memset(disp0,0x00,25);
  635.         sprintf(disp0,"%+07.1f",PhaseB.I_Amp_Factor);
  636.         Lcd_Puts(0,2,"                   ");
  637.         tmp1=1;
  638.         tmp2=3.0;
  639.         Lcd_FlickerChar(tmp1,2);
  640.         while(PAin(3)!=0)                //key4按下表示退出电流放大倍数设置界面
  641.         {
  642.                 if(PAin(0)==0)
  643.                 {
  644.                         delay_ms(300);
  645.                         if(PhaseB.I_Amp_Factor>=0)
  646.                                 PhaseB.I_Amp_Factor=PhaseB.I_Amp_Factor+(1*pow(10,tmp2));                //设置值递增 key1按下递增
  647.                         else
  648.                                 PhaseB.I_Amp_Factor=PhaseB.I_Amp_Factor-(1*pow(10,tmp2));                //设置值递增 key1按下递增
  649.                 }
  650.                 if(PAin(2)==0)
  651.                 {
  652.                         delay_ms(300);
  653.                         if(PhaseB.I_Amp_Factor>=0)
  654.                                 PhaseB.I_Amp_Factor=PhaseB.I_Amp_Factor-(1*pow(10,tmp2));                //设置值递减
  655.                         else
  656.                                 PhaseB.I_Amp_Factor=PhaseB.I_Amp_Factor+(1*pow(10,tmp2));                //设置值递增 key1按下递增
  657.                 }
  658.                 if(PAin(1)==0)                //个十百千位调整和显示光标调整 key2按下递减
  659.                 {
  660.                         delay_ms(300);
  661.                         tmp2--;
  662.                         tmp1++;
  663.                         if(tmp1==5)
  664.                                 tmp1++;                //如果光标在小数位,移位到下一位
  665.                         if(tmp1>6)
  666.                         {
  667.                                 tmp1=1;                //防止设置参数溢出千位
  668.                                 tmp2=3.0;
  669.                         }
  670.                 }
  671.                 if((PhaseB.I_Amp_Factor>9999.9)||(PhaseB.I_Amp_Factor<-9999.9))                 //防止常数设置错误,恢复默认值1,电流最大放大999倍
  672.                 {
  673.                         PhaseB.I_Amp_Factor=1.0;
  674.                         tmp2=3.0;
  675.                         tmp1=1;
  676.                         memset(disp0,0x00,25);
  677.                         Lcd_Puts(0,2,"                   ");
  678.                 }
  679.                 sprintf(disp0,"%+07.1f",PhaseB.I_Amp_Factor);
  680.                 Lcd_Puts(0,2,disp0);
  681.                 Lcd_FlickerChar(tmp1,2);
  682.                 delay_ms(300);
  683.         }
  684. //进入设置电压放大倍数界面
  685.         while(PAin(3)==0);
  686.         Lcd_Puts(0,1,"Enter V Amp Factor");
  687.         memset(disp0,0x00,25);
  688.         sprintf(disp0,"%+07.1f",PhaseB.V_Amp_Factor);
  689.         Lcd_Puts(0,2,"                   ");
  690.         tmp1=1;
  691.         tmp2=3.0;
  692.         Lcd_FlickerChar(tmp1,2);
  693.         while(PAin(3)!=0)                //key4按下表示退出电压放大倍数设置界面
  694.         {
  695.                 if(PAin(0)==0)
  696.                 {
  697.                         delay_ms(300);
  698.                         if(PhaseB.V_Amp_Factor>=0)
  699.                                 PhaseB.V_Amp_Factor=PhaseB.V_Amp_Factor+(1*pow(10,tmp2));                //设置值递增 key1按下递增
  700.                         else
  701.                                 PhaseB.V_Amp_Factor=PhaseB.V_Amp_Factor-(1*pow(10,tmp2));                //设置值递增 key1按下递增
  702.                 }
  703.                 if(PAin(2)==0)
  704.                 {
  705.                         delay_ms(300);
  706.                         if(PhaseB.V_Amp_Factor>=0)
  707.                                 PhaseB.V_Amp_Factor=PhaseB.V_Amp_Factor-(1*pow(10,tmp2));                //设置值递减 key3按下递减
  708.                         else
  709.                                 PhaseB.V_Amp_Factor=PhaseB.V_Amp_Factor+(1*pow(10,tmp2));                //设置值递增 key1按下递增
  710.                 }
  711.                 if(PAin(1)==0)                //个十百千位调整和显示光标调整 key2按下
  712.                 {
  713.                         delay_ms(300);
  714.                         tmp2--;
  715.                         tmp1++;
  716.                         if(tmp1==5)
  717.                                 tmp1++;                //如果光标在小数位,移位到下一位
  718.                         if(tmp1>6)
  719.                         {
  720.                                 tmp1=1;                //防止设置参数溢出千位
  721.                                 tmp2=3.0;
  722.                         }
  723.                 }
  724.                 if((PhaseB.V_Amp_Factor>9999.0)||(PhaseB.V_Amp_Factor<-9999.9))                 //防止常数设置错误,恢复默认值1,电压最大放大9999.9倍
  725.                 {
  726.                         PhaseB.V_Amp_Factor=1.0;
  727.                         tmp2=3.0;
  728.                         tmp1=1;
  729.                         memset(disp0,0x00,25);
  730.                         Lcd_Puts(0,2,"                   ");
  731.                 }
  732.                 sprintf(disp0,"%+07.1f",PhaseB.V_Amp_Factor);
  733.                 Lcd_Puts(0,2,disp0);
  734.                 Lcd_FlickerChar(tmp1,2);
  735.                 delay_ms(300);
  736.         }
  737. //进入B相功率增益补偿设置界面
  738.         while(PAin(3)==0);
  739.         Lcd_Puts(0,1,"                   ");
  740.         Lcd_Puts(0,1,"Enter Pga");
  741.         memset(disp0,'0',25);
  742.         sprintf(disp0,"%+04.2f",PhaseB.P_Gain_compensation);
  743.         Lcd_Puts(0,2,"                   ");
  744.         tmp1=1;
  745.         tmp2=0.0;
  746.         Lcd_FlickerChar(tmp1,2);
  747.         while(PAin(3)!=0)                //key4按下表示退出功率增益设置界面
  748.         {
  749.                 if(PAin(0)==0)
  750.                 {
  751.                         delay_ms(300);
  752.                         if(PhaseB.P_Gain_compensation>=0)
  753.                                 PhaseB.P_Gain_compensation=PhaseB.P_Gain_compensation+(1*pow(10,tmp2));                //设置值递增 key1按下递增
  754.                         else
  755.                                 PhaseB.P_Gain_compensation=PhaseB.P_Gain_compensation-(1*pow(10,tmp2));                //设置值递增 key1按下递增
  756.                 }
  757.                 if(PAin(2)==0)
  758.                 {
  759.                         delay_ms(300);
  760.                         if(PhaseB.P_Gain_compensation>=0)
  761.                                 PhaseB.P_Gain_compensation=PhaseB.P_Gain_compensation-(1*pow(10,tmp2));                //设置值递减
  762.                         else
  763.                                 PhaseB.P_Gain_compensation=PhaseB.P_Gain_compensation+(1*pow(10,tmp2));                //设置值递减
  764.                 }
  765.                 if(PAin(1)==0)                //个十百千位调整和显示光标调整 key2按下递减
  766.                 {
  767.                         delay_ms(300);
  768.                         tmp2--;
  769.                         tmp1++;
  770.                         if(tmp1==2)
  771.                                 tmp1++;                //如果光标在小数位,移位到下一位
  772.                         if(tmp1>4)
  773.                         {
  774.                                 tmp1=1;                //防止设置参数溢出
  775.                                 tmp2=0.0;
  776.                         }
  777.                 }
  778.                 if((PhaseB.P_Gain_compensation>+9.9)||(PhaseB.P_Gain_compensation<-9.9))                 //防止常数设置错误,恢复默认值0.0
  779.                 {
  780.                         PhaseB.P_Gain_compensation=0.0;
  781.                         tmp2=0.0;
  782.                         tmp1=1;
  783.                         memset(disp0,0x00,25);
  784.                         Lcd_Puts(0,2,"                   ");
  785.                 }
  786.                 sprintf(disp0,"%+04.2f",PhaseB.P_Gain_compensation);
  787.                 Lcd_Puts(0,2,disp0);
  788.                 Lcd_FlickerChar(tmp1,2);
  789.                 delay_ms(300);
  790.         }
  791. //B相相位校正界面
  792.         while(PAin(3)==0);
  793.         Lcd_Puts(0,1,"                   ");
  794.         Lcd_Puts(0,1,"Enter Pha");
  795.         memset(disp0,'0',25);
  796.         sprintf(disp0,"%+04.2f",PhaseB.Ph_compensation);
  797.         Lcd_Puts(0,2,"                   ");
  798.         tmp1=1;
  799.         tmp2=0.0;
  800.         Lcd_FlickerChar(tmp1,2);
  801.         while(PAin(3)!=0)                //key4按下表示退出相位设置界面
  802.         {
  803.                 if(PAin(0)==0)
  804.                 {
  805.                         delay_ms(300);
  806.                         if(PhaseB.Ph_compensation>=0)
  807.                                 PhaseB.Ph_compensation=PhaseB.Ph_compensation+(1*pow(10,tmp2));                //设置值递增 key1按下递增
  808.                         else
  809.                                 PhaseB.Ph_compensation=PhaseB.Ph_compensation-(1*pow(10,tmp2));                //设置值递增 key1按下递增
  810.                 }
  811.                 if(PAin(2)==0)
  812.                 {
  813.                         delay_ms(300);
  814.                         if(PhaseB.Ph_compensation>=0)
  815.                                 PhaseB.Ph_compensation=PhaseB.Ph_compensation-(1*pow(10,tmp2));                //设置值递减
  816.                         else
  817.                                 PhaseB.Ph_compensation=PhaseB.Ph_compensation+(1*pow(10,tmp2));                //设置值递减
  818.                 }
  819.                 if(PAin(1)==0)                //个十百千位调整和显示光标调整 key2按下递减
  820.                 {
  821.                         delay_ms(300);
  822.                         tmp2--;
  823.                         tmp1++;
  824.                         if(tmp1==2)
  825.                                 tmp1++;                //如果光标在小数位,移位到下一位
  826.                         if(tmp1>4)
  827.                         {
  828.                                 tmp1=1;                //防止设置参数溢出
  829.                                 tmp2=0.0;
  830.                         }
  831.                 }
  832.                 if((PhaseB.Ph_compensation>+2.0)||(PhaseB.Ph_compensation<-2.0))                 //防止常数设置错误,恢复默认值0.0
  833.                 {
  834.                         PhaseB.Ph_compensation=0.0;
  835.                         tmp2=0.0;
  836.                         tmp1=1;
  837.                         memset(disp0,0x00,25);
  838.                         Lcd_Puts(0,2,"                   ");
  839.                 }
  840.                 sprintf(disp0,"%+04.2f",PhaseB.Ph_compensation);
  841.                 Lcd_Puts(0,2,disp0);
  842.                 Lcd_FlickerChar(tmp1,2);
  843.                 delay_ms(300);
  844.         }
  845. }

  846. int main(void)
  847. {
  848. //          u8 t;
  849. //         u8 len;
  850.         delay_init();                     //延时函数初始化
  851.         NVIC_Configuration();          //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
  852.         uart_init(9600);         //串口初始化为9600
  853. //         RTC_Init();                                  //RTC初始化
  854.         KEY_Init();          //初始化与按键连接的硬件接口
  855.         Lcd_Init();/*LCD初始化*/
  856.         I2C_Configuration();    //初始化at24c256的scl、sda管脚


  857.         Lcd_Clr();

  858.   I2C_PageWrite(test,8,2,ADDR_24LC02);                //EEPROM存储功能测试
  859.         I2C_ReadByte(test2,8,2,ADDR_24LC02);
  860.         /* 初始化ATT7022 */
  861.         printf("\r\nInitializing ATT7022E...\r\n");
  862.         ATT7022_Init();
  863.         printf("\r\nFinish!\r\n");

  864.         printf("\r\nAdjusting ATT7022E...\r\n");
  865.         ATT_Adjust();
  866.         printf("\r\nFinish!\r\n");

  867. //         ATT_Test();


  868.          while(1)
  869.         {
  870.                 Read_ATT_AData();
  871.                 Read_ATT_BData();
  872.                 Read_ATT_CData();
  873.                 switch (ABC_Phase_val)        //根据key1设置显示某一相参数
  874.                 {
  875.                         case 'A':
  876.                                 Lcd_Clr();
  877.                                 sprintf(disp0,"A phase:");
  878.                                 Lcd_Puts(7,0,disp0);
  879.                                 Output_ATT(ADataTypeDef);
  880.                                 delay_ms(300);
  881.                                 break;
  882.                         case 'B':
  883.                                 Lcd_Clr();
  884.                                 sprintf(disp0,"B phase:");
  885.                                 Lcd_Puts(7,0,disp0);
  886.                                 Output_ATT(BDataTypeDef);
  887.                                 delay_ms(300);
  888.                                 break;
  889.                         case 'C':
  890.                                 Lcd_Clr();
  891.                                 sprintf(disp0,"C phase:");
  892.                                 Lcd_Puts(7,0,disp0);
  893.                                 Output_ATT(CDataTypeDef);
  894.                                 delay_ms(300);
  895.                                 break;
  896.                         default:
  897.                                 break;
  898.                 }
  899.                 if(PAin(0)==0)                                //切换相参数显示
  900.                 {
  901.                         ABC_Phase_val++;
  902.                 }
  903.                 if(ABC_Phase_val>'C')        //确保显示变量在ABC三相之间
  904.                         ABC_Phase_val='A';
  905. //进入设置校表参数界面
  906.                 if(PAin(3)==0)                                //key4按下,表示执行输入校表参数
  907.                 {
  908.                         while(PAin(3)==0);
  909.                         Lcd_Clr();
  910.                         Lcd_Puts(0,0,"7022E Adjust");
  911.                         delay_ms(1000);
  912.                         A_Phase_Cal();                //设置A相校表参数
  913.                         B_Phase_Cal();                //设置B相校表参数
  914.                         C_Phase_Cal();                //设置C相校表参数
  915.                 }

  916.                 Lcd_CloseFlicker();
  917.         }
  918. }
复制代码

出0入0汤圆

发表于 2014-8-25 16:54:55 | 显示全部楼层
yijingkun 发表于 2014-8-25 16:43
项目正在做,没法全部代码都公开,就把main、7022.c、7022.H放上来吧,事先说明,不是我原创的,核心的7022 ...

   楼主有对应的原理图吗? 老夫刚做完cs5463, 单相测的马马虎虎!来学习学习3相的~

出155入0汤圆

 楼主| 发表于 2014-8-25 17:07:39 | 显示全部楼层
抱歉,项目还没完呢,不方便太公开了

出0入0汤圆

发表于 2014-11-17 10:03:57 | 显示全部楼层
楼主大神,能指导一下吗?我现在也要做这个项目,刚毕业出来不久,什么都不会啊就直接叫我做这个项目,没人带苦逼啊!看了7022的用户手册也不知如何下手,先谢谢啊!

出155入0汤圆

 楼主| 发表于 2014-11-17 10:50:45 | 显示全部楼层
Z_Jian 发表于 2014-11-17 10:03
楼主大神,能指导一下吗?我现在也要做这个项目,刚毕业出来不久,什么都不会啊就直接叫我做这个项目,没人 ...

有什么问题吗,具体点

出0入0汤圆

发表于 2014-11-17 13:28:44 | 显示全部楼层
yijingkun 发表于 2014-11-17 10:50
有什么问题吗,具体点

就是看了用户手册不知如何去编程,仪器规格要求有各项指标什么精度、范围、量程等,看得晕晕的,不知如何根据手册去转化为项目的那些要求,我是完全菜鸟一个,刚出来又没人指导!

出155入0汤圆

 楼主| 发表于 2014-11-17 15:31:31 | 显示全部楼层
Z_Jian 发表于 2014-11-17 13:28
就是看了用户手册不知如何去编程,仪器规格要求有各项指标什么精度、范围、量程等,看得晕晕的,不知如何 ...

那你还是先了解背景知识吧,网上搜搜,这不是一两句话说得清楚的

出0入0汤圆

发表于 2014-11-17 15:48:03 | 显示全部楼层
yijingkun 发表于 2014-11-17 15:31
那你还是先了解背景知识吧,网上搜搜,这不是一两句话说得清楚的

您好,那能加你q请教请教吗?

出155入0汤圆

 楼主| 发表于 2014-11-17 15:52:52 | 显示全部楼层
抱歉,工作比较忙。有个7022的QQ群,是代理建的,你可以在里面提问。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-11-17 20:23:18 | 显示全部楼层
yijingkun 发表于 2014-11-17 15:52
抱歉,工作比较忙。有个7022的QQ群,是代理建的,你可以在里面提问。

好的,谢谢!

出0入0汤圆

发表于 2014-11-18 23:41:00 | 显示全部楼层
yijingkun 发表于 2014-11-17 15:52
抱歉,工作比较忙。有个7022的QQ群,是代理建的,你可以在里面提问。

楼主您好,请教你一下程序问题,在7022.h中,结构体中    float Rp;     float Rq; float Rs;  float Rurms;   float Rirms; float Rpf;  float Rfreq;这几个变量是什么意思呢?
7022.c中各相常用数据读取函数如void Read_ATT_AData(void)中if(ADataTypeDef.P>0x800000){

208.                ADataTypeDef.Rp=0x1000000-ADataTypeDef.P;

209.                ADataTypeDef.Rp=-((ADataTypeDef.Rp*Meter_K*fabs(PhaseA.I_Amp_Factor)*fabs(PhaseA.V_Amp_Factor))\

210.                -((ADataTypeDef.Rp*Meter_K*fabs(PhaseA.I_Amp_Factor)*fabs(PhaseA.V_Amp_Factor))*PhaseA.P_Gain_compensation));    //   2^15/2^23

211.        }

212.        else

213.                ADataTypeDef.Rp=(ADataTypeDef.P*Meter_K*fabs(PhaseA.I_Amp_Factor)*fabs(PhaseA.V_Amp_Factor))\

214.                -((ADataTypeDef.P*Meter_K*fabs(PhaseA.I_Amp_Factor)*fabs(PhaseA.V_Amp_Factor))*PhaseA.P_Gain_compensation);

215.        if(ADataTypeDef.Q>0x800000){

216.                ADataTypeDef.Rq=0x1000000-ADataTypeDef.Q;

217.                ADataTypeDef.Rq=-((ADataTypeDef.Rq*Meter_K*fabs(PhaseA.I_Amp_Factor)*fabs(PhaseA.V_Amp_Factor))\

218.                -((ADataTypeDef.Rq*Meter_K*fabs(PhaseA.I_Amp_Factor)*fabs(PhaseA.V_Amp_Factor))*PhaseA.P_Gain_compensation));

219.        }

220.        else

221.                ADataTypeDef.Rq=(ADataTypeDef.Q*Meter_K*fabs(PhaseA.I_Amp_Factor)*fabs(PhaseA.V_Amp_Factor))\

222.                -((ADataTypeDef.Q*Meter_K*fabs(PhaseA.I_Amp_Factor)*fabs(PhaseA.V_Amp_Factor))*PhaseA.P_Gain_compensation);

223.        ADataTypeDef.Rs=ADataTypeDef.S/256.0;

224.        ADataTypeDef.Rurms=ADataTypeDef.URms/8192.0*PhaseA.V_Amp_Factor;   //   2^10/2^23

225.        ADataTypeDef.Rirms=ADataTypeDef.IRms/8192.0*PhaseA.I_Amp_Factor;

226.        if(ADataTypeDef.Pf>0x800000){

227.                ADataTypeDef.Rpf=0x1000000-ADataTypeDef.Pf;

228.                ADataTypeDef.Rpf=-((ADataTypeDef.Rpf/8388608.0)-((ADataTypeDef.Rpf/8388608.0)*PhaseA.Ph_compensation));

229.        }

230.        else

231.                ADataTypeDef.Rpf=(ADataTypeDef.Pf/8388608.0)-((ADataTypeDef.Pf/8388608.0)*PhaseA.Ph_compensation);

232.        ADataTypeDef.Rfreq=ADataTypeDef.Freq/8192.0;

233.

234.//         Lcd_Clr();

235.//         sprintf(disp0,"A phase:");

236.//         Lcd_Puts(7,0,disp0);

237.//        Output_ATT(ADataTypeDef);
这些什么得来的呢?是根据什么哪里运算的呢?麻烦指导一下,谢谢!!

出155入0汤圆

 楼主| 发表于 2014-11-19 14:59:36 | 显示全部楼层
本帖最后由 yijingkun 于 2014-11-19 15:12 编辑
Z_Jian 发表于 2014-11-18 23:41
楼主您好,请教你一下程序问题,在7022.h中,结构体中    float Rp;     float Rq; float Rs;  float Rur ...


RP、RQ是有功和无功,RS是视在功率,其它的你需要仔细看7022的文档,到钜泉的官网去下载吧。

另外也可以到pudn这个网站找找7022的代码

出0入0汤圆

发表于 2014-11-19 15:23:50 | 显示全部楼层
yijingkun 发表于 2014-11-19 14:59
RP、RQ是有功和无功,RS是视在功率,其它的你需要仔细看7022的文档,到钜泉的官网去下载吧。

另外也可以 ...

那么P、Q、S又是什么变量呢?还有那个u32 URms;  float Rurms;和u32 IRms;  float Rirms;为什么有两个呢?是电压电流有效值和真有效值?
void Read_ATT_AData(void)函数是根据手册里来的吗?我看的是ATT7022E,不知跟ATT7022是不是差不多的,两者的计算方法一样吗?

出155入0汤圆

 楼主| 发表于 2014-11-19 17:17:14 | 显示全部楼层
Z_Jian 发表于 2014-11-19 15:23
那么P、Q、S又是什么变量呢?还有那个u32 URms;  float Rurms;和u32 IRms;  float Rirms;为什么有两个呢 ...

建议你仔细看7022E的手册,至于程序上的问题,你先通读三遍7022e的手册,带着问题去看之后,应该会明白的

出0入0汤圆

发表于 2014-11-19 17:37:39 | 显示全部楼层
yijingkun 发表于 2014-11-19 17:17
建议你仔细看7022E的手册,至于程序上的问题,你先通读三遍7022e的手册,带着问题去看之后,应该会明白的 ...

好的,其实我都读至少有3遍手册啦,不过只要是那份手册上就能解决的那就行了,谢谢啦!

出0入0汤圆

发表于 2014-11-21 16:05:02 | 显示全部楼层
yijingkun 发表于 2014-7-10 15:49
先谢谢你的答复,我就是这段看不明白:

如果X>2^23,则XX=X-2^24

楼主大神你好,关于X,XX,和xxx这里我也不懂,请问是什么意思呢?为什么跟程序中不一样的?

出0入0汤圆

发表于 2018-1-9 18:14:41 | 显示全部楼层
binghe167 发表于 2014-7-10 15:30
#define Meter_Ib        5.0                        //基本电流
#define Meter_Im        50.0                //最大电流
#define Meter_CT        5000.0                //互感 ...

大咖能加qq吗,我现在正在做att7022e的毕业设计

出0入8汤圆

发表于 2018-6-30 11:04:02 | 显示全部楼层
我的读出三相电流  ID都有读数 ,其他的都是0  什么鬼

出0入8汤圆

发表于 2018-6-30 15:59:34 | 显示全部楼层
binghe167 发表于 2014-7-10 15:28
ATT7022E/26E/28E功率寄存器采用补码形式给出,最高位是符号位,所以根据ATT7022E/26E/28E
功率寄存器给出 ...

这个芯片的文档看起来真费劲

首先要算x,算x需要k

计算需要k

算 k需要 HF  和EC

HF从哪来的  

EC是什么鬼, 应该是多少
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 08:31

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表