RN8302b調試筆記


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\n", __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,你得轉化為輸入信號值啊,這個怎么轉呢?也很頭疼,因為手冊他就沒咋說!

       其實我們要先根據電路計算出電流、電壓的轉換系數,之后用碼值來計算即可。先看一下基本的電壓的輸入電路:

 

如圖,Un是我們輸入的電壓(比如:220V),Uv是ADC測量通道的輸入值,根據已知電路,我們可以確定的是:

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

電流的計算方式類似,電流的輸入電路:

       如圖,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

 

后記:

簡單測了一下 ,電能計量和基本測量都不錯,價格也便宜,還是值得使用的。

有需要官方應用筆記的可以留下郵箱,我看到的話會發給您。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM