RN8302b调试笔记

摘要:
RN8302b调试说明很难调试。吐槽之后,只有一本手册,官方的申请说明仍然没有给出。我觉得在某个地方买一张正式的申请表太傲慢了……突然,我发现现在一切都需要钱。我希望博客公园的分享能继续下去!1.不要提及通信接口的其他内容。既然所有的PCB都已经制成,让我们从一个孔到另一个孔。这里我不再重复SPI的接口和通信协议。这部分是可靠的,可以根据需要完成。只要你读到IC ID=0x830200,比如
RN8302b调试笔记

艰难调试完毕,吐槽的话就不说了,只有个手册,官方应用笔记还不给,想想太窝火

无奈才某处花钱买了个官方应用笔记。。。。。

忽然发现,现在啥都要钱了,希望博客园的分享可以坚持下去!

1. 通讯接口

       别的不说了,既然PCB都做了,那就一个坑一个坑的来吧,这里不再赘述SPI的的接口以及通讯协议问题,这部分还都是靠谱的,按要求做就可以了。只要你读到IC的ID=0x830200,那就说明通讯接口调试完毕!

这里需要注意的是:RSTN引脚,必须处理!否则你会发现意想不到的惊喜!

通讯完成之后,我们可以读取寄存器了,这里强调一点,寄存器地址是分区的,通用的数据寄存器是BANK0,一些配置寄存器在BANK1,所以我们定义寄存器地址的时候,要有所区别。我习惯把他定义成十六位的,在写寄存器的函数里面,在处理一下,代码如下。

至于SPI的读写操作函数,不同的MCU不尽相同,不过大致都差不多,这里不再赘述了。

 1 static uint32_t
 2 bsp_rn8302_read_register(uint16_t Addr, uint8_t Length)
 3 {
 4     uint32_t Value = 0;
 5     uint8_t checksum = 0;
 6     uint8_t ucTemp;
 7 
 8     if (Length > 4) {
 9         Value = 0;
10     } else {
11         BSP_SPI_RN8302B_CS(0);
12         // AD[7:0]
13         bsp_spi_write_read((uint8_t)(Addr));
14         checksum += (uint8_t)(Addr);
15         // CMD[R/W-AD[10:8] BL[1:0] 00]
16         uint8_t cmd = (uint8_t)(((Addr>>8u)&0x07) << 4);
17         bsp_spi_write_read(cmd);
18         checksum += cmd;
19         // Read
20         for (uint8_t i=0u; i<Length; i++) {
21             ucTemp = bsp_spi_write_read(BSP_SPI_DUMMY_BYTE);
22             Value |= (uint32_t)ucTemp << (8*(Length-1u-i));
23             checksum += ucTemp;
24         }
25         // checksum
26         ucTemp = bsp_spi_write_read(BSP_SPI_DUMMY_BYTE);
27         if ((checksum|ucTemp) != 0xFF) {
28             Value = 0;
29             print("RN8302N<%s>: response checksum error
", __FUNCTION__);
30         }
31         BSP_SPI_RN8302B_CS(1);
32     }
33     return Value;
34 }
 1 static void
 2 bsp_rn8302_write_register(uint16_t Addr, uint8_t Length, uint32_t Value)
 3 {
 4     uint8_t checksum = 0;
 5     uint8_t ucTemp;
 6     if (Length > 4) {
 7         return;
 8     }
 9 
10     BSP_SPI_RN8302B_CS(0);
11     // AD[7:0]
12     bsp_spi_write_read((uint8_t)(Addr));
13     checksum += (uint8_t)(Addr);
14     // CMD[R/W-AD[10:8] BL[1:0] 00]
15     uint8_t cmd = (uint8_t)((((Addr>>8u)&0x07) << 4) | 0x80);
16     bsp_spi_write_read(cmd);
17     checksum += cmd;
18     // DAT
19     for (uint8_t i=0u; i<Length; i++) {
20         ucTemp = (uint8_t)(Value >> (8u*(Length-1u-i)));
21         bsp_spi_write_read(ucTemp);
22         checksum += ucTemp;
23     }
24     // CHECKSUM
25     bsp_spi_write_read(~checksum);
26 
27     BSP_SPI_RN8302B_CS(1);
28 }

2. 电压、电流的转换

       可以读到寄存器的数值之后,我们要做的就是数据的处理,比如你读到了UA UB UC,你得转化为输入信号值啊,这个怎么转呢?也很头疼,因为手册他就没咋说!

       其实我们要先根据电路计算出电流、电压的转换系数,之后用码值来计算即可。先看一下基本的电压的输入电路:

 RN8302b调试笔记第1张

如图,Un是我们输入的电压(比如:220V),Uv是ADC测量通道的输入值,根据已知电路,我们可以确定的是:

Uv = Un / 220K * (49.9*2),即:Un/Uv = 220000/99.8

电流的计算方式类似,电流的输入电路:

RN8302b调试笔记第2张

       如图,Ib是我们输入的测量电流(比如:2A),Ui是ADC测量通道(电流通道)的输入值,我们同样可以确定:

     Ui = Ib / 2000 * (49.9*2):Ib/Ui = 2000/99.8

根据官方应用笔记的描述,我们先计算电压转换系数Kv:

  Kv = Un / (Uv / 0.8 * 227)

将上式转换:

  Kv = Un/Uv * 0.8/227

注:227是RMS寄存器的满码值,Un/Uv=220000/99.8是电路参数,使用时需要针对实际电路修改!

带入当前电路参数计算:Kv= 220000/99.8 * 0.8 / 227= 1.31393E-05

继续计算电流转换系数:

  Ki = Ib / (Ui / 0.8 * 227)

将上式转换:

  Ki = Ib/Ui * 0.8/227

注:227是RMS寄存器的满码值,Ib/Ui=2000/99.8是电路参数,使用时需要针对实际电路修改!

带入当前电路参数计算:Ki = 2000/99.8 * 0.8 / 227= 1.19448E-07

有了转换系数Kv、Ki,我们就可以计算出测量电流的实际值了,不过说实话,常温下读取的精度还是不错的。

3. 功率的转换

RN8302可以直接读取有功、无功、视在功率,三者的关系这里不再赘述,读取功率之前,我们先确认一下功率因数是否正常,功率因数的计算公式,手册中有明确给出,所以不是很麻烦。这里需要注意的是,采样通道的相位校准寄存器的默认值是: 0x80!有时候由于代码的移植问题,我们习惯性把该值设为0,这样会导致功率因数出错,此处需要注意!

功率的转换中,我们使用一个电表常数EC,通过他来计算HFConst,该值要写到HFCONST1、HFCONST2寄存器中。官方给的HFConst的计算公式:

HFConst = (Uv/0.8) * (Ui/0.8) * 3.6*106 * Fosc / (32*EC*Un*Ib)

转换一下:

HFConst = [3.6*106 * Fosc / (0.8*0.8*32)] * (Uv/Un) * (Ui/Ib) * (1/EC)

      此处暂时不计算该值,仅保留公式。

      下面转入正题,开始计算功率转换系数Kp,同样根据官方的公式:

      Kp = 3.6*106 * Fosc / (231 * 32 * HFConst * EC)

把HFConst带入,我们得到一个和EC无关的计算公式:

Kp = 3.6*106*Fosc/(231*32)*1/{[3.6*106*Fosc/(0.8*0.8*32)] * (Uv/Un) * (Ui/Ib) }

简化公式:

      Kp = (0.8 * 0.8 / 231) * Un/Uv * Ib/Ui

其中: 231为功率寄存器的满码值,Un/Uv=220000/99.8Ib/Ui=2000/99.8是电路参数。

带入当前电路的参数:

       Kp = 0.8 * 0.8 / 231 * (220000/99.8) * (2000/99.8) = 1.31656E-05

这样我们就得到了Kp的转换系数,功率寄存器的更新周期是250ms。

4. 电能的计算

在第3部分,我们提到了电表常数EC,以及通过电表常数计算的HFConst,用以设置HFCONST1、HFCONST2寄存器,不过我们之前的计算都和这个无关。在计算电能的时候,我们就要用到这个参数了。

HFConst = [3.6*106 * Fosc / (0.8*0.8*32)] * (Uv/Un) * (Ui/Ib) * (1/EC)

关于电能的计算,手册有说明,这里不再赘述。说明的是,我们要给定一个EC(比如:3200),以此来计算出HFConst的值,这里的EC选取要注意大小,太小了可能会导致HFConst的计算值超限,因为HFCONST寄存器是16bits的。

RN8302可以方便的读取各项电能累计,常用的比如:

  • 合相有功电能累计、合相正向有功电能累计、合相反向有功电能累计
  • 合相无功电能累计、合相正向无功电能累计、合相反向无功电能累计
  • RMS合相视在电能累计

有个上述寄存器的数值,除以EC值,就是我们要读取的电表度数了。

5. 电参的校准

RN8302的校准相对比较简单,在其数据手册和应用笔记上都给出了计算方法,利用功率校表,总结起来就是:

  •  设定标准源输入的电压、电流,PF=1.0
  •  根据输入值校准各相电压、电流的增益
  •  校准有功功率增益(无功、视在增益等于有功增益)
  •  设定PF0.5
  •  根据有功功率的误差,校正功率相位。

设定标准源输入为Ui、Ii,寄存器读到的码值Ux_REG、Ix_REG:

各相电压增益的计算如下,GSUx(x=A、B、C):

GSUx = Ui / (Ux_REG * Kv) – 1

  •  如果GSUx≥0,     GSUx = GSUx * 215
  •  如果GSUx<0,     GSUx = GSUx * 215 + 216

各相电流增益的计算如下,GSIx(x=A、B、C):

  •  GSIx = Ii / (Ix_REG * Ki) – 1
  •  如果GSIx≥0, GSIx = GSIx * 215
  •  如果GSIx<0, GSIx = GSIx * 215 + 216

各相功率增益的计算如下,GPx(x=A、B、C):

ErrP = (Px_REG * Kp) / (Ui * Ii * 1.0) – 1

GPx = ErrP / (1 + ErrP) * (-1)

  •  如果GPx≥0,  GPx = GPx * 215
  •  如果GPx<0,  GPx = GPx * 215 + 216

设定PF=0.5,各相功率相位,Px_PHSL(x=A、B、C):

ErrP = (Px_REG * Kp) / (Ui * Ii * 0.5) – 1

Px_PHSL = ErrP / √3   * (-1)

  •  如果Px_PHSL≥0,Px_PHSL = Px_PHSL * 215
  •  如果Px_PHSL<0, Px_PHSL = Px_PHSL * 215 + 216

后记:

简单测了一下 ,电能计量和基本测量都不错,价格也便宜,还是值得使用的。

有需要官方应用笔记的可以留下邮箱,我看到的话会发给您。

免责声明:文章转载自《RN8302b调试笔记》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Java实现加密和解密的源代码ftrace使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

网站的PV UV IP---网站常见软件性能

IP,衡量不同时间段的上网人数.00:00-24:00内相同的地址被计算一次.例:日300W IP,至少300W人访问PV,衡量页面受欢迎程度.每刷新一次,被记录一次(刷pv),网站被访问的页面的数量 纯7层的,千万pv量 并发1-2wlvs+nginx10-20台 10w并发 NFS 4000w 只用做写,读取性能不佳. www.cnblogs.com/...

新型DenseBody框架:一张照片获得3D人体信息

来自云从科技和上海交通大学的研究者近期提出一种新型框架 DenseBody,可直接从一张彩色照片中获取 3D 人体姿势和形状。该研究设计了一种高效的 3D 人体姿势和形状表示,无需中间表示和任务,端到端地实现从单个图像到 3D 人体网格的生成。 多年以来,如何从单一图像估计人体的姿势和形状是多项应用都在研究的问题。研究者提出不同的方法,试图部分或者联合地解...

图像处理之YUV编码

RGB颜色空间 最常用的用途就是显示器系统,通过RGB数字驱动RGB电子枪发射电子,并激发显示屏上的荧光粉发出不同亮度的光线,并通过混合产生各种颜色。在RGB颜色空间中,任意色光F都可以用R、G、B三色不同分量的相加混合而成 YUV编码系统 YUV是一种彩色编码系统,相比于RGB颜色空间(用红绿蓝三基色描述),设计YUV的目的就是为了编码、传输的方便,减少...

多媒体基础知识之YUV数据

1.什么是YUV格式 YUV,是一种颜色编码方法。Y表示明亮度(Luminance、Luma),也就是灰度值。U和V则是色度、浓度(Chrominance、Chroma),作用是描述影像色彩及饱和度,用于指定像素的颜色。与我们熟知的RGB类似,YUV也是一种颜色编码方法,主要用于电视系统以及模拟视频领域,它将亮度信息(Y)与色彩信息(UV)分离,没有UV信...

Cesium深入浅出之阴影贴图【转】

引子 又偷懒了,说好的周更的,又拖了一个月咯。前面两篇写了可视域分析和视频投影,无一例外的都用到了ShadowMap也就是阴影贴图,因此觉得又必要单独写一篇阴影贴图的文章。当然了,还有另外一个原因,文章中视频投影是利用Cesium自带的Entity方式实现的,毫无技术性可言,在文章结尾我说了可以使用ShadowMap方式来做,原理类似于可视域分析,那么今天...

Nodejs事件引擎libuv源码剖析之:高效线程池(threadpool)的实现

     声明:本文为原创博文,转载请注明出处。      Nodejs编程是全异步的,这就意味着我们不必每次都阻塞等待该次操作的结果,而事件完成(就绪)时会主动回调通知我们。在网络编程中,一般都是基于Reactor线程模型的变种,无论其怎么演化,其核心组件都包含了Reactor实例(提供事件注册、注销、通知功能)、多路复用器(由操作系统提供,比如kque...