锐能微RN8302/RN8302B电表芯片应用

作者

QQ群:852283276
微信:arm80x86
微信公众号:青儿创客基地
B站:主页 https://space.bilibili.com/208826118

SPI 地址空间描述

地址AD[10:0]映射:
0x000~0x0FF :计量参数寄存器空间
0x100~0x1FF :配置和状态寄存器空间
0x200~0x27F :波形采样数据缓存块1 空间
0x280~0x2FF :波形采样数据缓存块2 空间
0x300~0x37F :波形采样数据缓存块3 空间
0x380~0x3FF :波形采样数据缓存块4 空间
0x400~0x47F :波形采样数据缓存块5 空间
0x480~0x4FF :波形采样数据缓存块6 空间

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用锐能RN8302B芯片进行电能计量的示例代码,供参考: ``` #include <SPI.h> #define RN8302B_CS_PIN 10 // RN8302B寄存器地址 #define RN_UA 0x0C #define RN_UB 0x0E #define RN_UC 0x10 #define RN_IA 0x12 #define RN_IB 0x14 #define RN_IC 0x16 #define RN_E 0x06 #define RN_EA 0x08 void setup() { // 初始化SPI接口 SPI.begin(); SPI.setClockDivider(SPI_CLOCK_DIV2); // 初始化RN8302B芯片 pinMode(RN8302B_CS_PIN, OUTPUT); digitalWrite(RN8302B_CS_PIN, HIGH); delay(100); digitalWrite(RN8302B_CS_PIN, LOW); delay(100); digitalWrite(RN8302B_CS_PIN, HIGH); delay(100); // 设置电能积分器的脉冲输出模式 writeRegister(0x46, 0x0001); } void loop() { // 读取电流电压寄存器的值 uint16_t ua = readRegister(RN_UA); uint16_t ub = readRegister(RN_UB); uint16_t uc = readRegister(RN_UC); uint16_t ia = readRegister(RN_IA); uint16_t ib = readRegister(RN_IB); uint16_t ic = readRegister(RN_IC); // 计算电压电流实际值 float u = (float)ua / 32768.0 * 220.0; float v = (float)ub / 32768.0 * 220.0; float w = (float)uc / 32768.0 * 220.0; float i = (float)ia / 32768.0 * 5.0; float j = (float)ib / 32768.0 * 5.0; float k = (float)ic / 32768.0 * 5.0; // 读取电能寄存器的值 uint32_t e = read32Register(RN_E); // 输出结果 Serial.print("Voltage: "); Serial.print(u); Serial.print("V, "); Serial.print(v); Serial.print("V, "); Serial.print(w); Serial.println("V"); Serial.print("Current: "); Serial.print(i); Serial.print("A, "); Serial.print(j); Serial.print("A, "); Serial.print(k); Serial.println("A"); Serial.print("Power: "); Serial.print(u * i); Serial.print("W, "); Serial.print(v * j); Serial.print("W, "); Serial.print(w * k); Serial.println("W"); Serial.print("Energy: "); Serial.print(e * 0.001); Serial.println("kWh"); Serial.println(); delay(1000); } // 读取16位寄存器的值 uint16_t readRegister(uint8_t addr) { uint16_t value = 0; SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0)); digitalWrite(RN8302B_CS_PIN, LOW); SPI.transfer(addr); value = SPI.transfer(0) << 8; value |= SPI.transfer(0); digitalWrite(RN8302B_CS_PIN, HIGH); SPI.endTransaction(); return value; } // 读取32位寄存器的值 uint32_t read32Register(uint8_t addr) { uint32_t value = 0; SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0)); digitalWrite(RN8302B_CS_PIN, LOW); SPI.transfer(addr); value = (uint32_t)SPI.transfer(0) << 24; value |= (uint32_t)SPI.transfer(0) << 16; value |= (uint32_t)SPI.transfer(0) << 8; value |= (uint32_t)SPI.transfer(0); digitalWrite(RN8302B_CS_PIN, HIGH); SPI.endTransaction(); return value; } // 向寄存器写入16位的值 void writeRegister(uint8_t addr, uint16_t value) { SPI.beginTransaction(SPISettings(8000000, MSBFIRST, SPI_MODE0)); digitalWrite(RN8302B_CS_PIN, LOW); SPI.transfer(addr | 0x80); SPI.transfer(value >> 8); SPI.transfer(value & 0xFF); digitalWrite(RN8302B_CS_PIN, HIGH); SPI.endTransaction(); } ``` 该示例代码使用了Arduino开发板和SPI接口来与RN8302B芯片进行通信,可以实时读取电压、电流、功率和电能等数据。请注意,该代码仅供参考,具体的使用方法需要根据实际情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值