找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2529|回复: 0
打印 上一主题 下一主题
收起左侧

PL3201测电流测电压,测有功测无功!

[复制链接]
跳转到指定楼层
楼主
ID:82781 发表于 2015-6-13 15:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. /*
  2. %%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%
  3. Features:    ATT7053BU.C
  4. Description:  NONE
  5. Author:    小ARM菜菜
  6. Time:     2013/04
  7. Version:  NONE
  8. Q Q :925295580
  9. %%%%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%%%
  10. */
  11. #include <PL3201_Addr_Map.h>
  12. #include "ATT7053BU.h"
  13. sbit ATT7053BU_REST=P3^2;
  14.   sbit AT_CS=P2^2; //AT93C56
  15. sbit SCLK=P1^5 ;
  16. sbit SDI=P1^4;//sbit SDI=P1^6;
  17. sbit SDO=P1^7;
  18. sbit CS=P2^1;
  19. //如有疑问请参阅王建华的PCB之终端板为依据
  20. //2013年
  21. //小ARM菜菜
  22.    void delay1ms(uint32_t t)
  23. {
  24.     unsigned char a,b;
  25. while(t)
  26. {t--;
  27.     for(b=44;b>0;b--)
  28.         for(a=53;a>0;a--);
  29.   }
  30. }
  31. void delay10us(void)  
  32. {
  33.     unsigned char a;
  34.     for(a=22;a>0;a--);
  35. }
  36. static void ATT7035BU_Write(uint8_t addr,uint32_t dat)
  37. {
  38.   unsigned char i,j;
  39.   uint8_t temp[3];
  40.     addr|=0x80;  //写所以要置高位为1
  41.   dat&=0x00ffffff; //强制首位字节为0,因为无效,只有24个比特,3个字节有效

  42.    temp[2] = dat; //低8为
  43.    dat>>=8 ;
  44.    temp[1] = dat;  //中8为
  45.    dat>>=8 ;
  46.    temp[0] = dat;  //高8为
  47.    
  48.     SCLK=0;
  49. CS=0;
  50. AT_CS=0;//must be 0!

  51.    //写命令
  52. for (i = 0; i < 8; i++)
  53. {
  54.   if (addr & 0x80)
  55.    SDI=1;
  56.   else
  57.    SDI=0;
  58.   addr <<= 1;
  59.   delay10us();
  60.   SCLK=1;
  61. delay10us();
  62.   SCLK=0;
  63. delay10us();
  64. }

  65.    //写应用数据,从高位开始
  66.   for(j=0;j<3;j++)
  67.   {
  68.      for (i = 0; i < 8; i++)
  69.                  {
  70.       if (temp[j] & 0x80)
  71.        SDI=1;
  72.       else
  73.        SDI=0;
  74.       temp[j] <<= 1;
  75.       delay10us();
  76.       SCLK=1;
  77.          delay10us();
  78.      
  79.       SCLK=0;
  80.       delay10us();
  81.               }

  82.   }


  83.     CS=1;
  84. SCLK=1;


  85. }

  86. static uint32_t  ATT7035BU_Read(uint8_t addr)
  87. {
  88.       unsigned char i,j;
  89.   uint32_t temp=0;
  90.   uint8_t dat;
  91.      
  92.    addr&=0x7f;//高位强制为0.
  93.      SCLK=0;
  94. CS=0;
  95. AT_CS=0;//must be 0!
  96. //写ADDR
  97.     for (i = 0; i < 8; i++)
  98. {
  99.   if (addr & 0x80)
  100.    SDI=1;
  101.   else
  102.    SDI=0;
  103.   addr <<= 1;
  104.   delay10us();
  105.   SCLK=1;
  106.      delay10us();
  107.   SCLK=0;
  108.   delay10us();
  109. }

  110.     //读取数据
  111.   for(j=0;j<3;j++)
  112.   {


  113.       for (i = 0; i < 8; i++)
  114.     {
  115.      if (dat & 0x80)
  116.       SDI=1;
  117.      else
  118.       SDI=0;
  119.      dat <<= 1;
  120.      delay10us();
  121.      SCLK=1;
  122.      delay10us();
  123.      if (SDO==1)
  124.       dat |= 0x01;
  125.      else
  126.       dat &= 0xfe;
  127.      SCLK=0;
  128.      delay10us();
  129.     }

  130.     temp|=dat ;//接收
  131.     temp<<=8;  //next
  132.    
  133.   // val[i]= dat;//val[0]高位24,val[2]地位0,

  134.   }

  135.     CS=1;
  136. SCLK=1;
  137. return temp; //返回数据
  138. }

  139. void Init_ATT7053BU(void)
  140. {
  141.    /*
  142.   reset  ATTA7053B
  143.   */
  144.   ATT7053BU_REST=0;
  145.   delay1ms(5) ;
  146. ATT7053BU_REST=1;
  147. }
  148.   extern void SendOneByte(unsigned char c) ;
  149. char  Read_AC_Frequency (void)
  150. {
  151. uint32_t  xdata temp;
  152. uint16_t xdata  l,m;
  153. /*
  154. Read the frequency of the alternating current
  155. */
  156. temp =  ATT7035BU_Read( Freq_U);
  157.    
  158.      m = temp>>16 ;
  159.      m&=0x00ff;
  160.    l= temp>>8 ;
  161.      l&=0x00ff;
  162.       m<<=8;
  163.      m=m+l;
  164.         return   (500000/m);
  165. }
  166. uint16_t Read_AC_voltage_RMS(void)
  167. {
  168.    uint32_t xdata temp;
  169. /*

  170. Calculating AC voltage values, voltage returns a hexadecimal value,
  171. of course, necessary in the case of digital filtering should be considered
  172. by 小ARM 菜菜
  173. */
  174.     temp =  ATT7035BU_Read( Rms_U  );
  175.     temp>>=8;
  176. return (temp/k);//计算电压
  177.       

  178. }
  179. uint32_t Read_AC_Current (uint8_t chanl)
  180. {

  181.   uint32_t temp;

  182.    if(chanl==1)
  183. {
  184.     ATT7035BU_Write(WPREG,OWP_40);
  185.    ATT7035BU_Write( ANAEN,OPEN_ALL_ADC);
  186.    ATT7035BU_Write( EMUCFG,MEASUREMENT_CHANNEL_1 ); //计量通道choose
  187.    ATT7035BU_Write(WPREG,CWP_40);
  188.    temp = ATT7035BU_Read( Rms_I1 );   //通道2电流值
  189.    temp>>=8;
  190.   temp=KI*temp ;
  191.   return temp;

  192. }
  193. else
  194. if(chanl==2)
  195. {
  196.     ATT7035BU_Write(WPREG,OWP_40);
  197.    ATT7035BU_Write( ANAEN,OPEN_ALL_ADC);
  198.    ATT7035BU_Write( EMUCFG,MEASUREMENT_CHANNEL_2 ); //计量通道choose
  199.    ATT7035BU_Write(WPREG,CWP_40);
  200.   temp = ATT7035BU_Read( Rms_I2 );   //通道2电流值
  201.     temp>>=8;
  202.   temp=KI*temp ;
  203.   return temp;

  204. }




  205. }
  206. /*
  207. Calculated active power is actually identified from manual to read data register by 小ARM菜菜
  208. */
  209. uint32_t Active_Power_Calculation (uint8_t channl)
  210. {

  211.   uint32_t temp;
  212.   
  213.     if(channl==1)
  214.     {
  215.      temp = ATT7035BU_Read( PowerP1 );//第一通道的有功功率
  216.   return temp>>=8;
  217.      }
  218.      else
  219.      if(channl==2)
  220.      {
  221.    
  222.   temp = ATT7035BU_Read( PowerP2 );//第一通道的有功功率
  223.   return temp>>=8;
  224.      }

  225. }
  226.   /*无功功率测量*/
  227. uint32_t Reactive_power_measurement(uint8_t channl)
  228. {
  229.     uint32_t temp;
  230.      if(channl==1)
  231.     {
  232.      temp = ATT7035BU_Read( PowerQ1 );//第一通道的有功功率
  233.   return temp>>=8;
  234.        }
  235.        else
  236.        if(channl==2)
  237.        {
  238.     temp = ATT7035BU_Read( PowerQ2 );//第一通道的有功功率
  239.   return temp>>=8;  
  240.       
  241.        }

  242. }   
  243.    /*视在功率测量*/
  244. uint32_t Apparent_power_measurement (uint8_t channl)
  245. {
  246.        uint32_t temp;

  247. if(channl==1)
  248.     {
  249.      ATT7035BU_Write(WPREG,OWP_40);
  250.    ATT7035BU_Write( ANAEN,OPEN_ALL_ADC);
  251.    ATT7035BU_Write( EMUCFG,MEASUREMENT_CHANNEL_1 ); //计量通道choose
  252.    ATT7035BU_Write(WPREG,CWP_40);
  253.    
  254.      temp = ATT7035BU_Read( Power_S );//第一通道的有功功率
  255.   return temp>>=8;
  256.     }
  257.     else
  258.     if(channl==2)
  259.     {
  260.    
  261.       ATT7035BU_Write(WPREG,OWP_40);
  262.    ATT7035BU_Write( ANAEN,OPEN_ALL_ADC);
  263.    ATT7035BU_Write( EMUCFG,MEASUREMENT_CHANNEL_2 ); //计量通道choose
  264.    ATT7035BU_Write(WPREG,CWP_40);
  265.    
  266.      temp = ATT7035BU_Read( Power_S );//第二通道的有功功率
  267.   return temp>>=8;

  268.     }
复制代码


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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