搜索
bottom↓
回复: 117

单相计量芯片RN8209D使用经验分享

  [复制链接]

出0入0汤圆

发表于 2018-10-15 11:20:43 | 显示全部楼层 |阅读模式
本帖最后由 Baldwin 于 2018-10-16 08:24 编辑

之前用了三相计量芯片RN8302,RN8302计量芯片使用经验分享https://www.amobbs.com/thread-5697512-1-1.html
最近产品的另外一个系列需要单向计量,于是用了RN8209D,做下来效果还可以 ,能满足1级的精度,实际可以做到0.5S,总的来说这款芯片还是蛮不错的;老规矩,把相关资料分享给大家,少走弯路;
以下是实验时的误差记录


HFConst,功率转换系数,启动功率寄存器值换算方法



1---------------------------------------硬件部分-----------------------------------------------------------------------------------

电压和电流都采用互感器,电压采样采用泽明1:1电压互感器,电流采样采用5A:2.5mA互感器;RN8209D采用模拟SPI与单片机进行通信;电路相对比较简单;

2---------------------------------------RN8209D通信部分,采用模拟SPI-------------------------------------------------------------------------
  1. void RN8209D_ReadRegNoCheck(uint8_t addr,uint8_t *regbuf,uint8_t regbuflen)
  2. {
  3.     uint8_t ucI,ucK;

  4.     RN8209D_CS_CLR();
  5.     delay_us(10);
  6.     addr |= 0x00;            //发送读数据命令(bit.7=0)
  7.     for(ucI=0;ucI<8;ucI++)        //发送读数据命令,下降沿接收数据,高位在前,低位在后
  8.     {
  9.         if( addr & 0x80 )
  10.             RN8209D_MOSI_SET();
  11.         else
  12.             RN8209D_MOSI_CLR();
  13.         RN8209D_SCK_SET();
  14.         delay_us(RN_CLOCKWIDTH);
  15.         RN8209D_SCK_CLR();      //在时钟的下降沿写数据
  16.         addr<<=1;
  17.         delay_us(RN_CLOCKWIDTH);
  18.     }
  19.     RN8209D_MOSI_CLR();
  20.     RN8209D_SCK_CLR();
  21.     delay_us(50);
  22.     for(ucK=0;ucK<regbuflen;ucK++)
  23.     {
  24.         regbuf[ucK]=0x00;
  25.         for(ucI=0;ucI<8;ucI++)
  26.         {
  27.             RN8209D_SCK_SET();
  28.             delay_us(RN_CLOCKWIDTH);
  29.             regbuf[ucK]<<=1;
  30.             RN8209D_SCK_CLR();      //在时钟的下降沿读数据
  31.             delay_us(RN_CLOCKWIDTH/2);
  32.             if(RN8209D_Read_MISO())
  33.                 regbuf[ucK]=regbuf[ucK]|0x01;
  34.             delay_us(RN_CLOCKWIDTH/2);
  35.         }
  36.     }
  37.     RN8209D_CS_SET();
  38.     delay_us(10);
  39.     RN8209D_SCK_CLR();
  40.     delay_us(10);
  41. }

  42. uint8_t RN8209D_ReadReg(uint8_t addr,uint8_t *regbuf,uint8_t regbuflen)
  43. {
  44.     uint8_t buf[4];

  45.     RN8209D_ReadRegNoCheck(addr,regbuf,regbuflen);
  46.     m_memset(buf,0x01,4);
  47.     RN8209D_ReadRegNoCheck(Reg_RData,buf,4);

  48.     if(regbuflen == 3){
  49.         if(m_memcmp(regbuf,buf+1,regbuflen) == 0)
  50.             return 0;
  51.         else
  52.             return 1;
  53.     }
  54.     else if(regbuflen == 4){
  55.         if(m_memcmp(regbuf,buf,regbuflen) == 0)
  56.             return 0;
  57.         else
  58.             return 1;
  59.     }
  60.     else if(regbuflen == 2){
  61.         if(m_memcmp(regbuf,buf+2,regbuflen) == 0)
  62.             return 0;
  63.         else
  64.             return 1;
  65.     }
  66.     else{
  67.         return 1;
  68.     }

  69. }

  70. void RN8209D_WriteRegNoCheck(uint8_t addr,uint8_t *regbuf,uint8_t regbuflen)
  71. {
  72.     uint8_t ucI,ucK;

  73.     RN8209D_CS_CLR();
  74.     delay_us(100);
  75.     addr |= 0x80;   //发送写数据命令(bit.7=1)
  76.     for(ucI=0;ucI<8;ucI++)
  77.     {
  78.         if( addr & 0x80 )
  79.             RN8209D_MOSI_SET();
  80.         else
  81.             RN8209D_MOSI_CLR(); ;
  82.         RN8209D_SCK_SET();
  83.         delay_us(RN_CLOCKWIDTH);
  84.         RN8209D_SCK_CLR();          //在时钟的下降沿写数据
  85.         addr<<=1;
  86.         delay_us(RN_CLOCKWIDTH);
  87.     }
  88.     RN8209D_MOSI_CLR();
  89.     RN8209D_SCK_CLR();
  90.     delay_us(500);
  91.     for(ucK=0;ucK<regbuflen;ucK++)
  92.     {
  93.         for(ucI=0;ucI<8;ucI++)
  94.         {
  95.             if(regbuf[ucK] & 0x80 )
  96.                 RN8209D_MOSI_SET();
  97.             else
  98.                 RN8209D_MOSI_CLR();
  99.             RN8209D_SCK_SET();
  100.             delay_us(RN_CLOCKWIDTH);
  101.             RN8209D_SCK_CLR();      //在时钟的下降沿写数据
  102.             regbuf[ucK]<<=1;
  103.             delay_us(RN_CLOCKWIDTH);
  104.         }
  105.     }
  106.     RN8209D_MOSI_CLR();
  107.     delay_us(100);
  108.     RN8209D_CS_SET();
  109.     delay_us(100);
  110.     RN8209D_SCK_CLR();
  111.     delay_us(100);
  112. }

  113. uint8_t RN8209D_WriteReg(uint8_t addr,uint8_t *regbuf,uint8_t regbuflen)
  114. {
  115.     uint8_t buf[4];

  116.     RN8209D_WriteRegNoCheck(addr,regbuf,regbuflen);
  117.     m_memset(buf,0,4);
  118.     RN8209D_WriteRegNoCheck(Reg_WData,buf,regbuflen);

  119.     if(regbuflen == 3){
  120.         if(m_memcmp(regbuf,buf+1,regbuflen) == 0)
  121.             return 0;
  122.         else
  123.             return 1;
  124.     }
  125.     else if(regbuflen == 4){
  126.         if(m_memcmp(regbuf,buf,regbuflen) == 0)
  127.             return 0;
  128.         else
  129.             return 1;
  130.     }
  131.     else if(regbuflen == 2){
  132.         if(m_memcmp(regbuf,buf+2,regbuflen) == 0)
  133.             return 0;
  134.         else
  135.             return 1;
  136.     }
  137.     else{
  138.         return 1;
  139.     }
  140. }
复制代码


3---------------------------------------RN8209 寄存器-------------------------------------------------------------------------
寄存器主要分2块,校表参数寄存器和计量参数寄存器



4---------------------------------------RN8209 特殊命令------------------------------------------------------------------------
RN8209部分寄存器进行写操作时,需要先发送写使能,才可以对寄存器操作,这点需要注意;同时,对RN8209芯片操作时,需要先发送复位命令哦;


5---------------------------------------RN8209 初始化(非校表初始化)------------------------------------------------------------------------

这是RN8209需要用的变量,我把它放到结构体里,方便观察
  1. typedef struct{
  2.     uint16_t Cst_HFConst;
  3.     uint16_t Cst_PStart;  //有功启动功率
  4.     uint16_t Cst_DStart;
  5.     uint16_t Cst_GPQA;    //A通道功率增益校正
  6.     uint16_t Cst_GPQB;    //B通道功率增益校正
  7.     uint8_t  Cst_PhsA;    //A通道相位校正
  8.     uint8_t  Cst_PhsB;    //B通道相位校正
  9.     uint16_t Cst_QPhsCal; //无功相位校正
  10.     uint16_t Cst_APOSA;   //A通道有功功率offset校正
  11.     uint16_t Cst_APOSB;   //B通道有功功率offset校正
  12.     uint16_t Cst_RPOSA;   //A通道无功功率offset校正
  13.     uint16_t Cst_RPOSB;   //B通道无功功率offset校正
  14.     uint16_t Cst_IARMSOS; //A通道电流有效值offset校正
  15.     uint16_t Cst_IBRMSOS; //B通道电流有效值offset校正
  16.     uint16_t Cst_IBGain;  //B通道电流增益

  17.     uint16_t Cst_Ku;
  18.     uint32_t Cst_Kia;
  19.     uint32_t Cst_Kib;

  20.     uint16_t cheskSum;

  21. }StDef_RN8209DPara;
复制代码

  1. uint8_t RN8209D_Init(void)
  2. {
  3.     uint8_t regbuf[4];
  4.     uint8_t status = 1;

  5.     RN8209D_GPIOConfig();

  6.     RN8209D_RST_CLR();
  7.     delay_ms(100);
  8.     RN8209D_RST_SET();
  9.     delay_ms(100);

  10.     //读取RN8209 DeviceID
  11.     if(RN8209D_ReadReg(Reg_DeviceID,regbuf,3) == 0)
  12.     {
  13.         if((regbuf[0]==0x82)&&(regbuf[1]==0x09)&&(regbuf[2]==0x00)){
  14.             status = 0;
  15.         }
  16.         else{
  17.             status = 1;
  18.         }
  19.     }

  20.     //默认换算系数
  21.     //StDef_RN8209DPara_Reg.Cst_Kia = 41938;
  22.     //StDef_RN8209DPara_Reg.Cst_Kib = 44529;
  23.     //StDef_RN8209DPara_Reg.Cst_Ku  = 8711;

  24.     if(status == 0)
  25.     {
  26.         //写使能
  27.         regbuf[0] = 0xE5;
  28.         RN8209D_WriteReg(WREN,regbuf,1);
  29.         //复位
  30.         regbuf[0] = 0xFA;
  31.         RN8209D_WriteReg(WREN,regbuf,1);
  32.         delay_ms(20);
  33.         //写使能
  34.         regbuf[0] = 0xE5;
  35.         RN8209D_WriteReg(WREN,regbuf,1);
  36.         //系统控制寄存器
  37.         regbuf[0] = 0x00;
  38.         regbuf[1] = 0x51;  //开启通道B,A、B通道增益2
  39.         RN8209D_WriteReg(Reg_SYSCON,regbuf,2);
  40.         m_memset(regbuf,0,2);
  41.         RN8209D_ReadReg(Reg_SYSCON,regbuf,2);
  42.         //写HFCONST
  43.         regbuf[0] = 0x35;
  44.         regbuf[1] = 0x7B;
  45.         RN8209D_WriteReg(Reg_HFCONST,regbuf,2);
  46.         m_memset(regbuf,0,2);
  47.         RN8209D_ReadReg(Reg_HFCONST,regbuf,2);
  48.         //启动功率
  49.         regbuf[0] = 0x01;
  50.         regbuf[1] = 0x2D;
  51.         RN8209D_WriteReg(Reg_PStart,regbuf,2);
  52.         regbuf[0] = 0x01;
  53.         regbuf[1] = 0x2D;
  54.         RN8209D_WriteReg(Reg_DStart,regbuf,2);
  55.         //计量控制
  56.         regbuf[0] = 0x80;  //电能读后清零
  57.         regbuf[1] = 0x03;
  58.         RN8209D_WriteReg(Reg_EMUCON,regbuf,2);
  59.         //计量控制2
  60.         regbuf[0] = 0x00;
  61.         regbuf[1] = 0xB0;
  62.         RN8209D_WriteReg(Reg_EMUCON2,regbuf,2);
  63.         //A通道有功功率增益
  64.         //StDef_RN8209DPara_Reg.Cst_GPQA = 0;
  65.         regbuf[0] = StDef_RN8209DPara_Reg.Cst_GPQA/256;
  66.         regbuf[1] = StDef_RN8209DPara_Reg.Cst_GPQA%256;
  67.         RN8209D_WriteReg(Reg_GPQA,regbuf,2);
  68.         //B通道有功功率增益
  69.         //StDef_RN8209DPara_Reg.Cst_GPQB = 0;
  70.         regbuf[0] = StDef_RN8209DPara_Reg.Cst_GPQB/256;
  71.         regbuf[1] = StDef_RN8209DPara_Reg.Cst_GPQB%256;
  72.         RN8209D_WriteReg(Reg_GPQB,regbuf,2);
  73.         //A通道相位校正
  74.         //StDef_RN8209DPara_Reg.Cst_PhsA = 0;
  75.         regbuf[0] = StDef_RN8209DPara_Reg.Cst_PhsA;
  76.         RN8209D_WriteReg(Reg_PhsA,regbuf,1);
  77.         //B通道相位校正
  78.         //StDef_RN8209DPara_Reg.Cst_PhsB = 0;
  79.         regbuf[0] = StDef_RN8209DPara_Reg.Cst_PhsB;
  80.         RN8209D_WriteReg(Reg_PhsB,regbuf,1);
  81.         //A通道有功功率offset
  82.         //StDef_RN8209DPara_Reg.Cst_APOSA = 0;
  83.         regbuf[0] = StDef_RN8209DPara_Reg.Cst_APOSA/256;
  84.         regbuf[1] = StDef_RN8209DPara_Reg.Cst_APOSA%256;
  85.         RN8209D_WriteReg(Reg_APOSA,regbuf,2);
  86.         //B通道有功功率offset
  87.         //StDef_RN8209DPara_Reg.Cst_APOSB = 0;
  88.         regbuf[0] = StDef_RN8209DPara_Reg.Cst_APOSB/256;
  89.         regbuf[1] = StDef_RN8209DPara_Reg.Cst_APOSB%256;
  90.         RN8209D_WriteReg(Reg_APOSB,regbuf,2);
  91.         //A通道无功功率offset
  92.         StDef_RN8209DPara_Reg.Cst_RPOSA = 0;
  93.         regbuf[0] = StDef_RN8209DPara_Reg.Cst_RPOSA/256;
  94.         regbuf[1] = StDef_RN8209DPara_Reg.Cst_RPOSA%256;
  95.         RN8209D_WriteReg(Reg_RPOSA,regbuf,2);
  96.         //B通道无功功率offset
  97.         StDef_RN8209DPara_Reg.Cst_RPOSB = 0;
  98.         regbuf[0] = StDef_RN8209DPara_Reg.Cst_RPOSB/256;
  99.         regbuf[1] = StDef_RN8209DPara_Reg.Cst_RPOSB%256;
  100.         RN8209D_WriteReg(Reg_RPOSB,regbuf,2);
  101.         //A通道电流offset
  102.         //StDef_RN8209DPara_Reg.Cst_IARMSOS = 0;
  103.         regbuf[0] = StDef_RN8209DPara_Reg.Cst_IARMSOS/256;
  104.         regbuf[1] = StDef_RN8209DPara_Reg.Cst_IARMSOS%256;
  105.         RN8209D_WriteReg(Reg_IARMSOS,regbuf,2);
  106.         //B通道电流offset
  107.         //StDef_RN8209DPara_Reg.Cst_IBRMSOS = 0;
  108.         regbuf[0] = StDef_RN8209DPara_Reg.Cst_IBRMSOS/256;
  109.         regbuf[1] = StDef_RN8209DPara_Reg.Cst_IBRMSOS%256;
  110.         RN8209D_WriteReg(Reg_IBRMSOS,regbuf,2);
  111.         //B通道电流增益
  112.         StDef_RN8209DPara_Reg.Cst_IBGain = 0;
  113.         regbuf[0] = StDef_RN8209DPara_Reg.Cst_IBGain/256;
  114.         regbuf[1] = StDef_RN8209DPara_Reg.Cst_IBGain%256;
  115.         RN8209D_WriteReg(Reg_IBGain,regbuf,2);
  116.         //直流通道
  117.         regbuf[0]=0;regbuf[1]=0;
  118.         RN8209D_WriteReg(Reg_D2FPL,regbuf,2);
  119.         regbuf[0]=0;regbuf[1]=0;
  120.         RN8209D_WriteReg(Reg_D2FPH,regbuf,2);
  121.         regbuf[0]=0;regbuf[1]=0;
  122.         RN8209D_WriteReg(Reg_DCIAH,regbuf,2);
  123.         regbuf[0]=0;regbuf[1]=0;
  124.         RN8209D_WriteReg(Reg_DCIBH,regbuf,2);
  125.         regbuf[0]=0;regbuf[1]=0;
  126.         RN8209D_WriteReg(Reg_DCUH,regbuf,2);
  127.         regbuf[0]=0;regbuf[1]=0;
  128.         RN8209D_WriteReg(Reg_DCL,regbuf,2);
  129.         //写保护
  130.         regbuf[0] = 0xDC;
  131.         RN8209D_WriteReg(WREN,regbuf,1);
  132.         //获取校表寄存器校验值
  133.         RN8209D_GetCheckSum();
  134.     }

  135.     return status;
  136. }
复制代码


6---------------------------------------RN8209 校表初始化)------------------------------------------------------------------------
  1. void RN8209D_CalibrateInit(void)
  2. {
  3.     uint8_t regbuf[4];
  4.     uint8_t status = 1;

  5.     //读取RN8209 DeviceID
  6.     if(RN8209D_ReadReg(Reg_DeviceID,regbuf,3) == 0){
  7.         if((regbuf[0]==0x82)&&(regbuf[1]==0x09)&&(regbuf[2]==0x00)){
  8.             status = 0;
  9.         }
  10.         else{
  11.             status = 1;
  12.         }
  13.     }

  14.     //默认换算系数
  15.     //StDef_RN8209DPara_Reg.Cst_Kia = 41938;
  16.     //StDef_RN8209DPara_Reg.Cst_Kib = 44529;
  17.     //StDef_RN8209DPara_Reg.Cst_Ku = 8711;
  18.     if(status == 0){
  19.         //写使能
  20.         regbuf[0] = 0xE5;
  21.         RN8209D_WriteReg(WREN,regbuf,1);
  22.         //复位
  23.         regbuf[0] = 0xFA;
  24.         RN8209D_WriteReg(WREN,regbuf,1);
  25.         delay_ms(20);
  26.         //写使能
  27.         regbuf[0] = 0xE5;
  28.         RN8209D_WriteReg(WREN,regbuf,1);
  29.         //系统控制寄存器
  30.         regbuf[0] = 0x00;
  31.         regbuf[1] = 0x51;  //开启通道B
  32.         RN8209D_WriteReg(Reg_SYSCON,regbuf,2);
  33.         m_memset(regbuf,0,2);
  34.         RN8209D_ReadReg(Reg_SYSCON,regbuf,2);
  35.         //写HFCONST
  36.         regbuf[0] = 0x35;
  37.         regbuf[1] = 0x7B;
  38.         RN8209D_WriteReg(Reg_HFCONST,regbuf,2);
  39.         m_memset(regbuf,0,2);
  40.         RN8209D_ReadReg(Reg_HFCONST,regbuf,2);
  41.         //启动功率
  42.         regbuf[0] = 0x01;
  43.         regbuf[1] = 0x2D;
  44.         RN8209D_WriteReg(Reg_PStart,regbuf,2);
  45.         regbuf[0] = 0x01;
  46.         regbuf[1] = 0x2D;
  47.         RN8209D_WriteReg(Reg_DStart,regbuf,2);
  48.         //计量控制
  49.         regbuf[0] = 0x80;  //电能读后清零
  50.         regbuf[1] = 0x03;
  51.         RN8209D_WriteReg(Reg_EMUCON,regbuf,2);
  52.         //计量控制2
  53.         regbuf[0] = 0x00;
  54.         regbuf[1] = 0xB0;  //自定义电能寄存器为B通道
  55.         RN8209D_WriteReg(Reg_EMUCON2,regbuf,2);
  56.         //B通道电流增益
  57.         regbuf[0] = 0;
  58.         regbuf[1] = 0;
  59.         RN8209D_WriteReg(Reg_IBGain,regbuf,2);
  60.         //A通道有功功率增益
  61.         regbuf[0] = 0;
  62.         regbuf[1] = 0;
  63.         RN8209D_WriteReg(Reg_GPQA,regbuf,2);
  64.         //B通道有功功率增益
  65.         regbuf[0] = 0;
  66.         regbuf[1] = 0;
  67.         RN8209D_WriteReg(Reg_GPQB,regbuf,2);
  68.         //A通道相位校正
  69.         regbuf[0] = 0;
  70.         RN8209D_WriteReg(Reg_PhsA,regbuf,1);
  71.         //B通道相位校正
  72.         regbuf[0] = 0;
  73.         RN8209D_WriteReg(Reg_PhsB,regbuf,1);
  74.         //A通道有功功率offset
  75.         regbuf[0] = 0;
  76.         regbuf[1] = 0;
  77.         RN8209D_WriteReg(Reg_APOSA,regbuf,2);
  78.         //B通道有功功率offset
  79.         regbuf[0] = 0;
  80.         regbuf[1] = 0;
  81.         RN8209D_WriteReg(Reg_APOSB,regbuf,2);
  82.         //A通道无功功率offset
  83.         regbuf[0] = 0;
  84.         regbuf[1] = 0;
  85.         RN8209D_WriteReg(Reg_RPOSA,regbuf,2);
  86.         //B通道无功功率offset
  87.         regbuf[0] = 0;
  88.         regbuf[1] = 0;
  89.         RN8209D_WriteReg(Reg_RPOSB,regbuf,2);
  90.         //A通道电流offset
  91.         regbuf[0] = 0;
  92.         regbuf[1] = 0;
  93.         RN8209D_WriteReg(Reg_IARMSOS,regbuf,2);
  94.         //B通道电流offset
  95.         regbuf[0] = 0;
  96.         regbuf[1] = 0;
  97.         RN8209D_WriteReg(Reg_IBRMSOS,regbuf,2);
  98.         //校表时不要写保护
  99.     }
  100. }
复制代码


7---------------------------------------RN8209 校表步骤------------------------------------------------------------------------
详细流程参考手册


将校表台电压设置220V,5A
(1)电压、电流系数校准
  1. /********************************************************
  2. 功能描述:   计算电压、电流显示转换系数
  3. 参数说明:
  4. 返回说明:
  5. 调用方式:
  6. 全局变量:
  7. 读写时间:
  8. 注意事项:
  9. 日期    :
  10. ********************************************************/
  11. void RN8209D_CalibrateKx(uint8_t phase)
  12. {
  13.     uint8_t regbuf[3];
  14.     //uint32_t tempValue;
  15.     uint32_t regtemp[12],regtotal=0;
  16.     uint8_t i = 0;

  17.     if(phase == phase_A){
  18.         for(i=0;i<12;i++)
  19.         {
  20.             if(RN8209D_ReadReg(Reg_URMS,regbuf,3)==0){
  21.                 regtemp[i] = (regbuf[0]<<16)+(regbuf[1]<<8)+(regbuf[2]);
  22.             }
  23.             delay_ms(350);
  24.         }
  25.         //第一个数据不要
  26.         for(i=1;i<12;i++){
  27.             regtotal += regtemp[i];
  28.         }
  29.         regtotal /= 11;
  30.         StDef_RN8209DPara_Reg.Cst_Ku = regtotal / 220;

  31.         regtotal = 0;

  32.         for(i=0;i<12;i++)
  33.         {
  34.             if(RN8209D_ReadReg(Reg_IARMS,regbuf,3)==0){
  35.                 regtemp[i] = (regbuf[0]<<16)+(regbuf[1]<<8)+(regbuf[2]);
  36.             }
  37.             delay_ms(350);
  38.         }
  39.         //第一个数据不要
  40.         for(i=1;i<12;i++){
  41.             regtotal += regtemp[i];
  42.         }
  43.         regtotal /= 11;
  44.         StDef_RN8209DPara_Reg.Cst_Kia = regtotal / 5;
  45.     }
  46.     else if(phase == phase_B){
  47.         for(i=0;i<12;i++)
  48.         {
  49.             if(RN8209D_ReadReg(Reg_URMS,regbuf,3)==0){
  50.                 regtemp[i] = (regbuf[0]<<16)+(regbuf[1]<<8)+(regbuf[2]);
  51.             }
  52.             delay_ms(350);
  53.         }
  54.         //第一个数据不要
  55.         for(i=1;i<12;i++){
  56.             regtotal += regtemp[i];
  57.         }
  58.         regtotal /= 11;
  59.         StDef_RN8209DPara_Reg.Cst_Ku = regtotal / 220;

  60.         regtotal = 0;

  61.         for(i=0;i<12;i++)
  62.         {
  63.             if(RN8209D_ReadReg(Reg_IBRMS,regbuf,3)==0){
  64.                 regtemp[i] = (regbuf[0]<<16)+(regbuf[1]<<8)+(regbuf[2]);
  65.             }
  66.             delay_ms(350);
  67.         }
  68.         //第一个数据不要
  69.         for(i=1;i<12;i++){
  70.             regtotal += regtemp[i];
  71.         }
  72.         regtotal /= 11;
  73.         StDef_RN8209DPara_Reg.Cst_Kib = regtotal / 5;
  74.     }
  75. }
复制代码


(2)1.0功率校准
  1. /********************************************************
  2. 功能描述:   误差法校准功率增益
  3. 参数说明:
  4. 返回说明:
  5. 调用方式:
  6. 全局变量:
  7. 读写时间:
  8. 注意事项:
  9. 日期    :
  10. ********************************************************/
  11. void RN8209D_CalibrateGPQxErr(uint8_t phase,int16_t err)
  12. {
  13.     const uint16_t regGPx[]={Reg_GPQA,Reg_GPQB};
  14.     const uint16_t regArry[]={Reg_PowerPA,Reg_PowerPB};
  15.     uint8_t regbuf[5];
  16.     float k = 0;
  17.     uint16_t GPQx;
  18.     uint16_t tempValue;

  19.     //判断是否是负数
  20.     if(err & 0x8000){
  21.         err &= 0x7fff;
  22.         err = -err;
  23.     }

  24.     k = (-err/10000.0)/(1+err/10000.0);
  25.     if(k > 0){
  26.         GPQx = (uint16_t)(k*32768);
  27.         //写使能
  28.         regbuf[0] = 0xE5;
  29.         RN8209D_WriteReg(WREN,regbuf,1);
  30.         regbuf[0] = GPQx/256;
  31.         regbuf[1] = GPQx%256;
  32.         RN8209D_WriteReg(regGPx[phase],regbuf,2);
  33.     }
  34.     else{
  35.         GPQx = (uint16_t)(k*32768+65536);
  36.         //写使能
  37.         regbuf[0] = 0xE5;
  38.         RN8209D_WriteReg(WREN,regbuf,1);
  39.         //写寄存器
  40.         regbuf[0] = GPQx/256;
  41.         regbuf[1] = GPQx%256;
  42.         RN8209D_WriteReg(regGPx[phase],regbuf,2);
  43.         m_memset(regbuf,0x00,2);
  44.         RN8209D_ReadReg(regGPx[phase],regbuf,2);
  45.     }
  46.     if(phase == phase_A){
  47.         StDef_RN8209DPara_Reg.Cst_GPQA = GPQx;
  48.         if(RN8209D_ReadReg(regArry[phase],regbuf,2)==0){
  49.             tempValue = regbuf[0]*256+regbuf[1];
  50.             //StDef_RN8209DPara_Reg.Cst_Kpa = tempValue / 1100;
  51.         }
  52.     }
  53.     else if(phase == phase_B){
  54.         StDef_RN8209DPara_Reg.Cst_GPQB = GPQx;
  55.         if(RN8209D_ReadReg(regArry[phase],regbuf,2)==0){
  56.             tempValue = regbuf[0]*256+regbuf[1];
  57.             //StDef_RN8209DPara_Reg.Cst_Kpb = tempValue / 1100;
  58.         }
  59.     }
  60. }
复制代码


(3)0.5L相位校正
将校表台电压设置220V,5A,0.5L
  1. /********************************************************
  2. 功能描述:   误差法校准相位
  3. 参数说明:
  4. 返回说明:
  5. 调用方式:
  6. 全局变量:
  7. 读写时间:
  8. 注意事项:
  9. 日期    :
  10. ********************************************************/
  11. void RN8209D_CalibratePhsXErr(uint8_t phase,int16_t err)
  12. {
  13.     double k = 0;
  14.     uint8_t phsValue = 0;
  15.     const uint16_t regGPx[]={Reg_PhsA,Reg_PhsB};
  16.     uint8_t regbuf[5];

  17.     k = asin(-err/10000.0/1.732)*180/3.142;
  18.     if(k > 0){
  19.         phsValue = (uint8_t)(k/0.02);
  20.     }
  21.     else{
  22.         phsValue = (uint8_t)(k/0.02+512);
  23.     }
  24.     //写使能
  25.     regbuf[0] = 0xE5;
  26.     RN8209D_WriteReg(WREN,regbuf,1);
  27.     //写寄存器
  28.     regbuf[0] = phsValue;
  29.     RN8209D_WriteReg(regGPx[phase],regbuf,1);
  30.     if(phase == phase_A){
  31.         StDef_RN8209DPara_Reg.Cst_PhsA = phsValue;
  32.     }
  33.     else if(phase == phase_B){
  34.         StDef_RN8209DPara_Reg.Cst_PhsB = phsValue;
  35.     }
  36. }
复制代码


(4)5% Ib 功率Offset校正
将校表台电压设置220V,0.25A,1.0
  1. void RN8209D_CalibrateAPOSx(uint8_t phase)
  2. {
  3.     uint8_t regbuf[5];
  4.     uint32_t regtemp[12],regtotal=0;
  5.     const uint16_t regArry[]={Reg_PowerPA,Reg_PowerPB};
  6.     const uint16_t reg_APOSArry[]={Reg_APOSA,Reg_APOSB};
  7.     const uint16_t reg_GPQxArry[]={Reg_GPQA,Reg_GPQB};
  8.     uint8_t i = 0;
  9.     uint16_t temp;
  10.     float gGPQx = 0;
  11.     double k = 0;

  12.     for(i=0;i<12;i++){
  13.         if(RN8209D_ReadReg(regArry[phase],regbuf,4)==0){
  14.             regtemp[i] = (regbuf[0]<<24)+(regbuf[1]<<16)+(regbuf[2]<<8)+(regbuf[3]);
  15.             //求补码
  16.             if(regtemp[i]&0x80000000){
  17.                regtemp[i] = ~regtemp[i];
  18.                regtemp[i] += 1;
  19.             }
  20.         }
  21.         delay_ms(350);
  22.     }
  23.     //第一个数据不要
  24.     for(i=1;i<12;i++){
  25.         regtotal += regtemp[i];
  26.     }
  27.     regtotal /= 11;

  28.     RN8209D_ReadReg(reg_GPQxArry[phase],regbuf,2);
  29.     temp = regbuf[0]*256+regbuf[1];
  30.     if(temp&0x8000)
  31.     {
  32.         gGPQx = (temp-65536)/32768.0;
  33.     }
  34.     else{
  35.         gGPQx = temp/32768.0;
  36.     }

  37.     k = (602299-regtotal)/(1+gGPQx);
  38.     if(k > 0){
  39.         temp = (uint16_t)k;
  40.     }
  41.     else{
  42.         temp = (uint16_t)(k+65536);
  43.     }
  44.     //写使能
  45.     regbuf[0] = 0xE5;
  46.     RN8209D_WriteReg(WREN,regbuf,1);
  47.     //写寄存器
  48.     regbuf[0] = temp/256;regbuf[1] = temp%256;
  49.     RN8209D_WriteReg(reg_APOSArry[phase],regbuf,2);
  50.     if(phase == phase_A){
  51.         StDef_RN8209DPara_Reg.Cst_APOSA = temp;
  52.     }
  53.     else if(phase == phase_B){
  54.         StDef_RN8209DPara_Reg.Cst_APOSB = temp;
  55.     }

  56. }
复制代码


(5)电流Offset校正
将校表台电压设置220V,0A,1.0,只提供电压
  1. /********************************************************
  2. 功能描述:   计算电流通道offset
  3. 参数说明:
  4. 返回说明:
  5. 调用方式:
  6. 全局变量:
  7. 读写时间:
  8. 注意事项:
  9. 日期    :
  10. ********************************************************/
  11. void RN8209D_CalibrateCurrentOffset(uint8_t phase)
  12. {
  13.     uint8_t regbuf[5];
  14.     uint32_t regtemp[12],regtotal=0;
  15.     const uint16_t regArry[]={Reg_IARMS,Reg_IBRMS};
  16.     const uint16_t regIx_OS[]={Reg_IARMSOS,Reg_IBRMSOS};
  17.     uint8_t i = 0;
  18.     uint16_t temp;

  19.     for(i=0;i<12;i++)
  20.     {
  21.         if(RN8209D_ReadReg(regArry[phase],regbuf,3)==0){
  22.             regtemp[i] = (regbuf[0]<<16)+(regbuf[1]<<8)+(regbuf[2]);
  23.         }      
  24.         delay_ms(350);
  25.     }
  26.     //第一个数据不要
  27.     for(i=1;i<12;i++){
  28.         regtotal += regtemp[i];
  29.     }
  30.     regtotal /= 11;
  31.     regtotal = regtotal * regtotal;
  32.     //求反码
  33.     regtotal = ~regtotal;
  34.     temp = (regtotal>>8);
  35.     //符号位
  36.     if(regtotal & 0x80000000)
  37.         temp |= 0x8000;
  38.     //写使能
  39.     regbuf[0] = 0xE5;
  40.     RN8209D_WriteReg(WREN,regbuf,1);
  41.     //写寄存器
  42.     regbuf[0] = temp/256;regbuf[1] = temp%256;
  43.     RN8209D_WriteReg(regIx_OS[phase],regbuf,2);
  44.     if(phase == phase_A){
  45.         StDef_RN8209DPara_Reg.Cst_IARMSOS = temp;
  46.     }
  47.     else if(phase == phase_B){
  48.         StDef_RN8209DPara_Reg.Cst_IBRMSOS = temp;
  49.     }
  50. }
复制代码


8---------------------------------------RN8209计量参数读取------------------------------------------------------------------------
(1)电压
  1. /********************************************************
  2. 功能描述:
  3. 参数说明:
  4. 返回说明: 扩大10倍
  5. 调用方式:
  6. 全局变量:
  7. 读写时间:
  8. 注意事项:
  9. 日期    :
  10. ********************************************************/
  11. uint8_t RN8209D_ReadVoltage(uint16_t *vol)
  12. {
  13.     uint8_t  regbuf[3];
  14.     uint32_t tempValue;

  15.     if(RN8209D_ReadReg(Reg_URMS,regbuf,3)==0){
  16.         tempValue = (regbuf[0]<<16)+(regbuf[1]<<8)+(regbuf[2]);
  17.         if(tempValue & 0x800000){
  18.             tempValue = 0;
  19.         }
  20.         else{
  21.             *vol = (uint16_t)(tempValue*10.0/StDef_RN8209DPara_Reg.Cst_Ku);
  22.         }
  23.         return 0;
  24.     }
  25.    
  26.     return 1;
  27.    
  28. }
复制代码


(2)电流
  1. /********************************************************
  2. 功能描述:
  3. 参数说明:
  4. 返回说明: 扩大1000倍
  5. 调用方式:
  6. 全局变量:
  7. 读写时间:
  8. 注意事项:
  9. 日期    :
  10. ********************************************************/
  11. uint8_t RN8209D_ReadCurrent(uint8_t phase,uint16_t *current)
  12. {
  13.     uint8_t  regbuf[3];
  14.     uint32_t tempValue;

  15.     if(phase == phase_A){
  16.         if(RN8209D_ReadReg(Reg_IARMS,regbuf,3)==0){
  17.             tempValue = (regbuf[0]<<16)+(regbuf[1]<<8)+(regbuf[2]);
  18.             if(tempValue & 0x800000){
  19.                 tempValue = 0;
  20.             }
  21.             else{
  22.                 *current = (uint16_t)(tempValue*1000.0/StDef_RN8209DPara_Reg.Cst_Kia);
  23.             }
  24.             return 0;
  25.         }
  26.     }
  27.     else if(phase == phase_B){
  28.         if(RN8209D_ReadReg(Reg_IBRMS,regbuf,3)==0){
  29.             tempValue = (regbuf[0]<<16)+(regbuf[1]<<8)+(regbuf[2]);
  30.             if(tempValue & 0x800000){
  31.                 tempValue = 0;
  32.             }
  33.             else{
  34.                 *current = (uint16_t)(tempValue*1000.0/StDef_RN8209DPara_Reg.Cst_Kib);
  35.             }
  36.             return 0;
  37.         }
  38.     }
  39.     return 1;
  40. }
复制代码


(3)有功功率
  1. /********************************************************
  2. 功能描述:   读取有功功率
  3. 参数说明:
  4. 返回说明:   扩大1000倍
  5. 调用方式:
  6. 全局变量:
  7. 读写时间:
  8. 注意事项:
  9. 日期    :
  10. ********************************************************/
  11. uint8_t RN8209D_ReadPower(uint8_t phase,uint32_t *p)
  12. {
  13.     uint8_t  regbuf[4];
  14.     uint32_t tempValue;

  15.     if(phase == phase_A){
  16.         if(RN8209D_ReadReg(Reg_PowerPA,regbuf,4)==0){
  17.             tempValue = (regbuf[0]<<24)+(regbuf[1]<<16)+(regbuf[2]<<8)+(regbuf[3]);
  18.             if(tempValue&0x80000000){
  19.               tempValue = ~tempValue;
  20.               tempValue += 1;
  21.             }
  22. //            if(tempValue>=21903393){
  23. //                *p = (uint32_t)(tempValue*0.0000457);
  24. //            }
  25. //            else if(tempValue<21903393 && tempValue>=2190339){
  26. //                *p = (uint32_t)(tempValue*10*0.0000457);
  27. //            }
  28. //            else if(tempValue<2190339 && tempValue>=219033){
  29. //                *p = (uint32_t)(tempValue*100*0.0000457);
  30. //            }
  31. //            else if(tempValue<219033){
  32. //                *p = (uint32_t)(tempValue*1000*0.0000457);
  33. //            }

  34.             *p = (uint32_t)(tempValue*0.000457);
  35.             return 0;
  36.         }
  37.     }
  38.     else if(phase == phase_B){
  39.         if(RN8209D_ReadReg(Reg_PowerPB,regbuf,4)==0){
  40.             tempValue = (regbuf[0]<<24)+(regbuf[1]<<16)+(regbuf[2]<<8)+(regbuf[3]);
  41.             if(tempValue&0x80000000){
  42.               tempValue = ~tempValue;
  43.               tempValue += 1;
  44.             }
  45.             *p = (uint32_t)(tempValue*0.0000457);
  46.             return 0;
  47.         }
  48.     }
  49.     return 1;
  50. }
复制代码


(4)有功电能
  1. /********************************************************
  2. 功能描述:   读取累计电量
  3. 参数说明:
  4. 返回说明:   扩大100倍
  5. 调用方式:
  6. 全局变量:
  7. 读写时间:
  8. 注意事项:
  9. 日期    :
  10. ********************************************************/
  11. uint8_t RN8209D_ReadTotalE(uint8_t phase,uint32_t *p)
  12. {
  13.     uint8_t  regbuf[3];
  14.     uint32_t tempValue;

  15.     if(phase == phase_A){
  16.         if(RN8209D_ReadReg(Reg_EnergyP,regbuf,3)==0){
  17.             tempValue = (regbuf[0]<<16)+(regbuf[1]<<8)+(regbuf[2]);
  18.             //*p = (uint32_t)(tempValue*100.0/1200);
  19.             *p = tempValue;
  20.             return 0;
  21.         }
  22.     }
  23.     else if(phase == phase_B){
  24.         if(RN8209D_ReadReg(Reg_EnergyD,regbuf,3)==0){
  25.             tempValue = (regbuf[0]<<16)+(regbuf[1]<<8)+(regbuf[2]);
  26.             //*p = (uint32_t)(tempValue*100.0/1200);
  27.             *p = tempValue;
  28.             return 0;
  29.         }
  30.     }
  31.     return 1;
  32. }
复制代码


----------------------------------------------------------------



RN8209.C

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2018-10-15 11:31:04 | 显示全部楼层
是不是自己用来做一个功率计绰绰有余啊?

出0入0汤圆

发表于 2018-10-15 11:48:03 | 显示全部楼层
功率因数只能自己计算?

出0入0汤圆

发表于 2018-10-15 11:56:14 | 显示全部楼层
谁知道这货和ATT7053BU 有啥关系,2个芯片有好多相似之处,ATT7053里有些东西说的很明白,8209文档中就没提,搞得我验证了n次,找技术沟通也没解决,昨晚看了7053手册才明白,而且这两货都有阉割的产品,阉割的也一样

出0入0汤圆

 楼主| 发表于 2018-10-15 14:53:55 | 显示全部楼层
PCBBOY1991 发表于 2018-10-15 11:31
是不是自己用来做一个功率计绰绰有余啊?

精度蛮高的,误差在1%

出0入0汤圆

 楼主| 发表于 2018-10-15 14:54:44 | 显示全部楼层
atl0402 发表于 2018-10-15 11:56
谁知道这货和ATT7053BU 有啥关系,2个芯片有好多相似之处,ATT7053里有些东西说的很明白,8209文档中就没提,搞 ...

之前用的ATT7053AU,停产了,感觉还是RN8209好一些,国网一直在用

出0入0汤圆

 楼主| 发表于 2018-10-15 14:55:17 | 显示全部楼层
cqfeiyu 发表于 2018-10-15 11:48
功率因数只能自己计算?

单相计量功率关注比较少

出0入0汤圆

发表于 2018-10-15 14:57:19 | 显示全部楼层
楼主辛苦了mark 电量检测

出5入14汤圆

发表于 2018-10-15 15:03:26 | 显示全部楼层
看到好多单相电表上用,,,

出0入0汤圆

发表于 2018-10-15 15:08:47 | 显示全部楼层
这个可以用在直流上的吧,可以利用内部24位的AD做个直流表头了

出0入0汤圆

 楼主| 发表于 2018-10-15 15:14:01 | 显示全部楼层
chaplin1999 发表于 2018-10-15 15:08
这个可以用在直流上的吧,可以利用内部24位的AD做个直流表头了

直流没用过额,没有相应的设备进行校准

出0入0汤圆

发表于 2018-10-15 15:45:37 | 显示全部楼层

楼主辛苦                        

出0入0汤圆

 楼主| 发表于 2018-10-15 16:26:26 | 显示全部楼层
EMC菜鸟 发表于 2018-10-15 15:03
看到好多单相电表上用,,,

现在有些物联网设备也在搞了

出30入54汤圆

发表于 2018-10-15 18:09:28 | 显示全部楼层
收藏一发以后有用再细细研读

出0入0汤圆

发表于 2018-10-15 19:34:32 来自手机 | 显示全部楼层
资料好详细,mark,谢谢分享!

出0入0汤圆

发表于 2018-10-15 22:59:09 | 显示全部楼层
本帖最后由 atl0402 于 2018-10-16 23:45 编辑

lz不能搞个工程文件方便下载吗,
谢谢

出0入0汤圆

发表于 2018-10-15 23:34:00 | 显示全部楼层
,楼主好人,感谢热心分享,值得借鉴!

出0入0汤圆

发表于 2018-10-18 08:15:36 来自手机 | 显示全部楼层
感谢分享。

出0入18汤圆

发表于 2018-10-18 08:21:36 | 显示全部楼层
用这个芯片很久了,这是我见到最全面的资料,比FAE 提供的好多了!

出0入0汤圆

发表于 2018-10-18 08:27:59 | 显示全部楼层
楼主,你这款芯片和HLW8032 哪个更好?
https://www.amobbs.com/forum.php ... amp;_dsign=a5103b06

出0入0汤圆

发表于 2018-10-18 09:08:29 | 显示全部楼层
谢谢楼主分享,校表台设个什么东西呢?

出0入4汤圆

发表于 2018-10-18 10:06:51 | 显示全部楼层
用过ATT7053BU,不过有些内容规格书说的不明白,还有电话技术支持才能明白。

出0入95汤圆

发表于 2018-10-18 10:38:42 | 显示全部楼层
不错,谢谢分享

出0入0汤圆

发表于 2018-10-18 10:42:25 | 显示全部楼层
写的很详细,谢谢分享

出0入0汤圆

 楼主| 发表于 2018-10-18 10:50:39 | 显示全部楼层
atl0402 发表于 2018-10-15 22:59
lz不能搞个工程文件方便下载吗,
谢谢

你好,工程不太方便,刚提供了RN8209D 程序的C文件

出0入0汤圆

 楼主| 发表于 2018-10-18 10:52:54 | 显示全部楼层
梨花 发表于 2018-10-18 09:08
谢谢楼主分享,校表台设个什么东西呢?

校表台能提供精度比较准备的电压、电流、相位的仪器;比如220V 5A 1.0,主要就是校准时需要输入源的参数,才能进行误差修正

出0入0汤圆

 楼主| 发表于 2018-10-18 11:03:55 | 显示全部楼层
光明星1号 发表于 2018-10-18 08:27
楼主,你这款芯片和HLW8032 哪个更好?
https://www.amobbs.com/forum.php?mod=viewthread&tid=5680149&hig ...

HLW8032相对于RN8209来说是应该是为了方便应用做了简化;RN8209通过校准精度可以做的相对较高(提供100Ib,5%Ib校准点),相位也可以进行校准;

出0入0汤圆

发表于 2018-10-18 11:16:22 | 显示全部楼层
非常好的东西,做的很详细的呢

出0入0汤圆

发表于 2018-10-18 11:20:44 | 显示全部楼层
数据更新率多少?

出0入0汤圆

 楼主| 发表于 2018-10-18 12:45:02 | 显示全部楼层
wzavr 发表于 2018-10-18 11:20
数据更新率多少?

默认是350ms可以更快,手册里有的

出0入0汤圆

发表于 2018-10-18 13:02:27 来自手机 | 显示全部楼层
这个电表做好后,是如何标定的?需要什么设备?

出0入0汤圆

发表于 2018-10-18 20:22:23 | 显示全部楼层
Baldwin 发表于 2018-10-18 11:03
HLW8032相对于RN8209来说是应该是为了方便应用做了简化;RN8209通过校准精度可以做的相对较高(提供100Ib ...

这个精度高是源于芯片内部的AD精度高吗?

出0入0汤圆

发表于 2018-10-18 21:38:48 | 显示全部楼层
校表的话需要校准台,校准一个电表都不用五分钟。RN8209C玩过吗?这个芯片管脚少很多。

出0入0汤圆

 楼主| 发表于 2018-10-19 15:03:50 | 显示全部楼层
留声而过 发表于 2018-10-18 21:38
校表的话需要校准台,校准一个电表都不用五分钟。RN8209C玩过吗?这个芯片管脚少很多。 ...

2个功能是一样的,只是RN8209C只支持uart通信,RN8209D支持spi和uart通信

出0入0汤圆

 楼主| 发表于 2018-10-19 15:04:39 | 显示全部楼层
光明星1号 发表于 2018-10-18 20:22
这个精度高是源于芯片内部的AD精度高吗?

一个是内部精度,另外它支持多种校准手段,可以把精度提高

出0入0汤圆

 楼主| 发表于 2018-10-19 15:04:58 | 显示全部楼层
jiaoyi 发表于 2018-10-18 13:02
这个电表做好后,是如何标定的?需要什么设备?

需要校表台就可以

出0入0汤圆

发表于 2018-10-19 15:55:45 来自手机 | 显示全部楼层
楼主分享的好

出0入0汤圆

发表于 2018-10-19 16:25:28 | 显示全部楼层
感谢楼主,单芯片计量,有些项目还是很有用的

出0入0汤圆

发表于 2018-10-19 16:39:19 | 显示全部楼层
单芯片计量对很多项目还是很有用处的,感谢分享

出0入0汤圆

发表于 2018-10-20 08:33:27 | 显示全部楼层
校表的话需要校准台,请兄台推荐个校表台,有型号和厂家最好,谢谢

出0入0汤圆

发表于 2018-10-20 12:34:50 | 显示全部楼层
谢谢分享。

出0入0汤圆

 楼主| 发表于 2018-10-22 13:10:42 | 显示全部楼层
jiaoyi 发表于 2018-10-20 08:33
校表的话需要校准台,请兄台推荐个校表台,有型号和厂家最好,谢谢

我们公司用的南自的

出0入0汤圆

发表于 2018-10-31 18:12:10 | 显示全部楼层
本帖最后由 guanxiaomin 于 2018-10-31 18:18 编辑
Baldwin 发表于 2018-10-22 13:10
我们公司用的南自的


您好,我参照您的程序,测出的波形对应RN8209的读写波形,但是就是没有数据反馈,MISO的数据一直是高。换了2,3块板试了都是一样,请教大神指点一二。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2018-11-1 08:27:41 | 显示全部楼层
guanxiaomin 发表于 2018-10-31 18:12
您好,我参照您的程序,测出的波形对应RN8209的读写波形,但是就是没有数据反馈,MISO的数据一直是高。换 ...

sclk频率是多少

出0入0汤圆

 楼主| 发表于 2018-11-1 08:28:41 | 显示全部楼层
guanxiaomin 发表于 2018-10-31 18:12
您好,我参照您的程序,测出的波形对应RN8209的读写波形,但是就是没有数据反馈,MISO的数据一直是高。换 ...

再测试一下REFV脚电压多少

出0入4汤圆

发表于 2018-11-17 17:17:41 | 显示全部楼层
最近正在用RN8209C,感谢楼主的资料和例程!

出0入0汤圆

发表于 2018-11-18 18:47:46 | 显示全部楼层
校表台 用的什么型号的  做类似的项目 想买一台 多谢!

出0入0汤圆

 楼主| 发表于 2018-11-20 08:40:03 | 显示全部楼层
Halley 发表于 2018-11-18 18:47
校表台 用的什么型号的  做类似的项目 想买一台 多谢!

用的南自,你也可以用新开普的;最好是借用现成的,买一台价格比较高啊

出0入0汤圆

发表于 2018-11-20 10:03:34 | 显示全部楼层
监控, 做节能功能设备,似乎用得上

出5入14汤圆

发表于 2018-12-14 10:10:30 | 显示全部楼层
请教楼主一个问题,Kp(有功系数)我翻遍了厂家提供的数据手册,都没找到,应用笔记里是有提到,但从哪里得到的呢?

出0入0汤圆

发表于 2019-3-31 22:27:30 | 显示全部楼层
请教下楼主,对于掉电的情况,怎么做到及时保存电量呢?是加掉电检测好呢?还是固定时间存储一次电量好呢?

出0入0汤圆

 楼主| 发表于 2019-4-1 10:14:28 | 显示全部楼层
EMC菜鸟 发表于 2018-12-14 10:10
请教楼主一个问题,Kp(有功系数)我翻遍了厂家提供的数据手册,都没找到,应用笔记里是有提到,但从哪里得 ...

锐能微第三代单相计量芯片应用笔记v1.3 第19页有讲的

出0入0汤圆

 楼主| 发表于 2019-4-1 10:19:30 | 显示全部楼层
梨花 发表于 2019-3-31 22:27
请教下楼主,对于掉电的情况,怎么做到及时保存电量呢?是加掉电检测好呢?还是固定时间存储一次电量好呢? ...

有2种方式:
1、采用掉电存储,这种方式最可靠,平常只需要按照固定电量来存储,比如增加1度电就存储一次;等到掉电时再存储一次;
2、采用固定电量存储,存储就需要采用铁电储存器,这样可以做到0.01度电就存储一次;但是会存在电量计不满0.01度电时因为掉电导致数据丢失的情况;

另外,按照固定时间存储不可取,因为有的时间用电多,有的时间用电少;

我们是按照0.01度电储存一次+掉电储存来做的

出0入0汤圆

发表于 2019-4-1 14:16:05 | 显示全部楼层
Baldwin 发表于 2019-4-1 10:19
有2种方式:
1、采用掉电存储,这种方式最可靠,平常只需要按照固定电量来存储,比如增加1度电就存储一次 ...

好的,谢谢哈

出0入0汤圆

发表于 2019-4-12 14:44:03 | 显示全部楼层
能不能讲一下功率法校表?

出0入0汤圆

发表于 2019-4-17 09:22:37 | 显示全部楼层
电能计量IC  很有用  MARK

出0入0汤圆

发表于 2019-4-18 15:40:09 | 显示全部楼层
标记,收藏下,学习学习。

出0入0汤圆

 楼主| 发表于 2019-4-21 10:19:03 | 显示全部楼层
ztlchina 发表于 2019-4-12 14:44
能不能讲一下功率法校表?

功率校表法对稳压源的精度要求比较高,什么场合需要用到功率校表法

出0入8汤圆

发表于 2019-4-21 14:45:03 | 显示全部楼层
楼主有RN8209模块卖吗?

出0入0汤圆

 楼主| 发表于 2019-4-22 11:54:32 | 显示全部楼层
skype 发表于 2019-4-21 14:45
楼主有RN8209模块卖吗?

你需要什么样的,隔离还是非隔离的?是否带互感器?

出0入8汤圆

发表于 2019-4-22 13:58:47 | 显示全部楼层
不好意思,要的急,在淘宝在拍了。

出0入0汤圆

发表于 2019-5-21 16:33:54 | 显示全部楼层
楼主、公司不打算买校表台、如果买一个三相或单相标准源是否可以完成校表

出0入0汤圆

发表于 2019-5-22 09:13:36 | 显示全部楼层
你的校表台是什么型号的,我也想入手一台。

出0入0汤圆

发表于 2019-5-22 09:18:27 | 显示全部楼层
atl0402 发表于 2018-10-15 11:56
谁知道这货和ATT7053BU 有啥关系,2个芯片有好多相似之处,ATT7053里有些东西说的很明白,8209文档中就没提,搞 ...

如果没记错的话,钜泉光电和锐能微最早应该是一家公司,一个在上海,一个在深圳。现在锐能微的市场份额可能更大些,主要用在入户的电表里的,量也不小。

出0入0汤圆

 楼主| 发表于 2019-5-23 15:54:28 | 显示全部楼层
whitekang82 发表于 2019-5-21 16:33
楼主、公司不打算买校表台、如果买一个三相或单相标准源是否可以完成校表 ...

可以校表,但是不能复校

出0入0汤圆

发表于 2019-5-30 19:26:40 | 显示全部楼层
Baldwin 发表于 2019-5-23 15:54
可以校表,但是不能复校

楼主啊,你好,我现在也要用到电量计量芯片,就是这个校准,我不知道怎么整
,我这只有一个继电保护仪,能产生三相100v的电压,三相的电流,你说的那个交表的台,是不是通过芯片输出的脉冲,直接就可以接上这个仪器, 然后通过根据误差调整软件的寄存器的值,也就是说,校准一个电表是不是都得需要两次填入寄存器的值,第一次是大概的值,第二次是根据仪器的误差值,然后计算出来寄存器的值,然后根据这个计算值,填入校表寄存器,还有一个问题就是我现在只有标准源,不用脉冲 ,不用交表台,这个误差怎么样,你觉得

出0入0汤圆

发表于 2019-5-30 19:28:03 | 显示全部楼层
liangshanguang 发表于 2019-5-30 19:26
楼主啊,你好,我现在也要用到电量计量芯片,就是这个校准,我不知道怎么整
,我这只有一个继电保护仪, ...

还有你说的复校,是不是指的是重复校准,能再说的具体点吗,拜托了

出0入0汤圆

发表于 2019-6-13 09:43:18 | 显示全部楼层
Baldwin 发表于 2019-5-23 15:54
可以校表,但是不能复校

楼主是不是没有进行无功校正啊,我看手册有无功校正,没有无功校正是怎么考虑的

出0入0汤圆

 楼主| 发表于 2019-6-13 14:35:38 | 显示全部楼层
liangshanguang 发表于 2019-5-30 19:28
还有你说的复校,是不是指的是重复校准,能再说的具体点吗,拜托了  ...

复校不是重复校表,而是验证初校是否正确

出0入0汤圆

 楼主| 发表于 2019-6-13 14:36:07 | 显示全部楼层
liangshanguang 发表于 2019-6-13 09:43
楼主是不是没有进行无功校正啊,我看手册有无功校正,没有无功校正是怎么考虑的
...

单相一般对无功不太关注,所以没有进行无功校准

出0入0汤圆

发表于 2019-6-14 16:22:29 | 显示全部楼层
Baldwin 发表于 2019-6-13 14:36
单相一般对无功不太关注,所以没有进行无功校准

感谢回答, 楼主还有一个问题,就是StDef_RN8209DPara_Reg 这个结构体是用来,写到eeprom里面的 吗,为什么要把数据都写到eeprom里面啊,这个交表的数值不是已经定下来,直接用寄存器写函数,写到芯片里面吗,还需要从eeprom里面读取,然后执行一次交表程序吗, 校准表的程序,是不是只执行一次,然后之后,只有初始化程序了, 谢谢楼主

出0入0汤圆

 楼主| 发表于 2019-6-14 16:33:29 | 显示全部楼层
liangshanguang 发表于 2019-6-14 16:22
感谢回答, 楼主还有一个问题,就是StDef_RN8209DPara_Reg 这个结构体是用来,写到eeprom里面的 吗,为什 ...

每块计量芯片的校表参数都不一样,没法用程序写死的

出0入0汤圆

发表于 2019-6-14 17:18:33 | 显示全部楼层
Baldwin 发表于 2019-6-14 16:33
每块计量芯片的校表参数都不一样,没法用程序写死的

那你现在的做法,是每一次上电,都初始化,就是把校准的寄存器都清0 ,然后执行校准程序 ,写入校准寄存器值 ,这这样吗,

出0入0汤圆

发表于 2019-6-15 08:53:06 | 显示全部楼层
liangshanguang 发表于 2019-6-14 17:18
那你现在的做法,是每一次上电,都初始化,就是把校准的寄存器都清0 ,然后执行校准程序 ,写入校准寄存 ...

懂了,谢了,交表需要eeprom 因为交表的参数是由程序完成的,程序在有外部标准信号输入的的情况下,计算出来的,不是自己用计算器计算的,如果不保存交表数据的话,那么需要每一次都要输入标准信号,所以这个交表程序应该有一个触发信号,我又找了个工程文件,给有需要的人

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2019-8-26 20:27:19 | 显示全部楼层
mark一记 学习一下

出0入53汤圆

发表于 2019-8-27 14:19:25 | 显示全部楼层
电表的供电是不是采用隔离电源?有采用非隔离电源的 吗?

出0入0汤圆

 楼主| 发表于 2019-8-27 16:23:25 | 显示全部楼层
zhcj66 发表于 2019-8-27 14:19
电表的供电是不是采用隔离电源?有采用非隔离电源的 吗?

如果把采样隔离就可以不用隔离电源了,用电压互感器,电流互感器

出0入53汤圆

发表于 2019-8-27 16:36:19 | 显示全部楼层
Baldwin 发表于 2019-8-27 16:23
如果把采样隔离就可以不用隔离电源了,用电压互感器,电流互感器

我问的是电表 的mcu部分供电是隔离的还是非隔离的?

出0入0汤圆

 楼主| 发表于 2019-8-27 21:59:40 | 显示全部楼层
zhcj66 发表于 2019-8-27 16:36
我问的是电表 的mcu部分供电是隔离的还是非隔离的?

mcu非隔离,485通信隔离的

出0入53汤圆

发表于 2019-8-28 07:58:37 | 显示全部楼层
Baldwin 发表于 2019-8-27 21:59
mcu非隔离,485通信隔离的

使用的什么电源芯片?

出1310入193汤圆

发表于 2019-8-28 08:13:25 | 显示全部楼层
单相计量计量仪表  标定困难  公司要需要一名培训合格的计量工作证的人员

出0入0汤圆

发表于 2019-8-28 08:22:12 | 显示全部楼层
电量计量芯片

出0入0汤圆

 楼主| 发表于 2019-8-28 09:18:13 | 显示全部楼层
lb0857 发表于 2019-8-28 08:13
单相计量计量仪表  标定困难  公司要需要一名培训合格的计量工作证的人员

没有这么严格的,但是要有校表台,现在都是软件自动的,不需要生产人员懂校表原理的

出0入0汤圆

发表于 2019-11-7 11:52:05 | 显示全部楼层
楼主你好,我想问一下p启动是怎么来的啊,计算功率的时候为什么要乘以0.0000457?

出0入0汤圆

 楼主| 发表于 2019-11-7 19:30:05 | 显示全部楼层
liupeng08305 发表于 2019-11-7 11:52
楼主你好,我想问一下p启动是怎么来的啊,计算功率的时候为什么要乘以0.0000457? ...

你好,在应用手册里有讲的哦

出0入0汤圆

 楼主| 发表于 2019-11-7 19:30:30 | 显示全部楼层
liupeng08305 发表于 2019-11-7 11:52
楼主你好,我想问一下p启动是怎么来的啊,计算功率的时候为什么要乘以0.0000457? ...

PStart是20%P1.0

出0入0汤圆

发表于 2019-11-7 20:32:14 | 显示全部楼层

好的,谢谢,我看看应用手册!!

出0入0汤圆

发表于 2019-11-7 21:51:44 | 显示全部楼层
单相电量计

出0入0汤圆

发表于 2019-11-7 21:57:41 | 显示全部楼层
电流互感器5A意思是只能测最大5A电流吗

出0入0汤圆

 楼主| 发表于 2019-11-8 21:37:18 | 显示全部楼层
picobox 发表于 2019-11-7 21:57
电流互感器5A意思是只能测最大5A电流吗

不是的,一般互感器是5(60),60A是测量最大值(保证精度范围),超过60A其实也能测,只是性能会所偏差

出0入8汤圆

发表于 2019-11-19 22:45:52 来自手机 | 显示全部楼层
斩波调压后的非标准正弦波的交流电用这个芯片能测量出电流和电压的有效值吗?

出0入0汤圆

发表于 2020-2-14 11:51:46 | 显示全部楼层
怎么两个PDF我都下载不了呢?

出0入0汤圆

发表于 2020-2-14 11:56:53 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2020-2-14 15:22:51 | 显示全部楼层
不错的方案,mark

出0入0汤圆

发表于 2020-4-2 23:25:54 | 显示全部楼层
最近要用到这款芯片,非常好的资料

出0入59汤圆

发表于 2020-4-3 00:17:33 | 显示全部楼层
这电量统计芯片还支持串口通讯。方便

出0入0汤圆

发表于 2020-4-3 06:48:06 来自手机 | 显示全部楼层
电能计量芯片 Mark

出0入0汤圆

发表于 2020-4-3 09:14:47 | 显示全部楼层

电能计量芯片 Mark

出0入0汤圆

发表于 2020-4-3 18:29:36 | 显示全部楼层
电能计量芯片 Mark

出0入0汤圆

发表于 2020-4-7 17:48:41 | 显示全部楼层
好贴顶起
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 11:00

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表