微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > STM32_ADE7758驱动

STM32_ADE7758驱动

时间:11-11 来源:互联网 点击:
  1. d(ADD_AVAHR,16);
  2. temp_data[ADD_BVAHR-1]=ADE_Read(ADD_BVAHR,16);
  3. temp_data[ADD_CVAHR-1]=ADE_Read(ADD_CVAHR,16);
  4. for(i=0;i<9;i++)
  5. {
  6. if(temp_data[i]>0x7fff)
  7. temp_data[i]=0xffff-temp_data[i]+1;
  8. }
  9. if(divider>1)
  10. {
  11. for(i=0;i<9;i++)
  12. temp_data[i]=temp_data[i]*divider;//乘上分频器的值
  13. }
  14. //能量的计算
  15. for(i=0;i<9;i++)
  16. energy[i]+=temp_data[i];//累加电能值,单位为 WS(瓦秒)
  17. //转换成千瓦时
  18. for(i=0;i<3;i++)
  19. {
  20. working.watt_hour[i]+=(energy[i]/3600000);//转换成千瓦时
  21. energy[i]=energy[i]%3600000;
  22. }
  23. working.watt_hour[3]=working.watt_hour[0]+working.watt_hour[1]+working.watt_hour[2];//总和
  24. //转换成千伏安时
  25. for(i=0;i<3;i++)
  26. {
  27. working.va_hour[i]+=(energy[i+6]/3600000);//转换成千瓦时
  28. energy[i+6]=energy[i+6]%3600000;
  29. }
  30. working.va_hour[3]=working.va_hour[0]+working.va_hour[1]+working.va_hour[2];//总和
  31. for(working.watt[3]=0,i=0;i<3;i++)
  32. {
  33. working.watt[i]=temp_data[i]/1000;//千瓦
  34. working.watt[3]+=working.watt[i];
  35. }
  36. for(working.var[3]=0,i=0;i<3;i++)
  37. {
  38. working.var[i]=temp_data[i+3]/1000;
  39. working.var[3]+=working.var[i];
  40. }
  41. for(working.va[3]=0,i=0;i<3;i++)
  42. {
  43. working.va[i]=temp_data[i+6]/1000;//千伏安
  44. if(working.va[i]
  45. working.va[i]=working.watt[i];
  46. working.va[3]+=working.va[i];
  47. }
  48. }
  49. /**
  50. *功能:实时读取电流电压值
  51. */
  52. void ADE_ReadVC(void)
  53. {
  54. unsigned char i,j;
  55. for(i=0;i<3;i++)
  56. {
  57. working.voltage[i]=0;
  58. working.current[i]=0;
  59. }
  60. for(i=0;i<3;i++)
  61. {
  62. for(j=0;j<5;j++)
  63. {
  64. working.voltage[i]+=vo_buffer[j][i];
  65. working.current[i]+=io_buffer[j][i];
  66. }
  67. }
  68. for(i=0;i<3;i++)
  69. {
  70. working.voltage[i]=working.voltage[i]/5;
  71. working.current[i]=working.current[i]/5;
  72. }
  73. //电压电流的三相平均值
  74. working.voltage[3]=(working.voltage[0]+working.voltage[1]+working.voltage[2])/3;
  75. working.current[3]=(working.current[0]+working.current[1]+working.current[2])/3;
  76. printf("voltage=%x current=%x\n",working.voltage[0],working.current[0]);
  77. }
  78. /**
  79. *功能:从ADE7758中取出三相电压电流功率等电参量
  80. */
  81. void ADE_Update(void)
  82. {
  83. static unsigned char sample_cycle=0;//电压采样周期,5次取平均
  84. static unsigned char bit_3s=0;
  85. unsigned char j;
  86. if(!bWorkModel)//正常工作模式
  87. {
  88. if(bit_1s)
  89. {
  90. bit_1s=0;
  91. ADE_ReadHR();
  92. if((bit_3s++)>=3)/*三秒检测一次异常*/
  93. {
  94. //ADE_AuCheck();
  95. bit_3s=0;
  96. }
  97. }
  98. for(j=0;j<3;j++)
  99. {
  100. vo_buffer[sample_cycle][j]=ADE_Read(ADD_AVRMS+j,24)/*>>12*/;//voltage
  101. io_buffer[sample_cycle][j]=ADE_Read(ADD_AIRMS+j,24)/*>>13*/;//current
  102. }
  103. if(sample_cycle==4)/*读取5次取平均值*/
  104. ADE_ReadVC();
  105. }
  106. if(sample_cycle<4)
  107. sample_cycle+=1;
  108. else
  109. sample_cycle=0;
  110. }
  111. /**
  112. *测试硬件连接是否正确
  113. */
  114. u8 ADE_TestHard(void)
  115. {
  116. unsignedintrdata,wdata=0xaa5577;//AEHF=1,VAEHF=1,低8位无用
  117. u8 ret=0;
  118. ADE_Write(ADD_MASK,wdata,24);
  119. rdata=ADE_Read(ADD_MASK,24);//验证通讯是否有问题
  120. if(rdata!=wdata)
  121. printf("ADE error\r\n");
  122. else
  123. {
  124. ret=1;
  125. printf("ADE OK\r\n");
  126. }
  127. return ret;
  128. }
  129. /**
  130. *功能:7758初始化函数
  131. */
  132. void ADE_Init(void)
  133. {
  134. GPIO_InitTypeDef GPIO_InitStructure;
  135. RCC_APB2PeriphClockCmd(ADE_RCC,ENABLE);
  136. GPIO_InitStructure.GPIO_Pin=ADE_PIN;
  137. GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//推挽输出
  138. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//IO口速度为50MHz
  139. GPIO_Init(ADE_GPIO,&GPIO_InitStructure);
  140. ADE_CS(1);
  141. if(ADE_TestHard())
  142. {
  143. ADE_Write(ADD_OPMODE,0x44,8);//软件复位
  144. ADE_udelay();//添加延时 确保复位成功
  145. }
  146. }
  147. void ADE_thread_entry(void)
  148. {
  149. SPI2_Init();
  150. ADE_Init();
  151. while(1)
  152. {
  153. ADE_Update();
  154. delay_ms(50);/*等待,让出cpu权限,切换到其他线程*/
  155. }
  156. }

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top