|
楼主 |
发表于 2014-8-25 16:43:31
|
显示全部楼层
项目正在做,没法全部代码都公开,就把main、7022.c、7022.H放上来吧,事先说明,不是我原创的,核心的7022代码,是从PUDN下载下来然后修改的,程序模板用的原子的战舰版的例程。
7022.h
- #ifndef _ATT7022_H_
- #define _ATT7022_H_
- #include "STM32F10X.h"
- #include "math.h"
- /*
- RST PC3
- CS PC6
- SCL PC7
- DIN PC8
- DOUT PC9 (DATA)
- */
- #define RST_Port GPIOB
- #define CS_Port GPIOB
- #define SCL_Port GPIOB
- #define DATA_Port GPIOB
- #define DIN_Port GPIOB
- #define RST_Pin GPIO_Pin_0
- #define CS_Pin GPIO_Pin_12
- #define SCL_Pin GPIO_Pin_13
- #define DATA_Pin GPIO_Pin_15
- #define DIN_Pin GPIO_Pin_14
- #define Set_CS GPIO_SetBits (CS_Port, CS_Pin)
- #define Clr_CS GPIO_ResetBits (CS_Port, CS_Pin)
- #define Rev_CS GPIO_WriteBit(CS_Port, CS_Pin, (BitAction)(1 - GPIO_ReadOutputDataBit(CS_Port, CS_Pin)))
- #define Set_SCL GPIO_SetBits (SCL_Port, SCL_Pin)
- #define Clr_SCL GPIO_ResetBits (SCL_Port, SCL_Pin)
- #define Rev_SCL GPIO_WriteBit(SCL_Port, SCL_Pin, (BitAction)(1 - GPIO_ReadOutputDataBit(SCL_Port, SCL_Pin)))
- #define Set_DATA GPIO_SetBits (DATA_Port, DATA_Pin)
- #define Clr_DATA GPIO_ResetBits (DATA_Port, DATA_Pin)
- #define Rev_DATA GPIO_WriteBit(DATA_Port, DATA_Pin, (BitAction)(1 - GPIO_ReadOutputDataBit(DATA_Port, DATA_Pin)))
- #define Set_RST GPIO_SetBits (RST_Port, RST_Pin)
- #define Clr_RST GPIO_ResetBits (RST_Port, RST_Pin)
- #define Rev_RST GPIO_WriteBit(RST_Port, LED54_Pin, (BitAction)(1 - GPIO_ReadOutputDataBit(RST_Port, RST_Pin)))
- #define Rd_MISO GPIO_ReadInputDataBit(DIN_Port, DIN_Pin)==1
- #define r_Pflag 0x3D //功率方向
- #define R_Sflag 0x2C //状态寄存器
- #define r_Pa 0x01
- #define r_Pb 0x02
- #define r_Pc 0x03
- #define r_Pt 0x04 //有功功率
- #define r_Qa 0x05
- #define r_Qb 0x06
- #define r_Qc 0x07
- #define r_Qt 0x08 //无功功率
- #define r_Sa 0x09
- #define r_Sb 0x0A
- #define r_Sc 0x0B
- #define r_St 0x0C //视在功率
- #define r_UaRms 0x0D
- #define r_UbRms 0x0E
- #define r_UcRms 0x0F
- #define r_UtRms 0x2B
- #define r_IaRms 0x10
- #define r_IbRms 0x11
- #define r_IcRms 0x12
- #define r_ItRms 0x13 //电压电流有效值
- #define r_Pfa 0x14
- #define r_Pfb 0x15
- #define r_Pfc 0x16
- #define r_Pft 0x17 //功率因数
- #define r_Freq 0x1C //线网频率
- #define r_Epa 0x1E
- #define r_Epb 0x1F
- #define r_Epc 0x20
- #define r_Ept 0x21 //累加型有功电能
- #define r_Eqa 0x22
- #define r_Eqb 0x23
- #define r_Eqc 0x24
- #define r_Eqt 0x25 //累加型无功电能
- #define r_Epa2 0x31
- #define r_Epb2 0x32
- #define r_Epc2 0x33
- #define r_Ept2 0x34 //清零型有功电能
- #define r_Eqa2 0x35
- #define r_Eqb2 0x36
- #define r_Eqc2 0x37
- #define r_Eqt2 0x38 //清零型无功电能
- #define HFconst 0xA0 //高频输出参数
- #define UADC 0xBF //电压通道增益
- #define UgainA 0x9B
- #define UgainB 0x9C
- #define UgainC 0x9D
- #define IgainA 0x1A
- #define IgainB 0x1B
- #define IgainC 0x1C //分相电压电流校准
- #define PgainB 0x05 //B相有功功率增益
- #define Vu 0.190 //电压通道采样电压
- #define Vi 0.003 //电流通道采样电压
- #define Un 220 //额定电压
- #define In 4.15 //额定电流
- #define Meter_G 1.163 //ATT7022E常数
- //#define Meter_HFConst ((2.592*1E10*Meter_G*Meter_G*Vu*Vi)/(In*Un*Meter_Ec))
- #define Meter_HFConst ((2.592*pow(10,10)*Meter_G*Meter_G*Vu*Vi)/(In*Un*Meter_Ec))
- #define Meter_K (2.592*pow(10,10)/(Meter_HFConst*Meter_Ec*pow(2,23)))
- extern u16 Meter_Ec; //电表常数
- // extern float I_Amp_Factor; //电流放大倍数
- // extern float V_Amp_Factor; //电压放大倍数
- // extern float Pa_Gain_compensation; //A相有功功率补偿系数
- // extern float Pha_compensation; //A相相位补偿补偿系数
- typedef struct
- {
- u32 P; //有功功率
- float Rp;
- u32 Q; //无功功率
- float Rq;
- u32 S; //视在功率
- float Rs;
- u32 URms; //电压有效值
- float Rurms;
- u32 IRms; //电流有效值
- float Rirms;
- u32 Pf; //功率因数
- float Rpf;
- u32 Freq; //线网频率
- float Rfreq;
- }DataTypeDef;
- extern DataTypeDef ADataTypeDef,BDataTypeDef,CDataTypeDef,TDataTypeDef;
- typedef struct
- {
- // u16 Meter_Ec; //电表常数
- float I_Amp_Factor; //电流放大倍数
- float V_Amp_Factor; //电压放大倍数
- float P_Gain_compensation; //A相有功功率补偿系数
- float Ph_compensation; //A相相位补偿补偿系数
- }Meter_Adj_Val_Stru_Def;
- extern Meter_Adj_Val_Stru_Def PhaseA,PhaseB,PhaseC;
- extern void delay_ms(u16 time);
- extern void delay_us(u32 nus);
- u32 SPI_ATT_Read(u8 data); // SIG --> Sflag.7
- void SPI_ATT_Write(u8 com_add,u32 data2);// 0xD3,0x000000 可进行软件复位
- void ATT7022_Init(void);
- void ATT_Adjust(void);
- void ATT_Test(void);
- void Read_ATT_AData(void);
- void Read_ATT_BData(void);
- void Read_ATT_CData(void);
- void Read_ATT_TData(void);
- void Output_ATT(DataTypeDef output);
- void Read_ATT_TestData(void);
- #endif
复制代码
7022.c
- #include "ATT7022.h"
- #include "stdio.h"
- #include "Lcd1602.h"
- extern int fputc(int ch, FILE *f);
- extern char disp0[25];
- extern char disp1[25];
- extern char disp2[25];
- extern char disp3[25];
- extern DataTypeDef ADataTypeDef,BDataTypeDef,CDataTypeDef,TDataTypeDef;
- DataTypeDef ADataTypeDef,BDataTypeDef,CDataTypeDef,TDataTypeDef;
- 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};
- u16 Meter_Ec = 3200; //电表常数
- //7022初始化
- void ATT7022_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//使能PORTA,PORTE时钟
- GPIO_InitStructure.GPIO_Pin = RST_Pin|CS_Pin|SCL_Pin|DATA_Pin;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //复用推挽输出
- GPIO_Init(GPIOB,&GPIO_InitStructure);
- Clr_SCL;
-
- GPIO_InitStructure.GPIO_Pin = DIN_Pin;
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
- GPIO_Init(DIN_Port,&GPIO_InitStructure);
- //硬件复位
- Clr_RST;
- delay_us(30);
- Set_RST;
- delay_us(600);
- }
- /*校表函数*/
- void ATT_Adjust(void)
- {
- u32 read1=0x55;
- SPI_ATT_Write(0xC3, 0x000000); //清校表数据
- SPI_ATT_Write(0xC9, 0x00005A); //打开校准数据写
- SPI_ATT_Write(0x01, 0xB9FE); //填写模式配置寄存器
- SPI_ATT_Write(0x03, 0xF804); //填写EMU单元配置寄存器
- SPI_ATT_Write(0x31, 0x3437); //填写模拟模块使能寄存器
- SPI_ATT_Write(0x02, 0x0000); //各路ADC增益均为1
- SPI_ATT_Write(0x6D, 0xFF00); //
- SPI_ATT_Write(0x6E, 0x0DB8); //
- SPI_ATT_Write(0x6F, 0xD1DA); //
- SPI_ATT_Write(UADC, 0x000000); //电压通道增益为1
-
- // SPI_ATT_Write(HFconst, 0x00016D); //高频输出参数为1511
- ///*----------------------------------------
- // 分相电压电流校准参数
- //-----------------------------------------*/
- // SPI_ATT_Write(UgainA, 0x000000);
- // SPI_ATT_Write(UgainB, 0x000000);
- // SPI_ATT_Write(UgainC, 0x8172F5); //8483573
- SPI_ATT_Write(0xC9, 0x000001); //关闭校准数据写
- SPI_ATT_Write(0xC6, 0x00005A); //校表数据读出使能
- read1=SPI_ATT_Read(0x00);
- printf("\r\nIn 0xC6 with 0x5A: 0x00 is %x !\r\n",read1);
- read1=0x55;
- read1=SPI_ATT_Read(0x01);
- printf("\r\nModeCfg is %x !\r\n",read1);
- read1=0x55;
- read1=SPI_ATT_Read(0x03);
- printf("\r\nEMUCfg is %x !\r\n",read1);
- read1=0x55;
- read1=SPI_ATT_Read(0x31);
- printf("\r\nModuleCfg is %x !\r\n",read1);
- read1=0x55;
- SPI_ATT_Write(0xC6, 0x000001); //计量数据读出使能
- read1=SPI_ATT_Read(0x00);
- printf("\r\nIn 0xC6 without 0x5A: 0x00 is %x !\r\n",read1);
- }
- /*试验函数(为了避免main中太多代码而设)*/
- void ATT_Test(void)
- {
- u32 read=0x55;
- read=SPI_ATT_Read(0x00);
- printf("\r\nDevice ID is %x !\r\n",read);
- read=0x55;
- printf("\r\nReading A...\r\n");
- Read_ATT_AData();
- delay_ms(1000);
- delay_ms(1000);
- delay_ms(1000);
- printf("\r\nReading B...\r\n");
- Read_ATT_BData();
- delay_ms(1000);
- delay_ms(1000);
- delay_ms(1000);
- printf("\r\nReading C...\r\n");
- Read_ATT_CData();
- delay_ms(1000);
- delay_ms(1000);
- delay_ms(1000);
- // printf("\r\nReading T...\r\n");
- // Read_ATT_TData();
- }
- /*SPI读操作*/
- u32 SPI_ATT_Read(u8 data)
- {
- u8 i;
- u32 temp=0;
- Set_CS;
- Clr_SCL;
- Clr_CS; //片选为低,开始操作
- for(i=0;i<8;i++)
- {
- Set_SCL;
- delay_us(50);
- if(data&0x80)
- Set_DATA;
- else
- Clr_DATA;
- delay_us(3); //稳定数据
- Clr_SCL;
- delay_us(50);
- data<<=1;//左移数据
- }
- delay_us(3); //稳定数据
- for(i=0;i<24;i++)
- {
- temp<<=1;
- Set_SCL;
- delay_us(50);
- if(Rd_MISO)
- temp|=0x01;
- Clr_SCL;
- delay_us(50);
- }
- Set_CS;
- return (temp);
- }
- /*SPI写操作*/
- void SPI_ATT_Write(u8 com_add,u32 data2)
- {
- u8 i,data1;
- data1=0x80|com_add;
- Set_CS;
- Clr_SCL;
- Clr_CS; //片选为低,开始操作
- for(i=0;i<8;i++)
- {
- Set_SCL;
- delay_us(50);
- if(data1&0x80)
- Set_DATA;
- else
- Clr_DATA;
- delay_us(3);
- Clr_SCL;
- delay_us(50);
- data1<<=1;//左移数据
- }
- for(i=0;i<24;i++)
- {
- Set_SCL;
- delay_us(50);
- if(data2&0x00800000)
- Set_DATA;
- else
- Clr_DATA;
- delay_us(3);
- Clr_SCL;
- delay_us(50);
- data2<<=1;
- }
- Set_CS;
- }
- //以下为各相常用数据读取
- void Read_ATT_AData(void)
- {
- ADataTypeDef.P=SPI_ATT_Read(r_Pa);
- ADataTypeDef.Q=SPI_ATT_Read(r_Qa);
- ADataTypeDef.S=SPI_ATT_Read(r_Sa);
- ADataTypeDef.URms=SPI_ATT_Read(r_UaRms);
- ADataTypeDef.IRms=SPI_ATT_Read(r_IaRms);
- ADataTypeDef.Pf=SPI_ATT_Read(r_Pfa);
- ADataTypeDef.Freq=SPI_ATT_Read(r_Freq);
- if(ADataTypeDef.P>0x800000){
- ADataTypeDef.Rp=0x1000000-ADataTypeDef.P;
- ADataTypeDef.Rp=-((ADataTypeDef.Rp*Meter_K*fabs(PhaseA.I_Amp_Factor)*fabs(PhaseA.V_Amp_Factor))\
- -((ADataTypeDef.Rp*Meter_K*fabs(PhaseA.I_Amp_Factor)*fabs(PhaseA.V_Amp_Factor))*PhaseA.P_Gain_compensation)); // 2^15/2^23
- }
- else
- ADataTypeDef.Rp=(ADataTypeDef.P*Meter_K*fabs(PhaseA.I_Amp_Factor)*fabs(PhaseA.V_Amp_Factor))\
- -((ADataTypeDef.P*Meter_K*fabs(PhaseA.I_Amp_Factor)*fabs(PhaseA.V_Amp_Factor))*PhaseA.P_Gain_compensation);
- if(ADataTypeDef.Q>0x800000){
- ADataTypeDef.Rq=0x1000000-ADataTypeDef.Q;
- ADataTypeDef.Rq=-((ADataTypeDef.Rq*Meter_K*fabs(PhaseA.I_Amp_Factor)*fabs(PhaseA.V_Amp_Factor))\
- -((ADataTypeDef.Rq*Meter_K*fabs(PhaseA.I_Amp_Factor)*fabs(PhaseA.V_Amp_Factor))*PhaseA.P_Gain_compensation));
- }
- else
- ADataTypeDef.Rq=(ADataTypeDef.Q*Meter_K*fabs(PhaseA.I_Amp_Factor)*fabs(PhaseA.V_Amp_Factor))\
- -((ADataTypeDef.Q*Meter_K*fabs(PhaseA.I_Amp_Factor)*fabs(PhaseA.V_Amp_Factor))*PhaseA.P_Gain_compensation);
- ADataTypeDef.Rs=ADataTypeDef.S/256.0;
- ADataTypeDef.Rurms=ADataTypeDef.URms/8192.0*PhaseA.V_Amp_Factor; // 2^10/2^23
- ADataTypeDef.Rirms=ADataTypeDef.IRms/8192.0*PhaseA.I_Amp_Factor;
- if(ADataTypeDef.Pf>0x800000){
- ADataTypeDef.Rpf=0x1000000-ADataTypeDef.Pf;
- ADataTypeDef.Rpf=-((ADataTypeDef.Rpf/8388608.0)-((ADataTypeDef.Rpf/8388608.0)*PhaseA.Ph_compensation));
- }
- else
- ADataTypeDef.Rpf=(ADataTypeDef.Pf/8388608.0)-((ADataTypeDef.Pf/8388608.0)*PhaseA.Ph_compensation);
- ADataTypeDef.Rfreq=ADataTypeDef.Freq/8192.0;
- // Lcd_Clr();
- // sprintf(disp0,"A phase:");
- // Lcd_Puts(7,0,disp0);
- // Output_ATT(ADataTypeDef);
- }
- void Read_ATT_BData(void)
- {
- BDataTypeDef.P=SPI_ATT_Read(r_Pb);
- BDataTypeDef.Q=SPI_ATT_Read(r_Qb);
- BDataTypeDef.S=SPI_ATT_Read(r_Sb);
- BDataTypeDef.URms=SPI_ATT_Read(r_UbRms);
- BDataTypeDef.IRms=SPI_ATT_Read(r_IbRms);
- BDataTypeDef.Pf=SPI_ATT_Read(r_Pfb);
- BDataTypeDef.Freq=SPI_ATT_Read(r_Freq);
- if(BDataTypeDef.P>0x800000){
- BDataTypeDef.Rp=0x1000000-BDataTypeDef.P;
- BDataTypeDef.Rp=-((BDataTypeDef.Rp*Meter_K*fabs(PhaseB.I_Amp_Factor)*fabs(PhaseB.V_Amp_Factor))\
- -((BDataTypeDef.Rp*Meter_K*fabs(PhaseB.I_Amp_Factor)*fabs(PhaseB.V_Amp_Factor))*PhaseB.P_Gain_compensation)); // 2^15/2^23
- }
- else
- BDataTypeDef.Rp=(BDataTypeDef.P*Meter_K*fabs(PhaseB.I_Amp_Factor)*fabs(PhaseB.V_Amp_Factor))\
- -((BDataTypeDef.P*Meter_K*fabs(PhaseB.I_Amp_Factor)*fabs(PhaseB.V_Amp_Factor))*PhaseB.P_Gain_compensation);
- if(BDataTypeDef.Q>0x800000){
- BDataTypeDef.Rq=0x1000000-BDataTypeDef.Q;
- BDataTypeDef.Rq=-((BDataTypeDef.Rq*Meter_K*fabs(PhaseB.I_Amp_Factor)*fabs(PhaseB.V_Amp_Factor))\
- -((BDataTypeDef.Rq*Meter_K*fabs(PhaseB.I_Amp_Factor)*fabs(PhaseB.V_Amp_Factor))*PhaseB.P_Gain_compensation));
- }
- else
- BDataTypeDef.Rq=(BDataTypeDef.Q*Meter_K*fabs(PhaseB.I_Amp_Factor)*fabs(PhaseB.V_Amp_Factor))\
- -((BDataTypeDef.Q*Meter_K*fabs(PhaseB.I_Amp_Factor)*fabs(PhaseB.V_Amp_Factor))*PhaseB.P_Gain_compensation);
- BDataTypeDef.Rs=BDataTypeDef.S/256.0;
- BDataTypeDef.Rurms=BDataTypeDef.URms/8192.0*PhaseB.V_Amp_Factor; // 2^10/2^23
- BDataTypeDef.Rirms=BDataTypeDef.IRms/8192.0*PhaseB.I_Amp_Factor;
- if(BDataTypeDef.Pf>0x800000){
- BDataTypeDef.Rpf=0x1000000-BDataTypeDef.Pf;
- BDataTypeDef.Rpf=-((BDataTypeDef.Rpf/8388608.0)-((BDataTypeDef.Rpf/8388608.0)*PhaseB.Ph_compensation));
- }
- else
- BDataTypeDef.Rpf=(BDataTypeDef.Pf/8388608.0)-((BDataTypeDef.Pf/8388608.0)*PhaseB.Ph_compensation);
- BDataTypeDef.Rfreq=BDataTypeDef.Freq/8192.0;
- // Lcd_Clr();
- // sprintf(disp0,"B phase:");
- // Lcd_Puts(7,0,disp0);
- // Output_ATT(BDataTypeDef);
- }
- void Read_ATT_CData(void)
- {
- CDataTypeDef.P=SPI_ATT_Read(r_Pc);
- CDataTypeDef.Q=SPI_ATT_Read(r_Qc);
- CDataTypeDef.S=SPI_ATT_Read(r_Sc);
- CDataTypeDef.URms=SPI_ATT_Read(r_UcRms);
- CDataTypeDef.IRms=SPI_ATT_Read(r_IcRms);
- CDataTypeDef.Pf=SPI_ATT_Read(r_Pfc);
- CDataTypeDef.Freq=SPI_ATT_Read(r_Freq);
- if(CDataTypeDef.P>0x800000){
- CDataTypeDef.Rp=0x1000000-CDataTypeDef.P;
- CDataTypeDef.Rp=-((CDataTypeDef.Rp*Meter_K*fabs(PhaseC.I_Amp_Factor)*fabs(PhaseC.V_Amp_Factor))\
- -((CDataTypeDef.Rp*Meter_K*fabs(PhaseC.I_Amp_Factor)*fabs(PhaseC.V_Amp_Factor))*PhaseC.P_Gain_compensation)); // 2^15/2^23
- }
- else
- CDataTypeDef.Rp=(CDataTypeDef.P*Meter_K*fabs(PhaseC.I_Amp_Factor)*fabs(PhaseC.V_Amp_Factor))\
- -((CDataTypeDef.P*Meter_K*fabs(PhaseC.I_Amp_Factor)*fabs(PhaseC.V_Amp_Factor))*PhaseC.P_Gain_compensation);
- if(CDataTypeDef.Q>0x800000){
- CDataTypeDef.Rq=0x1000000-CDataTypeDef.Q;
- CDataTypeDef.Rq=-((CDataTypeDef.Rq*Meter_K*fabs(PhaseC.I_Amp_Factor)*fabs(PhaseC.V_Amp_Factor))\
- -((CDataTypeDef.Rq*Meter_K*fabs(PhaseC.I_Amp_Factor)*fabs(PhaseC.V_Amp_Factor))*PhaseC.P_Gain_compensation));
- }
- else
- CDataTypeDef.Rq=(CDataTypeDef.Q*Meter_K*fabs(PhaseC.I_Amp_Factor)*fabs(PhaseC.V_Amp_Factor))\
- -((CDataTypeDef.Q*Meter_K*fabs(PhaseC.I_Amp_Factor)*fabs(PhaseC.V_Amp_Factor))*PhaseC.P_Gain_compensation);
- CDataTypeDef.Rs=CDataTypeDef.S/256.0;
- CDataTypeDef.Rurms=CDataTypeDef.URms/8192.0*PhaseC.V_Amp_Factor; // 2^10/2^23
- CDataTypeDef.Rirms=CDataTypeDef.IRms/8192.0*PhaseC.I_Amp_Factor;
- if(CDataTypeDef.Pf>0x800000){
- CDataTypeDef.Rpf=0x1000000-CDataTypeDef.Pf;
- CDataTypeDef.Rpf=-((CDataTypeDef.Rpf/8388608.0)-((CDataTypeDef.Rpf/8388608.0)*PhaseC.Ph_compensation));
- }
- else
- CDataTypeDef.Rpf=(CDataTypeDef.Pf/8388608.0)-((CDataTypeDef.Pf/8388608.0)*PhaseC.Ph_compensation);
- CDataTypeDef.Rfreq=CDataTypeDef.Freq/8192.0;
- // Lcd_Clr();
- // sprintf(disp0,"C phase:");
- // Lcd_Puts(7,0,disp0);
- // Output_ATT(CDataTypeDef);
- }
- void Read_ATT_TData(void)
- {
- TDataTypeDef.P=SPI_ATT_Read(r_Pt);
- TDataTypeDef.Q=SPI_ATT_Read(r_Qt);
- TDataTypeDef.S=SPI_ATT_Read(r_St);
- TDataTypeDef.URms=SPI_ATT_Read(r_UtRms);
- TDataTypeDef.IRms=SPI_ATT_Read(r_ItRms);
- TDataTypeDef.Pf=SPI_ATT_Read(r_Pft);
- TDataTypeDef.Freq=SPI_ATT_Read(r_Freq);
- if(TDataTypeDef.P>0x800000){
- TDataTypeDef.Rp=0x1000000-TDataTypeDef.P;
- TDataTypeDef.Rp=-(TDataTypeDef.Rp/64.0); // 2^17/2^23
- }
- else
- TDataTypeDef.Rp=TDataTypeDef.P/64.0;
- if(TDataTypeDef.Q>0x800000){
- TDataTypeDef.Rq=0x1000000-TDataTypeDef.Q;
- TDataTypeDef.Rq=-(TDataTypeDef.Rq/64.0);
- }
- else
- TDataTypeDef.Rq=TDataTypeDef.Q/64.0;
- TDataTypeDef.Rs=TDataTypeDef.S/64.0;
- TDataTypeDef.Rurms=TDataTypeDef.URms/8192.0; // 2^10/2^23
- TDataTypeDef.Rirms=TDataTypeDef.IRms/8192.0;
- if(TDataTypeDef.Pf>0x800000){
- TDataTypeDef.Rpf=0x1000000-TDataTypeDef.Pf;
- TDataTypeDef.Rpf=-(TDataTypeDef.Rpf/8388608.0);
- }
- else
- TDataTypeDef.Rpf=TDataTypeDef.Pf/8388608.0;
- TDataTypeDef.Rfreq=TDataTypeDef.Freq/8192.0;
- Output_ATT(TDataTypeDef);
- }
- void Output_ATT(DataTypeDef output)
- {
- sprintf(disp1,"U:%.2fV,I:%.2fA",output.Rurms,output.Rirms);
- if(output.Rp<=999.9)
- sprintf(disp2,"P:%.2fW,Q:%.2fVar",output.Rp,output.Rq);
- if(output.Rp>999.9)
- sprintf(disp2,"P:%.1fkW,Q:%.1fkVar",(output.Rp/1000.0),(output.Rq/1000.0));
- sprintf(disp3,"Pf:%.3f,F:%.3fHz",output.Rpf,output.Rfreq);
- Lcd_Puts(0,1,disp1);
- Lcd_Puts(0,2,disp2);
- Lcd_Puts(0,3,disp3);
- printf("\r\n********************\r\n");
- printf("\r\nP = %x !\r\n",output.P);
- printf("\r\n %f !\r\n",output.Rp);
- printf("\r\nQ = %x !\r\n",output.Q);
- printf("\r\n %f !\r\n",output.Rq);
- printf("\r\nS = %x !\r\n",output.S);
- printf("\r\n %f !\r\n",output.Rs);
- printf("\r\nURms = %x !\r\n",output.URms);
- printf("\r\n %f !\r\n",output.Rurms);
- printf("\r\nIRms = %x !\r\n",output.IRms);
- printf("\r\n %f !\r\n",output.Rirms);
- printf("\r\nPf = %x !\r\n",output.Pf);
- printf("\r\n %f !\r\n",output.Rpf);
- printf("\r\nFreq = %x !\r\n",output.Freq);
- printf("\r\n %f !\r\n",output.Rfreq);
- printf("\r\n********************\r\n");
- }
复制代码
main.c
- // _ooOoo_
- // o8888888o
- // 88" . "88
- // (| -_- |)
- // O\ = /O
- // ____/`---'\____
- // .' \\| |// `.
- // / \\||| : |||// \
- // / _||||| -:- |||||- \
- // | | \\\ - /// | |
- // | \_| ''\---/'' | |
- // \ .-\__ `-` ___/-. /
- // ___`. .' /--.--\ `. . __
- // ."" '< `.___\_<|>_/___.' >'"".
- // | | : `- \`.;`\ _ /`;.`/ - ` : | |
- // \ \ `-. \_ __\ /__ _/ .-` / /
- // ======`-.____`-.___\_____/___.-`____.-'======
- // `=---='
- //
- //
- // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
- // 佛祖保佑 永不死机
- // 心外无法 法外无心
- #include "led.h"
- #include "delay.h"
- #include "key.h"
- #include "sys.h"
- #include "usart.h"
- #include "Lcd1602.h"
- #include "24C02.h"
- #include "..\RTC\rtc.h"
- #include "ATT7022.h"
- #include "string.h"
- //ALIENTEK战舰STM32开发板实验4
- //串口实验
- //技术支持:www.openedv.com
- //广州市星翼电子科技有限公司
- extern void ATT7022_Init(void);
- extern void ATT_Adjust(void);
- extern void ATT_Test(void);
- extern void Read_ATT_AData(void);
- extern void Read_ATT_BData(void);
- extern void Read_ATT_CData(void);
- char disp0[25]={0};
- char disp1[25]={0};
- char disp2[25]={0};
- char disp3[25]={0};
- char ABC_Phase_val='C';
- uint8_t test[10]={'0','I','V','U','4','5','6'};
- uint8_t test2[10]={0};
- void C_Phase_Cal(void) //C相校表程序
- {
- u8 tmp = 0,tmp1=0; //临时变量
- float tmp2=0.0; //临时变量,作为校表时控制当前位数用
- Lcd_Puts(0,0,"C phase Adjust");
- delay_ms(1000);
- //进入校表显示界面,先输入电表常数
- Lcd_Puts(0,1,"Enter Meter EC");
- memset(disp0,'0',25);
- sprintf(disp0,"%d",Meter_Ec);
- Lcd_Puts(0,2," ");
- tmp1=0;
- tmp=3;
- Lcd_FlickerChar(tmp1,2);
- while(PAin(3)!=0) //key4按下表示退出电表常数设置界面
- {
- if(PAin(0)==0)
- {
- delay_ms(300);
- Meter_Ec=Meter_Ec+(1*pow(10,tmp)); //设置值递增 key1按下递增
- }
- if(PAin(2)==0)
- {
- delay_ms(300);
- Meter_Ec=Meter_Ec-(1*pow(10,tmp)); //设置值递减
- }
- if(PAin(1)==0) //个十百千位调整和显示光标调整 key2按下递减
- {
- delay_ms(300);
- tmp--;
- tmp1++;
- if(tmp1>3)
- {
- tmp1=0; //防止设置参数溢出千位
- tmp=3;
- }
- }
- if((Meter_Ec>9999)||(Meter_Ec<1)) //防止常数设置错误,恢复默认值3200
- {
- Meter_Ec=3200;
- tmp=3;
- tmp1=0;
- memset(disp0,0x00,25);
- Lcd_Puts(0,2,disp0);
- }
- sprintf(disp0,"%04d",Meter_Ec);
- Lcd_Puts(0,2,disp0);
- Lcd_FlickerChar(tmp1,2);
- delay_ms(300);
- }
- //进入电流放大倍数设置界面
- while(PAin(3)==0);
- Lcd_Puts(0,1,"Enter I Amp Factor");
- memset(disp0,0x00,25);
- sprintf(disp0,"%+07.1f",PhaseC.I_Amp_Factor);
- Lcd_Puts(0,2," ");
- tmp1=1;
- tmp2=3.0;
- Lcd_FlickerChar(tmp1,2);
- while(PAin(3)!=0) //key4按下表示退出电流放大倍数设置界面
- {
- if(PAin(0)==0)
- {
- delay_ms(300);
- if(PhaseC.I_Amp_Factor>=0)
- PhaseC.I_Amp_Factor=PhaseC.I_Amp_Factor+(1*pow(10,tmp2)); //设置值递增 key1按下递增
- else
- PhaseC.I_Amp_Factor=PhaseC.I_Amp_Factor-(1*pow(10,tmp2)); //设置值递增 key1按下递增
- }
- if(PAin(2)==0)
- {
- delay_ms(300);
- if(PhaseC.I_Amp_Factor>=0)
- PhaseC.I_Amp_Factor=PhaseC.I_Amp_Factor-(1*pow(10,tmp2)); //设置值递减
- else
- PhaseC.I_Amp_Factor=PhaseC.I_Amp_Factor+(1*pow(10,tmp2)); //设置值递增 key1按下递增
- }
- if(PAin(1)==0) //个十百千位调整和显示光标调整 key2按下递减
- {
- delay_ms(300);
- tmp2--;
- tmp1++;
- if(tmp1==5)
- tmp1++; //如果光标在小数位,移位到下一位
- if(tmp1>6)
- {
- tmp1=1; //防止设置参数溢出千位
- tmp2=3.0;
- }
- }
- if((PhaseC.I_Amp_Factor>9999.9)||(PhaseC.I_Amp_Factor<-9999.9)) //防止常数设置错误,恢复默认值1,电流最大放大999倍
- {
- PhaseC.I_Amp_Factor=1.0;
- tmp2=3.0;
- tmp1=1;
- memset(disp0,0x00,25);
- Lcd_Puts(0,2," ");
- }
- sprintf(disp0,"%+07.1f",PhaseC.I_Amp_Factor);
- Lcd_Puts(0,2,disp0);
- Lcd_FlickerChar(tmp1,2);
- delay_ms(300);
- }
- //进入设置电压放大倍数界面
- while(PAin(3)==0);
- Lcd_Puts(0,1,"Enter V Amp Factor");
- memset(disp0,0x00,25);
- sprintf(disp0,"%+07.1f",PhaseC.V_Amp_Factor);
- Lcd_Puts(0,2," ");
- tmp1=1;
- tmp2=3.0;
- Lcd_FlickerChar(tmp1,2);
- while(PAin(3)!=0) //key4按下表示退出电压放大倍数设置界面
- {
- if(PAin(0)==0)
- {
- delay_ms(300);
- if(PhaseC.V_Amp_Factor>=0)
- PhaseC.V_Amp_Factor=PhaseC.V_Amp_Factor+(1*pow(10,tmp2)); //设置值递增 key1按下递增
- else
- PhaseC.V_Amp_Factor=PhaseC.V_Amp_Factor-(1*pow(10,tmp2)); //设置值递增 key1按下递增
- }
- if(PAin(2)==0)
- {
- delay_ms(300);
- if(PhaseC.V_Amp_Factor>=0)
- PhaseC.V_Amp_Factor=PhaseC.V_Amp_Factor-(1*pow(10,tmp2)); //设置值递减 key3按下递减
- else
- PhaseC.V_Amp_Factor=PhaseC.V_Amp_Factor+(1*pow(10,tmp2)); //设置值递增 key1按下递增
- }
- if(PAin(1)==0) //个十百千位调整和显示光标调整 key2按下
- {
- delay_ms(300);
- tmp2--;
- tmp1++;
- if(tmp1==5)
- tmp1++; //如果光标在小数位,移位到下一位
- if(tmp1>6)
- {
- tmp1=1; //防止设置参数溢出千位
- tmp2=3.0;
- }
- }
- if((PhaseC.V_Amp_Factor>9999.0)||(PhaseC.V_Amp_Factor<-9999.9)) //防止常数设置错误,恢复默认值1,电压最大放大9999.9倍
- {
- PhaseC.V_Amp_Factor=1.0;
- tmp2=3.0;
- tmp1=1;
- memset(disp0,0x00,25);
- Lcd_Puts(0,2," ");
- }
- sprintf(disp0,"%+07.1f",PhaseC.V_Amp_Factor);
- Lcd_Puts(0,2,disp0);
- Lcd_FlickerChar(tmp1,2);
- delay_ms(300);
- }
- //进入功率增益补偿设置界面
- while(PAin(3)==0);
- Lcd_Puts(0,1," ");
- Lcd_Puts(0,1,"Enter PgC");
- memset(disp0,'0',25);
- sprintf(disp0,"%+04.2f",PhaseC.P_Gain_compensation);
- Lcd_Puts(0,2," ");
- tmp1=1;
- tmp2=0.0;
- Lcd_FlickerChar(tmp1,2);
- while(PAin(3)!=0) //key4按下表示退出功率增益设置界面
- {
- if(PAin(0)==0)
- {
- delay_ms(300);
- if(PhaseC.P_Gain_compensation>=0)
- PhaseC.P_Gain_compensation=PhaseC.P_Gain_compensation+(1*pow(10,tmp2)); //设置值递增 key1按下递增
- else
- PhaseC.P_Gain_compensation=PhaseC.P_Gain_compensation-(1*pow(10,tmp2)); //设置值递增 key1按下递增
- }
- if(PAin(2)==0)
- {
- delay_ms(300);
- if(PhaseC.P_Gain_compensation>=0)
- PhaseC.P_Gain_compensation=PhaseC.P_Gain_compensation-(1*pow(10,tmp2)); //设置值递减
- else
- PhaseC.P_Gain_compensation=PhaseC.P_Gain_compensation+(1*pow(10,tmp2)); //设置值递减
- }
- if(PAin(1)==0) //个十百千位调整和显示光标调整 key2按下递减
- {
- delay_ms(300);
- tmp2--;
- tmp1++;
- if(tmp1==2)
- tmp1++; //如果光标在小数位,移位到下一位
- if(tmp1>4)
- {
- tmp1=1; //防止设置参数溢出
- tmp2=0.0;
- }
- }
- if((PhaseC.P_Gain_compensation>+9.9)||(PhaseC.P_Gain_compensation<-9.9)) //防止常数设置错误,恢复默认值0.0
- {
- PhaseC.P_Gain_compensation=0.0;
- tmp2=0.0;
- tmp1=1;
- memset(disp0,0x00,25);
- Lcd_Puts(0,2," ");
- }
- sprintf(disp0,"%+04.2f",PhaseC.P_Gain_compensation);
- Lcd_Puts(0,2,disp0);
- Lcd_FlickerChar(tmp1,2);
- delay_ms(300);
- }
- //相位校正界面
- while(PAin(3)==0);
- Lcd_Puts(0,1," ");
- Lcd_Puts(0,1,"Enter PhA");
- memset(disp0,'0',25);
- sprintf(disp0,"%+04.2f",PhaseC.Ph_compensation);
- Lcd_Puts(0,2," ");
- tmp1=1;
- tmp2=0.0;
- Lcd_FlickerChar(tmp1,2);
- while(PAin(3)!=0) //key4按下表示退出相位设置界面
- {
- if(PAin(0)==0)
- {
- delay_ms(300);
- if(PhaseC.Ph_compensation>=0)
- PhaseC.Ph_compensation=PhaseC.Ph_compensation+(1*pow(10,tmp2)); //设置值递增 key1按下递增
- else
- PhaseC.Ph_compensation=PhaseC.Ph_compensation-(1*pow(10,tmp2)); //设置值递增 key1按下递增
- }
- if(PAin(2)==0)
- {
- delay_ms(300);
- if(PhaseC.Ph_compensation>=0)
- PhaseC.Ph_compensation=PhaseC.Ph_compensation-(1*pow(10,tmp2)); //设置值递减
- else
- PhaseC.Ph_compensation=PhaseC.Ph_compensation+(1*pow(10,tmp2)); //设置值递减
- }
- if(PAin(1)==0) //个十百千位调整和显示光标调整 key2按下递减
- {
- delay_ms(300);
- tmp2--;
- tmp1++;
- if(tmp1==2)
- tmp1++; //如果光标在小数位,移位到下一位
- if(tmp1>4)
- {
- tmp1=1; //防止设置参数溢出
- tmp2=0.0;
- }
- }
- if((PhaseC.Ph_compensation>+2.0)||(PhaseC.Ph_compensation<-2.0)) //防止常数设置错误,恢复默认值0.0
- {
- PhaseC.Ph_compensation=0.0;
- tmp2=0.0;
- tmp1=1;
- memset(disp0,0x00,25);
- Lcd_Puts(0,2," ");
- }
- sprintf(disp0,"%+04.2f",PhaseC.Ph_compensation);
- Lcd_Puts(0,2,disp0);
- Lcd_FlickerChar(tmp1,2);
- delay_ms(300);
- }
- }
- void A_Phase_Cal(void) //A相校表程序
- {
- u8 tmp = 0,tmp1=0; //临时变量
- float tmp2=0.0; //临时变量,作为校表时控制当前位数用
- Lcd_Puts(0,0,"A phase Adjust");
- delay_ms(1000);
- //进入校表显示界面,先输入电表常数
- Lcd_Puts(0,1,"Enter Meter EC");
- memset(disp0,'0',25);
- sprintf(disp0,"%d",Meter_Ec);
- Lcd_Puts(0,2," ");
- tmp1=0;
- tmp=3;
- Lcd_FlickerChar(tmp1,2);
- while(PAin(3)!=0) //key4按下表示退出电表常数设置界面
- {
- if(PAin(0)==0)
- {
- delay_ms(300);
- Meter_Ec=Meter_Ec+(1*pow(10,tmp)); //设置值递增 key1按下递增
- }
- if(PAin(2)==0)
- {
- delay_ms(300);
- Meter_Ec=Meter_Ec-(1*pow(10,tmp)); //设置值递减
- }
- if(PAin(1)==0) //个十百千位调整和显示光标调整 key2按下递减
- {
- delay_ms(300);
- tmp--;
- tmp1++;
- if(tmp1>3)
- {
- tmp1=0; //防止设置参数溢出千位
- tmp=3;
- }
- }
- if((Meter_Ec>9999)||(Meter_Ec<1)) //防止常数设置错误,恢复默认值3200
- {
- Meter_Ec=3200;
- tmp=3;
- tmp1=0;
- memset(disp0,0x00,25);
- Lcd_Puts(0,2,disp0);
- }
- sprintf(disp0,"%04d",Meter_Ec);
- Lcd_Puts(0,2,disp0);
- Lcd_FlickerChar(tmp1,2);
- delay_ms(300);
- }
- //进入电流放大倍数设置界面
- while(PAin(3)==0);
- Lcd_Puts(0,1,"Enter I Amp Factor");
- memset(disp0,0x00,25);
- sprintf(disp0,"%+07.1f",PhaseA.I_Amp_Factor);
- Lcd_Puts(0,2," ");
- tmp1=1;
- tmp2=3.0;
- Lcd_FlickerChar(tmp1,2);
- while(PAin(3)!=0) //key4按下表示退出电流放大倍数设置界面
- {
- if(PAin(0)==0)
- {
- delay_ms(300);
- if(PhaseA.I_Amp_Factor>=0)
- PhaseA.I_Amp_Factor=PhaseA.I_Amp_Factor+(1*pow(10,tmp2)); //设置值递增 key1按下递增
- else
- PhaseA.I_Amp_Factor=PhaseA.I_Amp_Factor-(1*pow(10,tmp2)); //设置值递增 key1按下递增
- }
- if(PAin(2)==0)
- {
- delay_ms(300);
- if(PhaseA.I_Amp_Factor>=0)
- PhaseA.I_Amp_Factor=PhaseA.I_Amp_Factor-(1*pow(10,tmp2)); //设置值递减
- else
- PhaseA.I_Amp_Factor=PhaseA.I_Amp_Factor+(1*pow(10,tmp2)); //设置值递增 key1按下递增
- }
- if(PAin(1)==0) //个十百千位调整和显示光标调整 key2按下递减
- {
- delay_ms(300);
- tmp2--;
- tmp1++;
- if(tmp1==5)
- tmp1++; //如果光标在小数位,移位到下一位
- if(tmp1>6)
- {
- tmp1=1; //防止设置参数溢出千位
- tmp2=3.0;
- }
- }
- if((PhaseA.I_Amp_Factor>9999.9)||(PhaseA.I_Amp_Factor<-9999.9)) //防止常数设置错误,恢复默认值1,电流最大放大999倍
- {
- PhaseA.I_Amp_Factor=1.0;
- tmp2=3.0;
- tmp1=1;
- memset(disp0,0x00,25);
- Lcd_Puts(0,2," ");
- }
- sprintf(disp0,"%+07.1f",PhaseA.I_Amp_Factor);
- Lcd_Puts(0,2,disp0);
- Lcd_FlickerChar(tmp1,2);
- delay_ms(300);
- }
- //进入设置电压放大倍数界面
- while(PAin(3)==0);
- Lcd_Puts(0,1,"Enter V Amp Factor");
- memset(disp0,0x00,25);
- sprintf(disp0,"%+07.1f",PhaseA.V_Amp_Factor);
- Lcd_Puts(0,2," ");
- tmp1=1;
- tmp2=3.0;
- Lcd_FlickerChar(tmp1,2);
- while(PAin(3)!=0) //key4按下表示退出电压放大倍数设置界面
- {
- if(PAin(0)==0)
- {
- delay_ms(300);
- if(PhaseA.V_Amp_Factor>=0)
- PhaseA.V_Amp_Factor=PhaseA.V_Amp_Factor+(1*pow(10,tmp2)); //设置值递增 key1按下递增
- else
- PhaseA.V_Amp_Factor=PhaseA.V_Amp_Factor-(1*pow(10,tmp2)); //设置值递增 key1按下递增
- }
- if(PAin(2)==0)
- {
- delay_ms(300);
- if(PhaseA.V_Amp_Factor>=0)
- PhaseA.V_Amp_Factor=PhaseA.V_Amp_Factor-(1*pow(10,tmp2)); //设置值递减 key3按下递减
- else
- PhaseA.V_Amp_Factor=PhaseA.V_Amp_Factor+(1*pow(10,tmp2)); //设置值递增 key1按下递增
- }
- if(PAin(1)==0) //个十百千位调整和显示光标调整 key2按下
- {
- delay_ms(300);
- tmp2--;
- tmp1++;
- if(tmp1==5)
- tmp1++; //如果光标在小数位,移位到下一位
- if(tmp1>6)
- {
- tmp1=1; //防止设置参数溢出千位
- tmp2=3.0;
- }
- }
- if((PhaseA.V_Amp_Factor>9999.0)||(PhaseA.V_Amp_Factor<-9999.9)) //防止常数设置错误,恢复默认值1,电压最大放大9999.9倍
- {
- PhaseA.V_Amp_Factor=1.0;
- tmp2=3.0;
- tmp1=1;
- memset(disp0,0x00,25);
- Lcd_Puts(0,2," ");
- }
- sprintf(disp0,"%+07.1f",PhaseA.V_Amp_Factor);
- Lcd_Puts(0,2,disp0);
- Lcd_FlickerChar(tmp1,2);
- delay_ms(300);
- }
- //进入A相功率增益补偿设置界面
- while(PAin(3)==0);
- Lcd_Puts(0,1," ");
- Lcd_Puts(0,1,"Enter Pga");
- memset(disp0,'0',25);
- sprintf(disp0,"%+04.2f",PhaseA.P_Gain_compensation);
- Lcd_Puts(0,2," ");
- tmp1=1;
- tmp2=0.0;
- Lcd_FlickerChar(tmp1,2);
- while(PAin(3)!=0) //key4按下表示退出功率增益设置界面
- {
- if(PAin(0)==0)
- {
- delay_ms(300);
- if(PhaseA.P_Gain_compensation>=0)
- PhaseA.P_Gain_compensation=PhaseA.P_Gain_compensation+(1*pow(10,tmp2)); //设置值递增 key1按下递增
- else
- PhaseA.P_Gain_compensation=PhaseA.P_Gain_compensation-(1*pow(10,tmp2)); //设置值递增 key1按下递增
- }
- if(PAin(2)==0)
- {
- delay_ms(300);
- if(PhaseA.P_Gain_compensation>=0)
- PhaseA.P_Gain_compensation=PhaseA.P_Gain_compensation-(1*pow(10,tmp2)); //设置值递减
- else
- PhaseA.P_Gain_compensation=PhaseA.P_Gain_compensation+(1*pow(10,tmp2)); //设置值递减
- }
- if(PAin(1)==0) //个十百千位调整和显示光标调整 key2按下递减
- {
- delay_ms(300);
- tmp2--;
- tmp1++;
- if(tmp1==2)
- tmp1++; //如果光标在小数位,移位到下一位
- if(tmp1>4)
- {
- tmp1=1; //防止设置参数溢出
- tmp2=0.0;
- }
- }
- if((PhaseA.P_Gain_compensation>+9.9)||(PhaseA.P_Gain_compensation<-9.9)) //防止常数设置错误,恢复默认值0.0
- {
- PhaseA.P_Gain_compensation=0.0;
- tmp2=0.0;
- tmp1=1;
- memset(disp0,0x00,25);
- Lcd_Puts(0,2," ");
- }
- sprintf(disp0,"%+04.2f",PhaseA.P_Gain_compensation);
- Lcd_Puts(0,2,disp0);
- Lcd_FlickerChar(tmp1,2);
- delay_ms(300);
- }
- //A相相位校正界面
- while(PAin(3)==0);
- Lcd_Puts(0,1," ");
- Lcd_Puts(0,1,"Enter Pha");
- memset(disp0,'0',25);
- sprintf(disp0,"%+04.2f",PhaseA.Ph_compensation);
- Lcd_Puts(0,2," ");
- tmp1=1;
- tmp2=0.0;
- Lcd_FlickerChar(tmp1,2);
- while(PAin(3)!=0) //key4按下表示退出相位设置界面
- {
- if(PAin(0)==0)
- {
- delay_ms(300);
- if(PhaseA.Ph_compensation>=0)
- PhaseA.Ph_compensation=PhaseA.Ph_compensation+(1*pow(10,tmp2)); //设置值递增 key1按下递增
- else
- PhaseA.Ph_compensation=PhaseA.Ph_compensation-(1*pow(10,tmp2)); //设置值递增 key1按下递增
- }
- if(PAin(2)==0)
- {
- delay_ms(300);
- if(PhaseA.Ph_compensation>=0)
- PhaseA.Ph_compensation=PhaseA.Ph_compensation-(1*pow(10,tmp2)); //设置值递减
- else
- PhaseA.Ph_compensation=PhaseA.Ph_compensation+(1*pow(10,tmp2)); //设置值递减
- }
- if(PAin(1)==0) //个十百千位调整和显示光标调整 key2按下递减
- {
- delay_ms(300);
- tmp2--;
- tmp1++;
- if(tmp1==2)
- tmp1++; //如果光标在小数位,移位到下一位
- if(tmp1>4)
- {
- tmp1=1; //防止设置参数溢出
- tmp2=0.0;
- }
- }
- if((PhaseA.Ph_compensation>+2.0)||(PhaseA.Ph_compensation<-2.0)) //防止常数设置错误,恢复默认值0.0
- {
- PhaseA.Ph_compensation=0.0;
- tmp2=0.0;
- tmp1=1;
- memset(disp0,0x00,25);
- Lcd_Puts(0,2," ");
- }
- sprintf(disp0,"%+04.2f",PhaseA.Ph_compensation);
- Lcd_Puts(0,2,disp0);
- Lcd_FlickerChar(tmp1,2);
- delay_ms(300);
- }
- }
- void B_Phase_Cal(void) //B相校表程序
- {
- u8 tmp = 0,tmp1=0; //临时变量
- float tmp2=0.0; //临时变量,作为校表时控制当前位数用
- Lcd_Puts(0,0,"B phase Adjust");
- delay_ms(1000);
- //进入校表显示界面,先输入电表常数
- Lcd_Puts(0,1,"Enter Meter EC");
- memset(disp0,'0',25);
- sprintf(disp0,"%d",Meter_Ec);
- Lcd_Puts(0,2," ");
- tmp1=0;
- tmp=3;
- Lcd_FlickerChar(tmp1,2);
- while(PAin(3)!=0) //key4按下表示退出电表常数设置界面
- {
- if(PAin(0)==0)
- {
- delay_ms(300);
- Meter_Ec=Meter_Ec+(1*pow(10,tmp)); //设置值递增 key1按下递增
- }
- if(PAin(2)==0)
- {
- delay_ms(300);
- Meter_Ec=Meter_Ec-(1*pow(10,tmp)); //设置值递减
- }
- if(PAin(1)==0) //个十百千位调整和显示光标调整 key2按下递减
- {
- delay_ms(300);
- tmp--;
- tmp1++;
- if(tmp1>3)
- {
- tmp1=0; //防止设置参数溢出千位
- tmp=3;
- }
- }
- if((Meter_Ec>9999)||(Meter_Ec<1)) //防止常数设置错误,恢复默认值3200
- {
- Meter_Ec=3200;
- tmp=3;
- tmp1=0;
- memset(disp0,0x00,25);
- Lcd_Puts(0,2,disp0);
- }
- sprintf(disp0,"%04d",Meter_Ec);
- Lcd_Puts(0,2,disp0);
- Lcd_FlickerChar(tmp1,2);
- delay_ms(300);
- }
- //进入电流放大倍数设置界面
- while(PAin(3)==0);
- Lcd_Puts(0,1,"Enter I Amp Factor");
- memset(disp0,0x00,25);
- sprintf(disp0,"%+07.1f",PhaseB.I_Amp_Factor);
- Lcd_Puts(0,2," ");
- tmp1=1;
- tmp2=3.0;
- Lcd_FlickerChar(tmp1,2);
- while(PAin(3)!=0) //key4按下表示退出电流放大倍数设置界面
- {
- if(PAin(0)==0)
- {
- delay_ms(300);
- if(PhaseB.I_Amp_Factor>=0)
- PhaseB.I_Amp_Factor=PhaseB.I_Amp_Factor+(1*pow(10,tmp2)); //设置值递增 key1按下递增
- else
- PhaseB.I_Amp_Factor=PhaseB.I_Amp_Factor-(1*pow(10,tmp2)); //设置值递增 key1按下递增
- }
- if(PAin(2)==0)
- {
- delay_ms(300);
- if(PhaseB.I_Amp_Factor>=0)
- PhaseB.I_Amp_Factor=PhaseB.I_Amp_Factor-(1*pow(10,tmp2)); //设置值递减
- else
- PhaseB.I_Amp_Factor=PhaseB.I_Amp_Factor+(1*pow(10,tmp2)); //设置值递增 key1按下递增
- }
- if(PAin(1)==0) //个十百千位调整和显示光标调整 key2按下递减
- {
- delay_ms(300);
- tmp2--;
- tmp1++;
- if(tmp1==5)
- tmp1++; //如果光标在小数位,移位到下一位
- if(tmp1>6)
- {
- tmp1=1; //防止设置参数溢出千位
- tmp2=3.0;
- }
- }
- if((PhaseB.I_Amp_Factor>9999.9)||(PhaseB.I_Amp_Factor<-9999.9)) //防止常数设置错误,恢复默认值1,电流最大放大999倍
- {
- PhaseB.I_Amp_Factor=1.0;
- tmp2=3.0;
- tmp1=1;
- memset(disp0,0x00,25);
- Lcd_Puts(0,2," ");
- }
- sprintf(disp0,"%+07.1f",PhaseB.I_Amp_Factor);
- Lcd_Puts(0,2,disp0);
- Lcd_FlickerChar(tmp1,2);
- delay_ms(300);
- }
- //进入设置电压放大倍数界面
- while(PAin(3)==0);
- Lcd_Puts(0,1,"Enter V Amp Factor");
- memset(disp0,0x00,25);
- sprintf(disp0,"%+07.1f",PhaseB.V_Amp_Factor);
- Lcd_Puts(0,2," ");
- tmp1=1;
- tmp2=3.0;
- Lcd_FlickerChar(tmp1,2);
- while(PAin(3)!=0) //key4按下表示退出电压放大倍数设置界面
- {
- if(PAin(0)==0)
- {
- delay_ms(300);
- if(PhaseB.V_Amp_Factor>=0)
- PhaseB.V_Amp_Factor=PhaseB.V_Amp_Factor+(1*pow(10,tmp2)); //设置值递增 key1按下递增
- else
- PhaseB.V_Amp_Factor=PhaseB.V_Amp_Factor-(1*pow(10,tmp2)); //设置值递增 key1按下递增
- }
- if(PAin(2)==0)
- {
- delay_ms(300);
- if(PhaseB.V_Amp_Factor>=0)
- PhaseB.V_Amp_Factor=PhaseB.V_Amp_Factor-(1*pow(10,tmp2)); //设置值递减 key3按下递减
- else
- PhaseB.V_Amp_Factor=PhaseB.V_Amp_Factor+(1*pow(10,tmp2)); //设置值递增 key1按下递增
- }
- if(PAin(1)==0) //个十百千位调整和显示光标调整 key2按下
- {
- delay_ms(300);
- tmp2--;
- tmp1++;
- if(tmp1==5)
- tmp1++; //如果光标在小数位,移位到下一位
- if(tmp1>6)
- {
- tmp1=1; //防止设置参数溢出千位
- tmp2=3.0;
- }
- }
- if((PhaseB.V_Amp_Factor>9999.0)||(PhaseB.V_Amp_Factor<-9999.9)) //防止常数设置错误,恢复默认值1,电压最大放大9999.9倍
- {
- PhaseB.V_Amp_Factor=1.0;
- tmp2=3.0;
- tmp1=1;
- memset(disp0,0x00,25);
- Lcd_Puts(0,2," ");
- }
- sprintf(disp0,"%+07.1f",PhaseB.V_Amp_Factor);
- Lcd_Puts(0,2,disp0);
- Lcd_FlickerChar(tmp1,2);
- delay_ms(300);
- }
- //进入B相功率增益补偿设置界面
- while(PAin(3)==0);
- Lcd_Puts(0,1," ");
- Lcd_Puts(0,1,"Enter Pga");
- memset(disp0,'0',25);
- sprintf(disp0,"%+04.2f",PhaseB.P_Gain_compensation);
- Lcd_Puts(0,2," ");
- tmp1=1;
- tmp2=0.0;
- Lcd_FlickerChar(tmp1,2);
- while(PAin(3)!=0) //key4按下表示退出功率增益设置界面
- {
- if(PAin(0)==0)
- {
- delay_ms(300);
- if(PhaseB.P_Gain_compensation>=0)
- PhaseB.P_Gain_compensation=PhaseB.P_Gain_compensation+(1*pow(10,tmp2)); //设置值递增 key1按下递增
- else
- PhaseB.P_Gain_compensation=PhaseB.P_Gain_compensation-(1*pow(10,tmp2)); //设置值递增 key1按下递增
- }
- if(PAin(2)==0)
- {
- delay_ms(300);
- if(PhaseB.P_Gain_compensation>=0)
- PhaseB.P_Gain_compensation=PhaseB.P_Gain_compensation-(1*pow(10,tmp2)); //设置值递减
- else
- PhaseB.P_Gain_compensation=PhaseB.P_Gain_compensation+(1*pow(10,tmp2)); //设置值递减
- }
- if(PAin(1)==0) //个十百千位调整和显示光标调整 key2按下递减
- {
- delay_ms(300);
- tmp2--;
- tmp1++;
- if(tmp1==2)
- tmp1++; //如果光标在小数位,移位到下一位
- if(tmp1>4)
- {
- tmp1=1; //防止设置参数溢出
- tmp2=0.0;
- }
- }
- if((PhaseB.P_Gain_compensation>+9.9)||(PhaseB.P_Gain_compensation<-9.9)) //防止常数设置错误,恢复默认值0.0
- {
- PhaseB.P_Gain_compensation=0.0;
- tmp2=0.0;
- tmp1=1;
- memset(disp0,0x00,25);
- Lcd_Puts(0,2," ");
- }
- sprintf(disp0,"%+04.2f",PhaseB.P_Gain_compensation);
- Lcd_Puts(0,2,disp0);
- Lcd_FlickerChar(tmp1,2);
- delay_ms(300);
- }
- //B相相位校正界面
- while(PAin(3)==0);
- Lcd_Puts(0,1," ");
- Lcd_Puts(0,1,"Enter Pha");
- memset(disp0,'0',25);
- sprintf(disp0,"%+04.2f",PhaseB.Ph_compensation);
- Lcd_Puts(0,2," ");
- tmp1=1;
- tmp2=0.0;
- Lcd_FlickerChar(tmp1,2);
- while(PAin(3)!=0) //key4按下表示退出相位设置界面
- {
- if(PAin(0)==0)
- {
- delay_ms(300);
- if(PhaseB.Ph_compensation>=0)
- PhaseB.Ph_compensation=PhaseB.Ph_compensation+(1*pow(10,tmp2)); //设置值递增 key1按下递增
- else
- PhaseB.Ph_compensation=PhaseB.Ph_compensation-(1*pow(10,tmp2)); //设置值递增 key1按下递增
- }
- if(PAin(2)==0)
- {
- delay_ms(300);
- if(PhaseB.Ph_compensation>=0)
- PhaseB.Ph_compensation=PhaseB.Ph_compensation-(1*pow(10,tmp2)); //设置值递减
- else
- PhaseB.Ph_compensation=PhaseB.Ph_compensation+(1*pow(10,tmp2)); //设置值递减
- }
- if(PAin(1)==0) //个十百千位调整和显示光标调整 key2按下递减
- {
- delay_ms(300);
- tmp2--;
- tmp1++;
- if(tmp1==2)
- tmp1++; //如果光标在小数位,移位到下一位
- if(tmp1>4)
- {
- tmp1=1; //防止设置参数溢出
- tmp2=0.0;
- }
- }
- if((PhaseB.Ph_compensation>+2.0)||(PhaseB.Ph_compensation<-2.0)) //防止常数设置错误,恢复默认值0.0
- {
- PhaseB.Ph_compensation=0.0;
- tmp2=0.0;
- tmp1=1;
- memset(disp0,0x00,25);
- Lcd_Puts(0,2," ");
- }
- sprintf(disp0,"%+04.2f",PhaseB.Ph_compensation);
- Lcd_Puts(0,2,disp0);
- Lcd_FlickerChar(tmp1,2);
- delay_ms(300);
- }
- }
- int main(void)
- {
- // u8 t;
- // u8 len;
- delay_init(); //延时函数初始化
- NVIC_Configuration(); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
- uart_init(9600); //串口初始化为9600
- // RTC_Init(); //RTC初始化
- KEY_Init(); //初始化与按键连接的硬件接口
- Lcd_Init();/*LCD初始化*/
- I2C_Configuration(); //初始化at24c256的scl、sda管脚
- Lcd_Clr();
- I2C_PageWrite(test,8,2,ADDR_24LC02); //EEPROM存储功能测试
- I2C_ReadByte(test2,8,2,ADDR_24LC02);
- /* 初始化ATT7022 */
- printf("\r\nInitializing ATT7022E...\r\n");
- ATT7022_Init();
- printf("\r\nFinish!\r\n");
- printf("\r\nAdjusting ATT7022E...\r\n");
- ATT_Adjust();
- printf("\r\nFinish!\r\n");
- // ATT_Test();
- while(1)
- {
- Read_ATT_AData();
- Read_ATT_BData();
- Read_ATT_CData();
- switch (ABC_Phase_val) //根据key1设置显示某一相参数
- {
- case 'A':
- Lcd_Clr();
- sprintf(disp0,"A phase:");
- Lcd_Puts(7,0,disp0);
- Output_ATT(ADataTypeDef);
- delay_ms(300);
- break;
- case 'B':
- Lcd_Clr();
- sprintf(disp0,"B phase:");
- Lcd_Puts(7,0,disp0);
- Output_ATT(BDataTypeDef);
- delay_ms(300);
- break;
- case 'C':
- Lcd_Clr();
- sprintf(disp0,"C phase:");
- Lcd_Puts(7,0,disp0);
- Output_ATT(CDataTypeDef);
- delay_ms(300);
- break;
- default:
- break;
- }
- if(PAin(0)==0) //切换相参数显示
- {
- ABC_Phase_val++;
- }
- if(ABC_Phase_val>'C') //确保显示变量在ABC三相之间
- ABC_Phase_val='A';
- //进入设置校表参数界面
- if(PAin(3)==0) //key4按下,表示执行输入校表参数
- {
- while(PAin(3)==0);
- Lcd_Clr();
- Lcd_Puts(0,0,"7022E Adjust");
- delay_ms(1000);
- A_Phase_Cal(); //设置A相校表参数
- B_Phase_Cal(); //设置B相校表参数
- C_Phase_Cal(); //设置C相校表参数
- }
- Lcd_CloseFlicker();
- }
- }
复制代码 |
|