求助!STM32F103+ATT7022EU,读不到电压、电流、频率
求助!STM32F103+ATT7022EU,读不到电压、电流、频率
电压与电流的参数设定,针对STM32F103微控制器,采用att7022eu芯片,具体操作通过define指令完成。
各位英雄豪杰,我在使用STM32F103控制器读取ATT7022E时,仅能偶尔获取到各相的电压、电流以及频率数据(大约每10次才能成功读取1次,读取到的电压值显示为250伏以上,频率为50赫兹);同时,在串口调试工具中显示的信息同样不稳定,有时某些寄存器的数据是准确的,而有时则出现错误,甚至重启设备后,下一次读取的数据又恢复了正确。
各位使用ATT7022E模块的同行,能否帮忙审查一下我的代码,找出其中的问题所在?
依据《ATT7022EU应用指南》的记载,我对VCC、AVCC、VDD、REFCAP、RESET以及IRQ这些引脚的电平进行了检测,结果显示均处于正常状态,这表明该芯片正在正常运行。
做项目,结尾阶段,最后卡在这里了,急啊!
请用过ATT7022E的朋友帮忙,万分感谢!
ATT7022E.h内容如下:
#ifndef _ATT7022EU_H_
#define _ATT7022EU_H_
#define RST_Port as GPIOE, 表示这是用于ATT7022EU与STM32连接的RST引脚的配置,具体定义为GPIOE。
CS引脚定义为GPIOA,此为ATT7022EU与STM32之间连接所使用的控制信号脚(STM32负责向ATT7022EU输出数据)。
#define SCL_Port GPIOA //此定义将SCL引脚指定为GPIOA,用于ATT7022EU与STM32之间的连接(STM32向ATT7022EU发送数据)
DATA_Port定义为GPIOA,此为ATT7022EU与STM32间连接的DATA引脚(STM32负责向ATT7022EU输出数据)。
#define DIN_Port as GPIOA, 此定义用于ATT7022EU与STM32之间的连接,其中DIN引脚负责将数据从ATT7022EU传输至STM32。
定义RST_Pin为GPIO_Pin_2,此引脚用于连接ATT7022EU与STM32,实现复位功能。
CS_Pin 定义为 GPIO_Pin_4,此引脚是用于连接 ATT7022EU 与 STM32 的 CS 线(STM32向ATT7022EU输出数据)。
#define SCL_Pin GPIO_Pin_5 // 该定义用于指定STM32与ATT7022EU之间连接的SCL引脚(STM32负责向ATT7022EU发送数据)
DATA_Pin 被设定为 GPIO_Pin_7,这是ATT7022EU与STM32之间连接的数据引脚(STM32通过此引脚向ATT7022EU输出数据)。
#define DIN_Pin GPIO_Pin_6, 该引脚是ATT7022EU与STM32之间连接时使用的DIN端口,负责将数据从ATT7022EU传输到STM32。
#define 定义 Set_CS 函数,其功能是通过调用 GPIO_SetBits 函数,将 CS_Port 端口的 CS_Pin 引脚设置为高电平。
定义 Clr_CS 函数att7022e,其功能为通过 CS_Port 端口对 CS_Pin 引脚进行低电平操作,以实现复位控制。
定义宏Rev_CS,其功能为通过GPIO_WriteBit函数设置CS_Port端口的CS_Pin引脚状态,具体操作是将该引脚的输出电平设置为高电平或低电平,取决于当前GPIO_ReadOutputDataBit函数读取到的电平状态。
#define 定义 Set_SCL 函数,其功能是利用 GPIO_SetBits 函数,对 SCL_Port 端口的 SCL_Pin 引脚进行置位操作。
定义 Clr_SCL 函数,其功能是执行 GPIO_ResetBits 操作,针对 SCL_Port 和 SCL_Pin 进行位清零处理。
定义宏Rev_SCL,通过GPIO_WriteBit函数设置SCL_Port端口的SCL_Pin引脚的电平状态,具体操作为将SCL_Pin引脚的电平设置为高电平或低电平,这取决于GPIO_ReadOutputDataBit函数读取SCL_Pin引脚当前输出电平的状态,如果当前为高电平,则通过1减去该值得到低电平,反之亦然。
#define 设置数据 GPIO将位设置至高电平 (DATA端口号, DATA引脚号)
#define Clr_DATA, 通过GPIO_ResetBits函数, 对DATA_Port端口中的DATA_Pin引脚进行置零操作。
定义宏Rev_DATA,其值为将DATA_Port的DATA_Pin引脚的输出状态取反att7022e,即将GPIO_WriteBit函数应用于该引脚,并传入参数(1减去GPIO_ReadOutputDataBit函数读取的该引脚输出数据位的状态)。
#define 定义 Set_RST 函数求助!STM32F103+ATT7022EU,读不到电压、电流、频率,其功能是通过 GPIO_SetBits 函数设置 RST_Port 端口的 RST_Pin 引脚。
#define Clr_RST, 通过GPIO_ResetBits函数,对RST_Port端口的RST_Pin进行置零操作。
定义宏Rev_RST,即GPIO_WriteBit函数应用于RST_Port端口,对LED54_Pin引脚进行位操作,该操作为将GPIO_ReadOutputDataBit函数读取的RST_Pin引脚输出数据取反后,再写入到LED54_Pin引脚。
定义 Rd_MISO 为 GPIO_ReadInputDataBit 函数读取 DIN_Port 端口的 DIN_Pin 引脚状态,若为高电平则返回 1。
#define r_Pflag 0x3D //表示功率流向的标识
#define R_Sflag 十六进制的2C //表示状态寄存器的标志
定义常量r_Pa为十六进制的数值1。
定义常量r_Pb为十进制的2。
#define 注册参数为 0x03
#define r_Pt 0x04 // 表示有功功率的标识
定义常量r_Qa为十六进制的5。
定义宏r_Qb的值为0x06。
定义常量r_Qc为十进制数7。
#define r_Qt 0x08 //表示无功率输出
#define 常量r_Sa 为十六进制的0x09
定义常量r_Sb为十进制数10。
定义常量r_Sc为十六进制的0x0B。
#define R_ST 十六进制数0C //表示视在功率的数值
定义常量r_UaRms为十六进制的0x0D。
定义宏r_UbRms的值为0x0E。
定义宏r_UcRms的值为0x0F。
#define 定义 r_UtRms 的值为 0x2B,代表电压的有效值。
定义常量r_IaRms为十进制的16。
定义宏r_IbRms为十六进制的11。
定义宏r_IcRms的值为0x12。
#define 定义 r_ItRms 的值为 0x13,表示电流的有效值。
定义常量r_Pfa为十六进制的14。
#define 定义了变量 r_Pfb,其值为 0x15。
定义宏r_Pfc为十六进制数16。
#define 功率因数标识符 0x17 //表示功率因数值
#define 线网频率值为 0x1C
定义常量r_Epa为十六进制的1E。
定义常量r_Epb为十六进制的1F。
定义常量r_Epc为十六进制的20。
#define r_Ept 0x21 // 表示累加的有功电能的寄存器地址
定义常量r_Eqa为十六进制的22。
定义常量r_Eqb为十六进制的23。
定义常量r_Eqc为十六进制的24。
#define r_Eqt 0x25 // 此标识代表累加无功电能的数值
定义常量r_Epa2为十六进制的31。
定义常量r_Epb2为十六进制的数值32。
定义常量r_Epc2为十六进制的数值33。
#define r_Ept2 0x34 //表示清零功能的电能寄存器
定义常量r_Eqa2为十六进制的35。
定义常量r_Eqb2为十六进制的数值36。
定义常量r_Eqc2为十六进制的37。
#define r_Eqt2 0x38 //该定义用于表示清零功能的无功电能寄存器地址
#define 高频输出参数常量 0xA0 //此处定义了一个常量,用于表示高频输出的相关参数
#define UADC 为 0xBF,表示电压通道的放大倍数。
#define U增益A 0x9B
#define U增益B 0x9C
#define UgainC 0x9D,代表分相电压的校准参数。
定义宏IgainA为十六进制的1A。
定义宏IgainB为十六进制的1B。
#define IgainC 0x1C // 此宏定义用于设置分相电压的校准参数
#define PgainB 0x05 // 表示B相功率增益设置为5
#define Vu, 电压通道所采集的电压值为0.190。
#define Vi 为 0.003,表示电流通道的采样电压值。
定义常量Un为220,表示额定电压值。
定义符号In,其值为4.15,代表额定电流。
定义Meter_G为1.163,这是ATT7022E的常数。
定义Meter_HFConst常量,其值为(2.592乘以10的10次方乘以Meter_G的平方乘以Vu乘以Vi)除以(In乘以Un乘以Meter_Ec)。
#define 高频常数表达式为:(2.592×10^10×米_常数×米_常数×微变量×变量)/(电流_入×电流_出×米_常数电常数)
电表常数设定为3200,此值为默认数值,但需注意,根据实际测量结果产生的误差att7022e,此数值应适时进行调整。
typedef struct // 该结构体仅需读取电压、电流以及频率数据,其他信息暂时不予考虑,无需处理。
// // u32 P; // 表示该变量代表有功功率的数值
// // float Rp;
// // u32 Q; // 表示该变量代表无功功率的数值
// // float Rq;
u32 S表示,该数值代表视在功率。
// // float Rs;
u32 URms; // 表示电压的有效数值
float Rurms;
u32 IRms; // 表示电流的有效值,具体数值为32位无符号整数。
float Rirms;
定义一个无符号整型变量Pf,代表功率因数。
// // float Rpf;
u32 Freq; // 表示线网的频率值
float Rfreq;
}DataTypeDef;
定义数据类型A、B、C、T。
但需注意,这一默认值需根据实际测量中出现的误差进行相应的调整!
float PhaseB_I_Amp_Factor; // B相电流的放大系数设定为1.0,作为初始值;然而,这一数值需依据实际测量的误差情况进行相应调整!
float PhaseC_I_Amp_Factor; //C相电流的放大系数设定为1.0,此为初始值,需根据实际测得的误差进行相应的调整!
float PhaseT_I_Amp_Factor; // T相电流放大倍数设定,初始值为1.0,需注意,此值应依据实际测量误差进行相应调整!
float PhaseA_V_Amp_Factor; // 代表A相的电压放大系数,其初始设定为1.0,但需注意,这一数值需依据实际测量的误差情况进行相应调整!
应根据实际测量中出现的误差进行相应的调整!
float PhaseC_V_Amp_Factor; //此变量代表C相电压的放大倍数,其初始设定为1.0。请注意,这一默认值需根据实际测量中出现的误差进行相应的调整!
float PhaseT_Voltage_Amplification_Ratio = 1.0; //T相电压放大比率设定为1.0,此为初始标准值,需依据实际测量结果中的误差进行相应调整!
void delay_us1(u16 time);
函数u32 SPI_ATT_Read(u8 data)执行操作;该操作将SIG转换为Sflag.7标志位。
该函数SPI_ATT_Write用于向指定通信地址写入数据,其中com_add参数代表通信地址,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);
执行 Output_ATT 函数,输出 DataTypeDef 类型的数据。
void Read_ATT_TestData(void);
执行任务监控函数,参数为指向数据的指针。
定义了一个函数,该函数名为itoa求助!STM32F103+ATT7022EU,读不到电压、电流、频率,其参数包括一个整数值、一个字符指针以及一个基数,函数的作用是将整数值转换为字符串形式,并将结果存储在由字符指针指向的字符串中。
- 随机文章
- 热门文章
- 热评文章