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

STM32_ADE7758驱动

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

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

网站地图

Top