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

ADE7758驱动程序

时间:11-11 来源:互联网 点击:
  1. /*
  2. *ade7758.c
  3. *
  4. *Createdon:2014-9-12
  5. *Author:lzy
  6. */
  7. #include
  8. #include"debug.h"
  9. #include"ade7758.h"
  10. #include"SpiDev.h"
  11. unsigned char bWorkModel=0;//工作模式标志位 1:校准模式;0:正常工作模式;
  12. unsigned char bit_1s=0;//1s钟标志,在时钟中断函数中置位
  13. static unsigned char divider=1;//电能分频器,默认值为零,视在功率超出一定值时,自动将该值提高
  14. static unsignedintenergy[9];//用于累加电能值 36
  15. struct all_data working;//正常工作模式下存放的电参量 95
  16. struct adjust_data adjusting;//校准模式下存放的数据 65
  17. static unsignedintvo_buffer[5][3];//用于电压的积分虑波 36
  18. static unsignedintio_buffer[5][3];//用于电流的积分虑波 36
  19. static unsigned char b_adjust=0;//ADE7758已经校准标志
  20. static unsigned char sample_cycle=0;//电压采样周期,5次取平均
  21. static unsigned char ADE_AdjustDataBuf[2+sizeof(struct adjust_dataw)]={0};/*校准数据暂存缓冲区*/
  22. void ADE_Check7758(void);
  23. /**
  24. *功能:延时函数 50us
  25. */
  26. void ADE_udelay(void)
  27. {
  28. //usleep(50);
  29. }
  30. /**
  31. *功能:片选使能
  32. */
  33. void ADE_CS(unsigned char cs)
  34. {
  35. //CSADE7758_A=cs;//=====
  36. }
  37. /**
  38. *功能:通过SPI写入数据至芯片
  39. *入口参数:
  40. *buf->数据缓冲区
  41. *len->数据长度
  42. */
  43. void ADE_SPIWrite(unsigned char*buf,unsigned charlen)
  44. {
  45. SPI_Write(buf,len);
  46. }
  47. /**
  48. *功能:通过SPI读芯片数据
  49. *入口参数:len->数据长度
  50. *出口参数:buf->数据缓冲区
  51. *
  52. */
  53. void ADE_SPIRead(unsigned char*buf,unsigned charlen)
  54. {
  55. SPI_Read(buf,len);
  56. }
  57. /**
  58. *功能:7758写数据函数
  59. *入口参数:
  60. *type:目标寄存器的地址
  61. *wdata:写进寄存器的内容
  62. *databit:目标寄存器的宽度
  63. *出口参数:NULL
  64. *返回值:NULL
  65. */
  66. void ADE_Write(unsigned char type,unsignedintwdata,unsigned char databit)
  67. {
  68. unsigned char data[3];
  69. ADE_CS(0);
  70. type=type|0x80;
  71. data[0]=type;
  72. ADE_SPIWrite(data,1);
  73. ADE_udelay();
  74. if(databit==8)
  75. {
  76. data[0]=wdata;
  77. ADE_SPIWrite(data,1);
  78. }
  79. elseif(databit==16)
  80. {
  81. data[0]=(wdata&0xff00)>>8;/*高8位*/
  82. data[1]=(wdata&0x00ff);/*底8位*/
  83. ADE_SPIWrite(data,2);
  84. }
  85. else
  86. pr_err("ADE write databit Error:%d\n",databit);
  87. ADE_CS(1);
  88. }
  89. /**
  90. *功能:7758读寄存器函数
  91. *入口参数:
  92. * type:目标寄存器的地址
  93. *databit:目标寄存器的宽度
  94. *出口参数:指定寄存器的内容
  95. *返回值:指定寄存器的内容
  96. */
  97. unsignedintADE_Read(unsigned char type,unsigned char databit)
  98. {
  99. unsigned char data[4]={0,0,0,0};
  100. unsignedintrtdata=0;
  101. ADE_CS(0);
  102. type=type&0x7F;
  103. data[0]=type;
  104. ADE_SPIWrite(data,1);
  105. ADE_udelay();
  106. if(databit==8)
  107. {
  108. ADE_SPIRead(data,1);
  109. rtdata=data[0];
  110. }
  111. elseif(databit==12)
  112. {
  113. ADE_SPIRead(data,2);
  114. rtdata=(data[0]&0x0f)<8;
  115. rtdata+=data[1];
  116. }
  117. elseif(databit==16)
  118. {
  119. ADE_SPIRead(data,2);
  120. rtdata=data[0]<8;
  121. rtdata+=data[1];
  122. }elseif(databit==24)
  123. {
  124. ADE_SPIRead(data,3);
  125. rtdata=data[0]<16;
  126. rtdata+=(data[1]<8);
  127. rtdata+=data[2];
  128. }
  129. else
  130. pr_err("ADE Read databit Error:%d\n",databit);
  131. ADE_CS(1);
  132. return(rtdata);
  133. }
  134. /**
  135. *功能:检测异常
  136. */
  137. void ADE_AuCheck(void)
  138. {
  139. unsigned char i;
  140. unsignedinttemp_data[5];//存放运算过程的中间变量
  141. unsignedinttemp_v,temp_i;
  142. //自动检测ADE7758是否出现异常
  143. if(working.voltage[0]>ERR_VOLTAGE||
  144. working.voltage[1]>ERR_VOLTAGE||
  145. working.voltage[2]>ERR_VOLTAGE)
  146. {
  147. ADE_Check7758();
  148. }
  149. //自动设置分频器的大小
  150. for(i=0;i<3;i++)
  151. {
  152. temp_v=working.voltage[i];
  153. temp_i=working.current[i];
  154. temp_data[i]=((temp_v*temp_i)/divI_VALUE)&0x000000ff;
  155. }
  156. temp_data[3]=(temp_data[0]>temp_data[1])?
  157. ((temp_data[0]>temp_data[2])?temp_data[0]:temp_data[2]):
  158. ((temp_data[1]>temp_data[2])?temp_data[1]:temp_data[2]);
  159. if(divider!=(char)temp_data[3])
  160. {
  161. //writetoade7758
  162. divider=(char)temp_data[3]+1;
  163. for(i=0;i<3;i++)
  164. ADE_Write(ADD_Wdiv+i,((int)divider<8),8);
  165. }
  166. }
  167. /**
  168. *功能:每秒读取功率
  169. */
  170. void ADE_ReadHR(void)
  171. {
  172. unsigned char i;
  173. unsignedinttemp_data[9];//存放运算过程的中间变量
  174. //有功
  175. temp_data[ADD_AWATTHR-1]=ADE_Read(ADD_AWATTHR,16);
  176. temp_data[ADD_BWATTHR-1]=ADE_Read(ADD_BWATTHR,16);
  177. temp_data[ADD_CWATTHR-1]=ADE_Read(ADD_CWATTHR,16);
  178. //无功
  179. temp_data[ADD_AVARHR-1]=ADE_Read(ADD_AVARHR,16);
  180. temp_data[ADD_BVARHR-1]=ADE_Read(ADD_BVARHR,16);
  181. temp_data[ADD_CVARHR-1]=ADE_Read(ADD_CVARHR,16);
  182. //

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

网站地图

Top