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

ADE7758驱动程序

时间:11-11 来源:互联网 点击:
  1. data,unsigned short addr)
  2. {
  3. memcpy(ADE_AdjustDataBuf+addr,&data,sizeof(unsigned short));
  4. }
  5. /**
  6. *读取校准数据缓冲区中数据
  7. */
  8. unsigned short ADE_ReadByte(unsigned short addr)
  9. {
  10. unsigned short data;
  11. memcpy(&data,ADE_AdjustDataBuf+addr,sizeof(unsigned short));
  12. return data;
  13. }
  14. /**
  15. *功能:保存校准数据
  16. */
  17. void ADE_AdjustSaveData(void)
  18. {
  19. unsigned char i;
  20. unsigned short temp_data;
  21. unsigned short temp_add=0;
  22. ADE_WriteByte(SAVE_OK,ADE_SET_ADDR);//写入标志
  23. temp_add+=2;
  24. for(i=0;i<3;i++)
  25. {
  26. temp_data=adjusting.write_data.voltage[i];
  27. ADE_WriteByte(temp_data,ADE_SET_ADDR+temp_add);
  28. temp_add+=2;
  29. }
  30. for(i=0;i<3;i++)
  31. {
  32. temp_data=adjusting.write_data.current[i];
  33. ADE_WriteByte(temp_data,ADE_SET_ADDR+temp_add);
  34. temp_add+=2;
  35. }
  36. for(i=0;i<3;i++)
  37. {
  38. temp_data=adjusting.write_data.watt[i];
  39. ADE_WriteByte(temp_data,ADE_SET_ADDR+temp_add);
  40. temp_add+=2;
  41. }
  42. for(i=0;i<3;i++)
  43. {
  44. temp_data=adjusting.write_data.var[i];
  45. ADE_WriteByte(temp_data,ADE_SET_ADDR+temp_add);
  46. temp_add+=2;
  47. }
  48. for(i=0;i<3;i++)
  49. {
  50. temp_data=adjusting.write_data.va[i];
  51. ADE_WriteByte(temp_data,ADE_SET_ADDR+temp_add);
  52. temp_add+=2;
  53. }
  54. }
  55. /**
  56. *功能: 将缓冲区中的校准参数写入ADE7758
  57. *当确定校准参数的值后,便调用该函数,写数据写入ADE7758特定的寄存器中
  58. */
  59. void ADE_AdjustWriteValue(void)
  60. {
  61. unsigned char i;
  62. unsigned short temp_data;
  63. for(i=0;i<3;i++)
  64. {
  65. temp_data=adjusting.write_data.voltage[i];
  66. if(temp_data<0x1000)//4096
  67. ADE_Write(ADD_AVRMSGAIN+i,temp_data,16);
  68. }
  69. for(i=0;i<3;i++)
  70. {
  71. temp_data=adjusting.write_data.current[i];
  72. if(temp_data<0x1000)//4096
  73. ADE_Write(ADD_AIGAIN+i,temp_data,16);
  74. }
  75. for(i=0;i<3;i++)
  76. {
  77. temp_data=adjusting.write_data.watt[i];
  78. if(temp_data<0x1000)//4096
  79. ADE_Write(ADD_AWG+i,temp_data,16);
  80. }
  81. for(i=0;i<3;i++)
  82. {
  83. temp_data=adjusting.write_data.var[i];
  84. if(temp_data<0x1000)//4096
  85. ADE_Write(ADD_AVARG+i,temp_data,16);
  86. }
  87. for(i=0;i<3;i++)
  88. {
  89. temp_data=adjusting.write_data.va[i];
  90. if(temp_data<0x1000)//4096
  91. ADE_Write(ADD_AVAG+i,temp_data,16);
  92. }
  93. }
  94. /**
  95. *功能:读出已保存的校准参数
  96. */
  97. void ADE_AdjustReadData(void)
  98. {
  99. unsigned char i;
  100. unsigned short temp_data;
  101. unsigned short temp_add=0;
  102. if(ADE_ReadByte(ADE_SET_ADDR)==SAVE_OK)
  103. {
  104. b_adjust=1;//ADE7758已经校准标志
  105. temp_add+=2;
  106. for(i=0;i<3;i++)
  107. {
  108. temp_data=ADE_ReadByte(ADE_SET_ADDR+temp_add);
  109. adjusting.write_data.voltage[i]=temp_data;
  110. temp_add+=2;
  111. }
  112. for(i=0;i<3;i++)
  113. {
  114. temp_data=ADE_ReadByte(ADE_SET_ADDR+temp_add);
  115. adjusting.write_data.current[i]=temp_data;
  116. temp_add+=2;
  117. }
  118. for(i=0;i<3;i++)
  119. {
  120. temp_data=ADE_ReadByte(ADE_SET_ADDR+temp_add);
  121. adjusting.write_data.watt[i]=temp_data;
  122. temp_add+=2;
  123. }
  124. for(i=0;i<3;i++)
  125. {
  126. temp_data=ADE_ReadByte(ADE_SET_ADDR+temp_add);
  127. adjusting.write_data.var[i]=temp_data;
  128. temp_add+=2;
  129. }
  130. for(i=0;i<3;i++)
  131. {
  132. temp_data=ADE_ReadByte(ADE_SET_ADDR+temp_add);
  133. adjusting.write_data.va[i]=temp_data;
  134. temp_add+=2;
  135. }
  136. ADE_AdjustWriteValue();
  137. }
  138. }
  139. /**
  140. *功能:检测7758是否异常,有则修复
  141. */
  142. void ADE_Check7758(void)
  143. {
  144. unsigned short temp,temp1;
  145. if(!b_adjust)//ADE7758已经校准标志
  146. return;
  147. temp=ADE_ReadByte(ADE_SET_ADDR+2);
  148. temp1=ADE_Read(ADD_AVRMSGAIN,12)&0x0fff;
  149. if(temp!=temp1)//检测A相校准参数是否正确
  150. ADE_AdjustReadData();
  151. }
  152. /**
  153. *功能:将标志写入中断寄存器中,允许能量寄存器容量超出一半时产生中断
  154. */
  155. void ADE_WriteMask(void)
  156. {
  157. unsigned char data[3];
  158. unsigned char type;
  159. unsignedintwdata=0x00000700;//AEHF=1,VAEHF=1,低8位无用
  160. ADE_CS(0);
  161. type=ADD_MASK&0x7F;
  162. type=type|0x80;
  163. data[0]=type;
  164. ADE_SPIWrite(data,1);
  165. ADE_udelay();
  166. data[0]=(wdata>>16)&0xFF;
  167. data[1]=(wdata>>8)&0xFF;
  168. data[2]=wdata&0xFF;
  169. ADE_SPIWrite(data,3);
  170. ADE_CS(1);
  171. }
  172. /**
  173. *功能:清除校准数据
  174. */
  175. void ADE_Clean(void)
  176. {
  177. unsigned char i;
  178. for(i=0;i<3;i++)
  179. adjusting.write_data.voltage[i]=0;
  180. for(i=0;i<3;i++)
  181. adjusting.write_data.current[i]=0;
  182. for(i=0;i<3;i++)
  183. adjusting.write_data.watt[i]=0;
  184. for(i=0;i<3;i++)
  185. adjusting.write_data.var[i]=0;
  186. for(i=0;i<3;i++)
  187. adjusting.write_data.va[i]=0;
  188. ADE_AdjustWriteValue();
  189. memset(ADE_AdjustDataBuf,0,sizeof(ADE_AdjustDataBuf));/*校验数据缓冲区清0*/
  190. }
  191. /**
  192. *功能:7758初始化函数
  193. */
  194. void ADE_Init(void)
  195. {
  196. unsigned char TempData,i;
  197. ADE_WriteMask();//write interrupt masktoade7758
  198. TempData=(0xff&ADE_R

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

网站地图

Top