ade7758读写程序

HDL语言及源代码

6人已加入

描述

       ADE7758芯片

  ADE7758仅简化了 电力测量新应用模块的设计难度,可做到全电子或真正固体化、静止化,以有利于提高性能,降低成本;还可以利用现有的电话线、专线、高频无线电调制解调器、光缆、低压配电线载波等技术手段完成自动抄读表、分时电价、实时电价、多功能计量、预付费等扩充应用功能。使电能计量具有高精度、高可靠性、免维护和双向通讯功能,适应电力市场化下的电力公司提供新的增值服务。

  ADE7758 是一款功能先进的数字电能表芯片,它与单片机 PIC16F877 、LCD 模块、电源等构成的一种多费率电子电能表电路见图。ADE7753 通过串行接口与单片机通信,接收单片机控制,实现多费率计量。

  ADE7758 提供系统的校正功能如:有效值偏移的校正、相位和功率的校正等等。引脚 APCF 的逻辑输出给出了有功功率的信息,引脚 VARCF 的输出提供了瞬时复功率和视在功率的信息。ADE7758 具有一个波形取样寄存器,其值来自于 ADC 的输出。波形采样部分集成有一个用于短时持续低电平或高电平的监测电路,门槛电平和持续时间是由用户编程来决定的。三相中的任一相过零监测是同步进行的,过零监测的结果可用于测量三路电压输入中任一路的周期。

  ADE7758 的所有功能都是通过读、写片上寄存器来实现的,即 ADE7758 的各种设定和操作主要是对其众多寄存器的读和写。每个寄存器在读、写时,首先要执行一个写通信寄存器的操作,然后开始传输数据。 电能表的测控命令和测量信息可以多种方式与 MCU 通讯。MCU 输入的命令字控制着 ADE7758 的工作模式、测量模式、波形采样模式、有效值偏差补偿量和中断模式等。例如:每相的电流通道在信号通路中都有一个乘法器。电流波形可以改变±50%,这主要是由写入 12 位有符号电流波形增益寄存器(AIGAIN, BIGAIN ,CIGAIN)中的 2 进制数决定的:如果 7FFH 写入这三个寄存器,则 ADC 的输出标定值将增加 50%;如果 800H 被写入,则输出减小 50%。

  ade7758读写程序详解分享

  (处理器采用MSP430F449)

  程序清单如下:

  //operating SPI PORTS --CAN

  #include “msp430x44x.h”

  unsigned char SPIData[3]; // 收到的ADE7758的数据信息

  unsigned char SPI_Num; // 接收字符计数器

  unsigned char SPICMD[3]; // 待发送命令字符串

  // *****************************************************************************

  // 同步串行通讯 -- 延时子程序

  void SPIDelay(int DelayTimes)

  { while (DelayTimes 》 0) DelayTimes--;

  }

  // *****************************************************************************

  // 同步串行通讯 -- 初始化7758通讯接口模块

  void Init_SPI1(void)

  { // 初始化USART1为SPI工作模式

  UCTL1 &= ~SWRST; // 开始 USART1 的初始化设置

  UCTL1 |= CHAR; // USART1 8 BITS 数据模式

  UCTL1 |= SYNC; // USART1 SPI 通讯模式

  UCTL1 |= MM; // USART1 SPI 主模式

  UTCTL1 |= STC; // 从机发送模式,1是SPI的3线模式,STE引脚不作用

  UTCTL1 |= SSEL1; // 选择子系统时钟 SMCLK

  UTCTL1 |= SSEL0; //

  //UTCTL1 |= CKPL; // UCLK1信号 与 UCLK信号 极性相反

  UTCTL1 &= ~CKPL;

  UBR01 = 0x08; // 同步信号分频因子 1MHz @ 8MHz

  UBR11 = 0x00;

  UMCTL1 = 0x00; // 波特率因子调整因子

  ME2 |= USPIE1; // 开启USART1 的 SPI 模块

  P4SEL |= 0X3C; // 进行特定的端子设置

  P4DIR |= 0X0C;

  IE2 |= URXIE1; // SPI 接收中断允许

  UCTL1 &= ~SWRST; // USART1 SPI 模式设置完毕

  P4OUT &= ~BIT2; // ADE7758 常选通状态

  }

  // *****************************************************************************

  // 同步串行通讯 -- 写ADE7758模块

  // Addr 为ADE7758模块内部寄存器地址

  // Length 为ADE7758相应的寄存器数据长度

  // SPICMD[0..2] 待发送信息

  void Write_7758(unsigned char Address,unsigned char Length)

  { unsigned char num;

  // 选通 ADE7758

  while ((UTCTL1 & TXEPT)==0); // 判断发送缓冲区是否为空

  TXBUF1 = Address | 0x80; // 发送 待写地址

  SPIDelay(10); // 延时

  for (num = 0; num 《 Length; num++) // 循环发送多字节信息

  { while ((UTCTL1 & TXEPT)==0); // 判断发送缓冲区是否为空

  TXBUF1 = SPICMD[num]; // 发送 待写地址

  SPIDelay(1); // 延时

  }

  }

  // *****************************************************************************

  // 同步串行通讯 -- 读ADE7758模块

  // Addr 为ADE7758模块内部寄存器地址

  // Length 为ADE7758相应的寄存器数据长度

  // SPIData[0..2] 为接收到的数据信息

  void Read_7758(unsigned char Address)

  { // 选通 ADE7758

  while ((UTCTL1 & TXEPT)==0); // 判断发送缓冲区是否为空

  TXBUF1 = Address; // 发送 读地址

  SPIDelay(1); // 延时

  SPI_Num = 0; // 初始化接收数据个数

  }

  // *****************************************************************************

  // 同步串行通讯 -- 初始化ADE7758模块

  void Init_7758(void)

  {

  // SPCR=0x2A;

  SPICM

  D[0] = 0x40; // 操作模式寄存器

  Write_7758(0x13,1); // measurement mode

  SPIDelay(10);

  Read_7758(0x13);

  SPICMD[0] = 0x00; // 软件复位

  Write_7758(0x13,1); // measurement mode

  SPIDelay(10);

  SPICMD[0] = 0x38; // Line Cycle Accumulation Mode

  Write_7758(0x17,1);

  SPICMD[0] = 0x00; // Interrupt Mask

  SPICMD[1] = 0x00;

  SPICMD[2] = 0x00;

  Write_7758(0x18,3);

  SPICMD[0] = 0x00; // Gain

  Write_7758(0x23,1);

  //SPCR=0x22;

  }

  #pragma vector = USART1RX_VECTOR // USART 1 接收信息中断

  __interrupt void U7758_ISP(void) // SPI1 发送中断服务程序

  {

  SPIData[SPI_Num] = RXBUF1;

  IFG2 &= ~URXIFG1;

  SPI_Num++;

  }

  void main(void)

  { int i;

  WDTCTL = WDTPW + WDTHOLD;

  // FLL_CTL0 |= XCAP14PF;

  SCFI0 = 0X20;

  // FN_4; // 设置系统工作频率

  SCFI1 = 0X20;

  //SCFQCTL = 64; // (121+1) * 32768 * 2 = 7.99MHz

  FLL_CTL0 = 0XEC;

  FLL_CTL1 = 0X00;

  P1DIR = 32;

  P1SEL = 32;

  Init_SPI1();

  // Init_7758();

  _EINT();

  for (i=0;i《100;i++) Read_7758(i);

  while (1) Read_7758(0x46);

  }

  MSP430F449采用三线SPI主模式,采用1MHZ的通讯频率与ADE7758通讯。

  449采用中断方式进行接收。

  通过示波器可以看到收发的时序。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分