使用CH32V103C8T6的SPI与ht7038通讯。



波形

必须获取rChipID数据才能确信SPI通讯成功。

ht7038.h
/*
* HT7038.h
*
* Created on: 2022年5月20日
* Author: armxu
*/
#ifndef USER_HT7038_H_
#define USER_HT7038_H_
#include "stdint.h"
#include "ch32v10x_spi.h"
#define CS_PIN_PORT GPIOA
#define CS_PIN GPIO_Pin_4
#define CS(X) GPIO_WriteBit(CS_PIN_PORT, CS_PIN, X)
//===================================================
// 定义HT7038的数据寄存器
//===================================================
#define rDeviceID 0x00 //7038 Device ID
#define rPa 0x01 //A相有功功率
#define rPb 0x02 //B相有功功率
#define rPc 0x03 //C相有功功率
#define rPt 0x04 //合相有功功率
#define rQa 0x05 //A相无功功率
#define rQb 0x06 //B相无功功率
#define rQc 0x07 //C相无功功率
#define rQt 0x08 //合相无功功率
#define rSa 0x09 //A相视在功率
#define rSb 0x0A //B相视在功率
#define rSc 0x0B //C相视在功率
#define rSt 0x0C //合相视在功率
#define rUaRms 0x0D //A相电压有效值
#define rUbRms 0x0E //B相电压有效值
#define rUcRms 0x0F //C相电压有效值
#define rIaRms 0x10 //A相电流有效值
#define rIbRms 0x11 //B相电流有效值
#define rIcRms 0x12 //C相电流有效值
#define rItRms 0x13 //ABC相电流矢量和的有效值
#define rPfa 0x14 //A相功率因数
#define rPfb 0x15 //B相功率因数
#define rPfc 0x16 //C相功率因数
#define rPft 0x17 //合相功率因数
#define rPga 0x18 //A相电流与电压相角
#define rPgb 0x19 //B相电流与电压相角功率因数
#define rPgc 0x1a //C相电流与电压相角
#define rINTFlag 0x1b //中断标志,读后清零 ☆
#define rFreq 0x1C //线频率
#define rEFlag 0x1d //电能寄存器的工作状态,读后清零☆
#define rEpa 0x1e //A相有功电能
#define rEpb 0x1f //B相有功电能
#define rEpc 0x20 //C相有功电能
#define rEpt 0x21 //合相有功电能
#define rEqa 0x22 //A相无功电能
#define rEqb 0x23 //B相无功电能
#define rEqc 0x24 //C相无功电能
#define rEqt 0x25 //合相无功电能
#define rYUaUb 0x26 //Ua与Ub的电压夹角 ☆
#define rYUaUc 0x27 //Ua与Uc的电压夹角 ☆
#define rYUbUc 0x28 //Ub与Uc的电压夹角 ☆
#define rTPSD 0x2a //温度传感器的输出
#define rURmst 0x2b //ABC电压矢量和的有效值
#define rS_Flag 0x2c //存放断相、相序、SIG信号的有效值
#define rBackReg 0x2d //通讯数据备份寄存器☆
#define rComChksum 0x2e //通讯校验和寄存器☆
#define rSampleIA 0x2f //A相电流通道ADC采样数据☆
#define rSampleIB 0x30 //B相电流通道ADC采样数据☆
#define rSampleIC 0x31 //C相电流通道ADC采样数据☆
#define rSampleUA 0x32 //A相电压通道ADC采样数据☆
#define rSampleUB 0x33 //B相电压通道ADC采样数据☆
#define rSampleUC 0x34 //C相电压通道ADC采样数据☆
#define rEsa 0x35 //A相视在电能☆
#define rEsb 0x36 //B相视在电能☆
#define rEsc 0x37 //C相视在电能☆
#define rEst 0x38 //合相视在电能☆
#define rFstCntA 0x39 //A相快速脉冲计数☆
#define rFstCntB 0x40 //B相快速脉冲计数☆
#define rFstCntC 0x40 //C相快速脉冲计数☆
#define rFstCntT 0x41 //合相快速脉冲计数☆
#define rPFlag 0x3d //有功和无功功率方向,正向为0,负向为1
#define rChkSum 0x3e //校表数据校验寄存器(三相四线模式下是0x01D4CD;三相三线模式下是0x01E0CD;)
#define rVrefgain 0x5c //Vref自动补偿系数
#define rChipID 0x5d //芯片版本指示器0X7026E0
#define rChkSum1 0x5e //新增校表寄存器校验和
//====================================

这篇博客详细介绍了如何使用CH32V103C8T6微控制器通过SPI接口与HT7038电能计量芯片进行通讯,包括读取和写入数据的函数实现。内容涵盖SPI通讯的初始化、HT7038的复位和配置,以及读取电压、频率等关键数据的例程。通过对HT7038寄存器的访问,实现了对电能参数的测量和校准,如电压增益设置、相位校正等。
最低0.47元/天 解锁文章
8493





