找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5416|回复: 4
收起左侧

RN8302B三相电能表资料与C语言MCU程序

[复制链接]
ID:832889 发表于 2021-3-24 21:58 | 显示全部楼层 |阅读模式
51hei.png 51hei.png

用C对RN8302B进行数据读写

  1. typedef unsigned char                  u8;
  2. typedef signed char                  s8;
  3. typedef unsigned short          u16;
  4. typedef signed short                  s16;
  5. typedef unsigned long int          u32;
  6. typedef signed long int          s32;
  7. typedef unsigned short      WORD;
  8. typedef        unsigned char        BOOL;

  9. #define PinWrite_ADSCLK(x)          ( (x) ? (P0_bit.no6 = 1 , PM0_bit.no6 = 1) : (PM0_bit.no6 = 0 , P0_bit.no6 = 0) )        //
  10. #define PinMode_ADSCLK(x)                ( (x == GPIO_MODE_OUT) ? (PM0_bit.no6 = 0) : (PM0_bit.no6 = 1) )


  11. #define PinRead_ADSDI()                        (P4_bit.no4)
  12. #define PinWrite_ADSDO(x)                  ( (x) ? (P6_bit.no0 = 1 , PM6_bit.no0 = 1) : (PM6_bit.no0 = 0 , P6_bit.no0 = 0) )        //        



  13. #define PinWrite_ADCS(x)          ( (x) ? (P6_bit.no1 = 1 , PM6_bit.no1 = 1) : (PM6_bit.no1 = 0 , P6_bit.no1 = 0  ) )
  14. #define PinWrite_ADRST(x)          ( (x) ? (P0_bit.no5 = 1 , PM0_bit.no5 = 1) : (PM0_bit.no5 = 0 , P0_bit.no5 = 0  ) )

  15. typedef enum {ERROR = 0 , SUCCESS = !ERROR} ErrorStatus;

  16. typedef struct {
  17. //        u32 Dat : 23;
  18. //        u32 S : 1;
  19.         u8 Dat0;
  20.         u8 Dat1;
  21.         u8 Dat2 : 7;
  22.         u8 S : 1;                        
  23. } sDF09;
  24. typedef struct {
  25.         u32 Dat;
  26. } sDF11;
  27. typedef        sDF11 sFsEgSh_TypeDef;        


  28. #pragma vector = INTTM01_vect
  29. __interrupt void MD_INTTM01(void)
  30. {
  31.         TMIF01 = 0;                /* INTTM01 interrupt flag clear */
  32.         SysStamp ++ ;
  33. }

  34. u16 fnStamp_Through(u16 Ago)
  35. {
  36.         extern u16        SysStamp;
  37.         if (SysStamp >= Ago)
  38.                 {return (SysStamp - Ago);}
  39.         else
  40.                 {return ( (0xffff - Ago) + SysStamp);}
  41. }

  42. u16 fnHexToBcd_u16(u16 Dat)
  43. {
  44.         u16 Result = 0;

  45.         Dat = Dat % 10000;
  46.         Result += (Dat / 1000) * 0x1000;
  47.         Dat = Dat % 1000;        
  48.         Result += (Dat / 100) * 0x100;
  49.         Dat = Dat % 100;        
  50.         Result += (Dat / 10) * 0x10;
  51.         Dat = Dat % 10;        
  52.         Result += Dat;
  53.                
  54.         return(Result);        
  55. }
  56. u32        fnHexToBcd_u32(u32 Dat)
  57. {        
  58.         u32 result = 0;
  59.         
  60.         Dat = Dat % 100000000;
  61.         result += (Dat / 10000000) * 0x10000000;
  62.         Dat = Dat % 10000000;        
  63.         result += (Dat / 1000000) * 0x1000000;
  64.         Dat = Dat % 1000000;
  65.         result += (Dat / 100000) * 0x100000;
  66.         Dat = Dat % 100000;
  67.         result += (Dat / 10000) * 0x10000;
  68.         Dat = Dat % 10000;        
  69.         result += (Dat / 1000) * 0x1000;
  70.         Dat = Dat % 1000;
  71.         result += (Dat / 100) * 0x100;
  72.         Dat = Dat % 100;
  73.         result += (Dat / 10) * 0x10;
  74.         Dat = Dat % 10;        
  75.         result += Dat;
  76.         
  77.         return(result);
  78. }

  79. u16 fnDFConver_Bcd16To16(s16 Dat)
  80. {
  81.         u16 Result;
  82.         Result = abs(Dat) % 8000;                        
  83.         Result = fnHexToBcd_u16(Result);
  84.         if(Dat < 0 ) Result |= 0x8000;
  85.         else Result &= 0x7fff;        
  86.         return(Result);
  87. }
  88. u32 fnDFConver_Bcd32To32(s32 Dat)
  89. {
  90.         u32 Result;
  91.         Result = labs(Dat) % 80000000;                        
  92.         Result = fnHexToBcd_u32(Result);
  93.         if(Dat < 0 ) Result |= 0x80000000;
  94.         else Result &= 0x7fffffff;        
  95.         return(Result);
  96. }

  97. sDF09 fnDFConver_Hex32ToDF09(s32 Dat)
  98. {        
  99.         sDF09        Result;        
  100.         memset(&Result , 0 , sizeof(sDF09) );
  101.         if(Dat < 0) Result.S = 1;
  102.         else Result.S = 0;        
  103.         
  104.         Dat = labs(Dat) % 800000;
  105.         Dat = fnHexToBcd_u32(Dat);
  106.         
  107.         Result.Dat0 = Dat;
  108.         Result.Dat1 = Dat >> 8;
  109.         Result.Dat2 = Dat >> 16;
  110.         return(Result);        
  111. }

  112. typedef union                                         //公共数据运算区8字节
  113. {
  114.         u8  ucTempBuf[8];
  115.         u32 lTemp32;
  116.         u16 wTemp16;
  117.         u8  ucTemp8;
  118. }sDl645StruDataComm_TypeDef;

  119. __no_init  sDl645StruDataComm_TypeDef      Dl645RN8302DataComm;
  120. __no_init        sDl645FrontTmp_TypeDef                Dl645FrontTmp;
  121. __no_init        sDl645Front_TypeDef                        Dl645Front;
  122. __no_init         sDl645Eg_TypeDef                         Dl645Eg;
  123. __no_init   sDl645FirmParaFile_TypeDef          Dl645FirmPara;

  124. typedef struct
  125. {
  126.     u8                ChkErrCnt;       //读错误计数1
  127.    
  128.     s32         Pw[12];                   //{Pa Pb Pc P Qa Qb Qc Q Sa Sb Sc S}   48
  129.     s32         UI[7];               //Ua Ub Uc Ia Ib Ic Inal   28
  130.     s32                VectorU[9];                // 正序、负序、零序电压
  131.     s32                VectorI[9];                // 正序、负序、零序电流
  132.     s32          Pf[4];               //Pf Pfa Pfb Pfc      16     
  133.     u32         Frequency;           //电网频率,单位:        4  
  134.     s32          YUI[3],YUU[2];  //20
  135.                                        
  136.     s32                Pulse[15];                //前台高频脉冲48
  137.     //---电能脉冲---        
  138.     s32                Pulse_EgTmp[20];        //高频脉冲{P,Q,Ps},{Pa,Qa,Psa},{Pb,Qb,Psb},{Pc,Qc,Psc}{Fp,Fq}{Fpa,Fqa}{Fpb,Fqb}{Fpc,Fqc}
  139.     u32                Pulse_Eg[20];  //低频脉冲数
  140.         //---需量脉冲---
  141.         s32                Pulse_NeedTmp[12];        
  142.           u16                Pulse_Need[12]; //{PNeed,QNeed,PsNeed},{PNeeda,QNeeda,PsNeeda},{PNeedb,QNeedb,PsNeedb},{PNeedc,QNeedc,PsNeedc}48
  143.    

  144.     u16                Angle[9];
  145.     u16         PDirect;   //4
  146.     u32         ChkSum1;   //4
  147.     u32         ChkSum2;   //4
  148.         
  149.         u16                Temperature;        //温度4
  150.         u32                ClockBat;                //时钟电池4
  151.         u32                BackupBat;                //后备电池4
  152.         
  153.     u16   CF1DelayStamp;
  154.     u16   CF2DelayStamp;
  155.    
  156.     u16   CfIn_P;
  157.     u16   CfIn_q;
  158.    
  159.     u16   CfTime_P;
  160.     u16   CfTime_q;
  161.         
  162. } sDl645FrontTmp_TypeDef;

  163. typedef struct
  164. {        
  165.         struct sFrontPubData_TypeDef  {
  166.                 u16                U[3];                        //---电压---NNN.N6
  167.                 u16                VectorU[9];                // 正序电压 0--2  负序电压 3---5  零序电压 6---8
  168.                 u32                I[4];                        //---电流NNNN.NNNN(电流值要求3整3小,整定值要求2整4小,最高位表示方向)---16               
  169.                 u32                VectorI[9];                // 正序电流 0--2  负序电流 3---5  零序电流 6---8
  170.                 sDF09        Pw[12];                        //---瞬时有功/无功/视在功率NN.NNNN---{P Pa Pb Pc Q Qa Qb Qc S Sa Sb Sc}36
  171.                 u16          Pf[4];                        //---功率因数N.NNN---        最高位表示方向{Pf Pfa Pfb Pfc}        8  sDF05
  172.                 u16                Angle[9];                //---相角NNN.N---                18
  173.                                                                 //PhUb,PhUc, 以A相电压为基准,B、C相角度                                //(hyg) BCD码
  174.                                                         //PhIa,PhIb,PhIc,A相电流与A相电压间角度、B相电流与B相电压间角度、C相电流与C相电压间角度
  175.                                                         //Angle A,Angle B,Angle C, A相电流与A相电压间角度、B相电流与A相电压间角度、C相电流与A相电压间角度
  176.                                                         //Angle C-Angle A
  177.                 u32                UnblU;                        //电压不平衡度NNNN.NN%4
  178.                 u32                UnblI;                        //电流不平衡度NNNN.NN%4
  179.                
  180.                 u16                FuzzyU[3];                //---电压波形失真度NN.NN%---        6        
  181.                 u16                FuzzyI[3];                //---电流波形失真度NN.NN%---        6        
  182.                 u16                WaveU[3][21];        //---相电压谐波含量NN.NN%---        126        
  183.                 u16                WaveI[3][21];        //---相电流谐波含量NN.NN%---    126
  184.                 //---其他---
  185.                 u16                Frequency;                //NN.NN 2
  186.                 u32                PPwave;                        //NN.NNNN 4
  187.                
  188.                 u16                Temperature;        //NNN.N 2
  189.                 u16                ClockBat;                //NN.NN 2
  190.                 u16                BackupBat;                //NN.NN 2
  191.                 u8                PDirect;                //原功率方向,用于需量处理(0总/1A/2B/3C , 注意与FrontTmp不同) 1
  192.         } PubData;
  193.         
  194.         struct sFrontPriData_TypeDef  {               
  195.                 u8                Flag;                        //---工作异常标志---1
  196.                 u8      PhaseCalStep;
  197.                 u16     FrontStamp;
  198. //                u8      BatCalStep;
  199.                 u16     BatStamp;
  200. //                u16     BatDetStamp;
  201.         } PriData;        
  202.         
  203.         struct sFrontPriPara_TypeDef  {               
  204.                 u32         PConstE;                        //有功常数
  205.                 u32         QConstE;                        //无功常数(Hex码)4
  206.                 u16         Crc;//2
  207.         } PriPara;               
  208. } sDl645Front_TypeDef;        //缓冲区转换后的有效数据

  209. typedef struct
  210. {               
  211.         u8 FractionI;/*电流小数位数*/
  212.         u8 FractionU;/*电压小数位数*/
  213.         u8 FractionE;/*电能小数位数*/
  214.         u8 FractionP;/*功率需量小数位数*/
  215.         u16 ConstE;/*电表有功常数*/
  216.         u16 Pulse_deltaE;/*数*/
  217.         u8  HighPulseRate;
  218.         u8 PhaseCalStep;
  219.         u32 IRmsConst;                        //10
  220.         u16        Reserve[2];
  221.         u16        NOLOAD;
  222.         u16        ZEROSTAR;                                        //20
  223.         u32 ChkSum1;
  224.         u16 HFConst1;
  225.         u16 HFConst2;
  226.         u32 VRmsConst;                        //30
  227.         u16        Reserve1;
  228.         u32 PRmsConst;
  229.         u16        Reserve2;
  230.         u16        VGain[3];                                // 42
  231.         u16        IGain[4];                                //48
  232.         u8        PHSU[2];                                // 56
  233.         u32        PHSI[3];
  234.         u16        PRth[4];                                //70
  235.         u16        UI_Offset[7];
  236.         u16        P_PHS[3];/*有功相位校正寄存器*/                                // 92
  237.         u16        PGain[3];/*有功增益校正寄存器*/                                
  238. }sDl645FirmParaFile_TypeDef;

  239. typedef struct {
  240. #pragma pack(1)
  241.         struct sDl645EgPubData_TypeDef
  242.         {
  243.                 sFsEgSh_TypeDef AllPEgSh[DL645_MAX_FL + 1];               
  244.                 sFsEgSh_TypeDef PtPEgSh[DL645_MAX_FL + 1];      
  245.                 sFsEgSh_TypeDef NtPEgSh[DL645_MAX_FL + 1];      
  246.                
  247.                 sFsEgSh_TypeDef AllQEgSh[DL645_MAX_FL + 1];     
  248.                 sFsEgSh_TypeDef PtQEgSh[DL645_MAX_FL + 1];      
  249.                 sFsEgSh_TypeDef NtQEgSh[DL645_MAX_FL + 1];      
  250.                
  251.                 sFsEgSh_TypeDef Qd1QEgSh[DL645_MAX_FL + 1];               
  252.                 sFsEgSh_TypeDef Qd2QEgSh[DL645_MAX_FL + 1];               
  253.                 sFsEgSh_TypeDef Qd3QEgSh[DL645_MAX_FL + 1];               
  254.                 sFsEgSh_TypeDef Qd4QEgSh[DL645_MAX_FL + 1];               
  255.                
  256.                 sFsEgSh_TypeDef PtPsEgSh[DL645_MAX_FL + 1];               
  257.                 sFsEgSh_TypeDef NtPsEgSh[DL645_MAX_FL + 1];               
  258.                
  259.                 sFsEgSh_TypeDef AssEgSh;                                                
  260.                 sFsEgSh_TypeDef BasePtPEgSh;                                       
  261.                 sFsEgSh_TypeDef BaseNtPEgSh;                                       
  262.                 sFsEgSh_TypeDef WavePtPEgSh;                                       
  263.                 sFsEgSh_TypeDef WaveNtPEgSh;                                       
  264.                 sFsEgSh_TypeDef CopPEgSh;                                                
  265.                 sFsEgSh_TypeDef IronPEgSh;                                                        
  266. //-------------        
  267. ……………………

  268. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码


msp430单片机源程序如下:
  1. #include<msp430x44x.h>
  2. #include"config.h"
  3. #include"bu9792.h"
  4. void I2C_Delay()
  5. {
  6.         uchar i,j;
  7.         for(i=1;i>0;i--)
  8.                 for(j=10;j>0;j--);                           
  9. }   

  10. void Delay_100us()
  11. {
  12.         uchar i,j;
  13.         for(i=100;i>0;i--)
  14.                 for(j=10;j>0;j--);                           
  15. }   

  16. void I2C_Start()
  17. {
  18.     I2C_INIT;
  19.         SDA_H;
  20.         SCL_H;
  21.         I2C_Delay();
  22.         SDA_L;        
  23.         I2C_Delay();
  24.         SCL_L;

  25. }

  26. void I2C_Stop()
  27. {
  28.         I2C_INIT;
  29.         SCL_L;
  30.         SDA_L;
  31.         I2C_Delay();
  32.         SCL_H;
  33.         I2C_Delay();
  34.         SDA_H;
  35.         I2C_Delay();        
  36. }

  37. uchar I2C_SendByte(uchar sendbyte)     //发送一个字节
  38. {
  39.         uchar i;
  40.         for(i=0;i<8;i++)        
  41.         {
  42.                 SCL_L;
  43.                 I2C_Delay();
  44.             if(sendbyte&0x80)
  45.                         SDA_H;
  46.             else
  47.                 SDA_L;
  48.         sendbyte <<= 1;
  49.                 SCL_H;
  50.                 I2C_Delay();                                                                  
  51.         }
  52.         
  53.         SCL_L;                //第九个时钟周期,检测从机接收是否正常
  54.         SDA_H;                     
  55.         I2C_Delay();
  56.         SCL_H;
  57.         I2C_Delay();
  58.         SCL_L;
  59.     if(ReadSDA)
  60.                 return fault;                //为真时,从机接收错误
  61.     else
  62.                 return ture;
  63.         
  64. }

  65. //接收一个字节
  66. uchar I2C_ReceiveByte(void)
  67. {
  68.         uchar i,receivebyte=0;
  69.         
  70.         SCL_L;
  71.         SDA_H;
  72.         for(i=0;i<8;i++)
  73.         {
  74.                  receivebyte <<= 1;
  75.                 SCL_L;
  76.                 I2C_Delay();        
  77.             SCL_H;
  78.                 I2C_Delay();        
  79.                 if(ReadSDA)
  80.                 receivebyte |= 0x01;
  81.         }
  82.         SCL_L;               
  83.     return receivebyte;
  84.      
  85. }

  86.                                     
  87. //主机应答
  88. void ACK()
  89. {
  90.         SCL_L;
  91.         SDA_L;
  92.         I2C_Delay();
  93.         SCL_H;
  94.         I2C_Delay();
  95.         SCL_L;
  96. }

  97. //主机不应答
  98. void NOACK()
  99. {
  100.         SCL_L;
  101.         SDA_H;
  102.         I2C_Delay();
  103.         SCL_H;
  104.         I2C_Delay();
  105.     SCL_L;
  106. }


  107. //LCD清屏或全屏显示
  108. void Bu9792_Clear(uchar i)
  109. {
  110.         I2C_Start();              
  111.          I2C_SendByte(0x7C);         
  112.         if(i)            
  113.         {
  114.                 I2C_SendByte(0xC0);//关闭显示
  115.             I2C_SendByte(0x00);        //ADSET  ram地址设置
  116.                         
  117.                 for(i=0;i<18;i++)
  118.                 {
  119.                         I2C_SendByte(0x00);
  120.                 }        
  121.         }        
  122.     else                        
  123.         {        
  124.                 //I2C_SendByte(0xC8);   //开启显示
  125.                 I2C_SendByte(0xFE);  //全屏显示
  126.         }
  127.          
  128.         I2C_Stop();                 
  129. }

  130. //初始化
  131. void Bu9792_Init()
  132. {
  133.         uchar i;
  134.         Delay_100us();                     
  135.         I2C_Stop();
  136.         I2C_Start();
  137.         I2C_SendByte(SlaveAddr);
  138.         
  139.         I2C_SendByte(0xEA);        //software reset
  140.         I2C_SendByte(0xA2);                //display control
  141.         I2C_SendByte(0xE8);
  142.         I2C_SendByte(0x00);        //ADSET  ram地址设置
  143.         for(i=0;i<18;i++)
  144.         {
  145.                 I2C_SendByte(0x00);
  146.         }        
  147.         I2C_Stop();
  148.                
  149. }

  150. void Bu9792_Display(uchar wei,uchar num)
  151. {
  152.         I2C_Start();
  153.         I2C_SendByte(SlaveAddr);
  154.         I2C_SendByte(0xFC);   
  155.         I2C_SendByte(0xC8);      //显示打开
  156.     I2C_SendByte(0xE8);  
  157.     switch(wei)
  158.         {
  159.                 case 1:        wei = 0x01;break;
  160.                 case 2:        wei = 0x03;break;
  161.                 case 3:        wei = 0x06;break;
  162.                 case 4:        wei = 0x08;break;
  163.                 case 5:        wei = 0x0B;break;
  164.                 case 6:        wei = 0x0D;break;
  165.                 case 7:        wei = 0x10;break;
  166.                 case 8:        wei = 0x12;break;
  167.         
  168.         }        
  169.         //I2C_SendByte(0xEC);
  170.         I2C_SendByte(wei);
  171.     I2C_SendByte(num);
  172.   
  173.         I2C_Stop();

  174. }


  175. void Bu9792_DisplayPot()
  176. {
  177.         I2C_Start();
  178.         I2C_SendByte(SlaveAddr);
  179.         I2C_SendByte(0xFC);   
  180.         I2C_SendByte(0xC8);      //显示打开
  181.     I2C_SendByte(0xE8);  
  182.             
  183.         //I2C_SendByte(0xEC);
  184.         I2C_SendByte(0x0f);
  185.     I2C_SendByte(0x40);
  186.   
  187.         I2C_Stop();

  188. }
复制代码
51hei.png
所有资料51hei提供下载:
三相计量RN8302B.7z (4.52 MB, 下载次数: 180)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:254226 发表于 2022-1-22 16:53 | 显示全部楼层
感谢楼主,共享的内容帮组很大!!!
回复

使用道具 举报

ID:291242 发表于 2023-1-20 00:54 | 显示全部楼层
对于这种表的校准都没有好的办法吗?
回复

使用道具 举报

ID:391619 发表于 2023-5-23 09:38 | 显示全部楼层
很好,非常感谢
回复

使用道具 举报

ID:1109350 发表于 2024-4-7 13:06 | 显示全部楼层
很好,非常非常感谢,对我很有用!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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