STM32_ADE7758驱动
时间:11-11
来源:互联网
点击:
- /*
- *ade7758.c
- *
- *Createdon:2014年10月11日
- *Author:Lzy
- */
- //#include
- #include"ade7758.h"
- #include"sys.h"
- #define ADE_CS_PIN PBout(12)
- #define ADE_RCC RCC_APB2Periph_GPIOB
- #define ADE_GPIO GPIOB
- #define ADE_PIN(GPIO_Pin_12)
- unsigned char bWorkModel=0;//工作模式标志位 1:校准模式;0:正常工作模式;
- unsigned char bit_1s=0;//1s钟标志,在时钟中断函数中置位
- static unsigned char divider=1;//电能分频器,默认值为零,视在功率超出一定值时,自动将该值提高
- static unsignedintenergy[9];//用于累加电能值 36
- struct all_data working;//正常工作模式下存放的电参量 95
- static unsignedintvo_buffer[5][3];//用于电压的积分虑波 36
- static unsignedintio_buffer[5][3];//用于电流的积分虑波 36
- /**
- *功能:片选使能
- */
- void ADE_CS(unsigned char cs)
- {
- ADE_CS_PIN=cs;
- delay_ms(1);
- }
- /**
- *功能:延时函数 50us
- */
- void ADE_udelay(void)
- {
- delay_ms(1);
- }
- /**
- *功能:通过SPI写入数据至芯片
- *入口参数:
- *buf->数据缓冲区
- *len->数据长度
- */
- void ADE_SPIWrite(unsigned char*buf,unsigned charlen)
- {
- SPI2_Write(buf,len);
- }
- /**
- *功能:通过SPI读芯片数据
- *入口参数:len->数据长度
- *出口参数:buf->数据缓冲区
- *
- */
- void ADE_SPIRead(unsigned char*buf,unsigned charlen)
- {
- SPI2_Read(buf,len);
- }
- /**
- *功能:7758写数据函数
- *入口参数:
- *type:目标寄存器的地址
- *wdata:写进寄存器的内容
- *databit:目标寄存器的宽度
- *出口参数:NULL
- *返回值:NULL
- */
- void ADE_Write(unsigned char type,unsignedintwdata,unsigned char databit)
- {
- unsigned char data[4];
- ADE_CS(0);
- type=type|0x80;
- data[0]=type;
- ADE_SPIWrite(data,1);
- ADE_udelay();
- if(databit==8)
- {
- data[0]=wdata;
- ADE_SPIWrite(data,1);
- }
- elseif(databit==16)
- {
- data[0]=(wdata&0xff00)>>8;/*高8位*/
- data[1]=(wdata&0x00ff);/*底8位*/
- ADE_SPIWrite(data,2);
- }
- elseif(databit==24)
- {
- data[0]=(wdata&0xff0000)>>16;/*高8位*/
- data[1]=(wdata&0xff00)>>8;
- data[2]=(wdata&0xff);
- ADE_SPIWrite(data,3);
- }
- else
- printf("ADE write databit Error:%d\n",databit);
- ADE_CS(1);
- }
- /**
- *功能:7758读寄存器函数
- *入口参数:
- * type:目标寄存器的地址
- *databit:目标寄存器的宽度
- *出口参数:指定寄存器的内容
- *返回值:指定寄存器的内容
- */
- unsignedintADE_Read(unsigned char type,unsigned char databit)
- {
- unsigned char data[4]={0,0,0,0};
- unsignedintrtdata=0;
- ADE_CS(0);
- type=type&0x7F;
- data[0]=type;
- ADE_SPIWrite(data,1);
- ADE_udelay();
- if(databit==8)
- {
- ADE_SPIRead(data,1);
- rtdata=data[0];
- }
- elseif(databit==12)
- {
- ADE_SPIRead(data,2);
- rtdata=(data[0]&0x0f)<8;
- rtdata+=data[1];
- }
- elseif(databit==16)
- {
- ADE_SPIRead(data,2);
- rtdata=data[0]<8;
- rtdata+=data[1];
- }elseif(databit==24)
- {
- ADE_SPIRead(data,3);
- rtdata=data[0]<16;
- rtdata+=(data[1]<8);
- rtdata+=data[2];
- }
- else
- printf("ADE Read databit Error:%d\n",databit);
- ADE_CS(1);
- return(rtdata);
- }
- /**
- *功能:检测异常
- */
- void ADE_AuCheck(void)
- {
- unsigned char i;
- unsignedinttemp_data[5];//存放运算过程的中间变量
- unsignedinttemp_v,temp_i;
- //自动检测ADE7758是否出现异常
- if(working.voltage[0]>ERR_VOLTAGE||
- working.voltage[1]>ERR_VOLTAGE||
- working.voltage[2]>ERR_VOLTAGE)
- {
- //ADE_Check7758();
- printf("ADE Error\n");
- }
- //自动设置分频器的大小
- for(i=0;i<3;i++)
- {
- temp_v=working.voltage[i];
- temp_i=working.current[i];
- temp_data[i]=((temp_v*temp_i)/divI_VALUE)&0x000000ff;
- }
- temp_data[3]=(temp_data[0]>temp_data[1])?
- ((temp_data[0]>temp_data[2])?temp_data[0]:temp_data[2]):
- ((temp_data[1]>temp_data[2])?temp_data[1]:temp_data[2]);
- if(divider!=(char)temp_data[3])
- {
- //writetoade7758
- divider=(char)temp_data[3]+1;
- for(i=0;i<3;i++)
- ADE_Write(ADD_Wdiv+i,((int)divider<8),8);
- }
- }
- /**
- *功能:每秒读取功率
- */
- void ADE_ReadHR(void)
- {
- unsigned char i;
- unsignedinttemp_data[9];//存放运算过程的中间变量
- //有功
- temp_data[ADD_AWATTHR-1]=ADE_Read(ADD_AWATTHR,16);
- temp_data[ADD_BWATTHR-1]=ADE_Read(ADD_BWATTHR,16);
- temp_data[ADD_CWATTHR-1]=ADE_Read(ADD_CWATTHR,16);
- //无功
- temp_data[ADD_AVARHR-1]=ADE_Read(ADD_AVARHR,16);
- temp_data[ADD_BVARHR-1]=ADE_Read(ADD_BVARHR,16);
- temp_data[ADD_CVARHR-1]=ADE_Read(ADD_CVARHR,16);
- //视在
- temp_data[ADD_AVAHR-1]=ADE_Rea
STM32ADE7758驱 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)