⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ltc1855.c

📁 LTC1855模数A/D转换驱动软件源代码,经过了测试,非常稳定可靠.
💻 C
字号:
#include "config.h"
#include "pinsel.h"
#include "ltc1855.h"
#include "set.h"
#include "main.h"
#include "mea.h"
					  	 					 
int16 advalue[adsamplgh][12];
int16 advaluetemp[8];
uint32 adsampcnt =0;
uint32 adtimer0[6];

uint32 advalget1[16];
uint32 advalget2[16];
uint32 advalget3[16];
uint32 advalget4[16];
uint32 advalget5[16];
uint32 advalget6[16];
uint32 advalget7[16];
uint32 advalget8[16];
uint32 adtemp;
extern uint32 ftpointercnt;
extern uint32 freqpointercnt;
extern uint32 meapointercnt;
extern uint32 dfpointercnt;

extern void adcodewriteread1(uint32 *p1,uint32 x);
extern int16 _fsadvalue(uint32 x,int32 y);

void ADInit(void)
{
	NOP();				
}
//void adrelay4us(void)
//{
//	uint8 i;
//	for(i = 0;i < 10;i++)
//	{
//		NOP();
//	}
//}		
int16 samplevalget(uint32 *ps,int32 data)
{
	int32 sampleval;
	int16 samplereturn;
	sampleval=0;
	if((*ps++)&0x00040000) sampleval=sampleval|0x8000;
	if((*ps++)&0x00040000) sampleval=sampleval|0x4000;
	if((*ps++)&0x00040000) sampleval=sampleval|0x2000;
	if((*ps++)&0x00040000) sampleval=sampleval|0x1000;
	if((*ps++)&0x00040000) sampleval=sampleval|0x0800;
	if((*ps++)&0x00040000) sampleval=sampleval|0x0400;
	if((*ps++)&0x00040000) sampleval=sampleval|0x0200;
	if((*ps++)&0x00040000) sampleval=sampleval|0x0100;
	if((*ps++)&0x00040000) sampleval=sampleval|0x0080;
	if((*ps++)&0x00040000) sampleval=sampleval|0x0040;
	if((*ps++)&0x00040000) sampleval=sampleval|0x0020;
	if((*ps++)&0x00040000) sampleval=sampleval|0x0010;
	if((*ps++)&0x00040000) sampleval=sampleval|0x0008;
	if((*ps++)&0x00040000) sampleval=sampleval|0x0004;
	if((*ps++)&0x00040000) sampleval=sampleval|0x0002;
	if((*ps++)&0x00040000) sampleval=sampleval|0x0001;
	sampleval=(sampleval>>2)&0x3fff;
	if(sampleval&0x2000) sampleval=sampleval|0xffffc000;
	sampleval=sampleval-data;//-0x4a;	
	samplereturn=sampleval;
	return samplereturn;
}
void ADread(void)
{
	uint32 *p;
	uint32 *p1,data1;
	int16 temp1;	

	p=&adtimer0[0];										
	*p++=T0TC;
	p1=&advalget1[0];
	data1=0x000000d0;//ch3														
	adcodewriteread1(p1,data1);
	*p++=T0TC;		

	//adrelay4us();
	*p++=T0TC;			
	IO0SET = ADCS_SET;
	p1=&advalget3[0];
	data1=0x000000a0;//ch2																																																																																																																					
    while ((IO0PIN&MAX_EOC)==0);
	adcodewriteread1(p1,data1);//CH3			

	//adrelay4us();
	IO0SET = ADCS_SET;
	p1=&advalget2[0];	
	data1=0x000000b0;//ch1																																																																																																																																							
    while ((IO0PIN&MAX_EOC)==0);
	adcodewriteread1(p1,data1);//CH2	

	//adrelay4us();		
	IO0SET = ADCS_SET;
	p1=&advalget1[0];
	data1=0x000000e0;//ch7																																														
    while ((IO0PIN&MAX_EOC)==0);
	adcodewriteread1(p1,data1);//CH1

	//adrelay4us();
	IO0SET = ADCS_SET;
	p1=&advalget7[0];
	data1=0x000000c0;//ch4																																																															
    while ((IO0PIN&MAX_EOC)==0);
	adcodewriteread1(p1,data1);//CH7

	//adrelay4us();		
	IO0SET = ADCS_SET;
	p1=&advalget4[0];
	data1=0x000000f0;//ch8																																																																																
    while ((IO0PIN&MAX_EOC)==0);
	adcodewriteread1(p1,data1);//CH4	
	
	//adrelay4us();
	IO0SET = ADCS_SET;
	p1=&advalget8[0];
	data1=0x00000090;//ch6																																																																																																			
    while ((IO0PIN&MAX_EOC)==0);
	adcodewriteread1(p1,data1);//CH8	
	
	//adrelay4us();
	IO0SET = ADCS_SET;
	p1=&advalget6[0];
	data1=0x00000080;//ch5																																																																																																																																																																																																																																																											
    while ((IO0PIN&MAX_EOC)==0);
	adcodewriteread1(p1,data1);//CH6
		
	//adrelay4us();
	IO0SET = ADCS_SET;
	p1=&advalget5[0];	
	data1=0x00000080;																																																																																																																																																						
    while ((IO0PIN&MAX_EOC)==0);
	adcodewriteread1(p1,data1);//CH5	
	*p++=T0TC;			
	
	IO0SET = ADCS_SET;

	p1=&advalget1[0];
	advaluetemp[0]=samplevalget(p1,wpd800_cfg.ChZero_Param.Ch0);//-0x4d;
	p1=&advalget2[0];
	advaluetemp[1]=samplevalget(p1,wpd800_cfg.ChZero_Param.Ch1);//-0x4d;	
	p1=&advalget3[0];
	advaluetemp[2]=samplevalget(p1,wpd800_cfg.ChZero_Param.Ch2);//-0x4d;	
	p1=&advalget4[0];
	advaluetemp[3]=samplevalget(p1,wpd800_cfg.ChZero_Param.Ch3);//-0x42;	
	p1=&advalget5[0];
	advaluetemp[4]=samplevalget(p1,wpd800_cfg.ChZero_Param.Ch4);//-0x46;	
	p1=&advalget6[0];
	advaluetemp[5]=samplevalget(p1,wpd800_cfg.ChZero_Param.Ch5);//-0x43;		
	p1=&advalget7[0];
	advaluetemp[6]=samplevalget(p1,wpd800_cfg.ChZero_Param.Ch6);//-0x53;		
	p1=&advalget8[0];
	advaluetemp[7]=samplevalget(p1,wpd800_cfg.ChZero_Param.Ch7);//-0x53;
	*p++=T0TC;			
					
//ia,ib,ic,i0,ua,ub,uc,u0,cia,cib,cic-->3ct 3ln i0 u0自产
//ia,ib,ic,i0,ua,ub,uc,u0,cia,cib,cic-->2ct 3ln i0外接 u0自产	
//ia,ib,ic,i0,uab,ubc,uca,u0,cia,cib,cic-->3ct 2ln i0自产 无u0	
//ia,ib,ic,i0,uab,ubc,uca,u0,cia,cib,cic-->2ct 2ln i0外接 无u0	

//0--UC,1--UB,2--UA,3--IA,4--IC,5--IB,6--CIA,7--CIC	
	switch(wpd800_cfg.Wpd_Param.bType)
	{
		case 2://C				
			advalue[adsampcnt][0] = advaluetemp[3];//Ia
			advalue[adsampcnt][2] = advaluetemp[4];//Ic
			temp1 = 0-advaluetemp[3];
			temp1 = temp1-advaluetemp[4];//-Ia-Ic
			advalue[adsampcnt][1] = temp1;//Ib=-Ia-Ic
			advalue[adsampcnt][3] =  advaluetemp[5];//I0				
			break;
		case 3://D				
			advalue[adsampcnt][0] = advaluetemp[3];//Ia
			advalue[adsampcnt][1] = advaluetemp[5];//Ib
			advalue[adsampcnt][2] = advaluetemp[4];//Ic
			advalue[adsampcnt][3] = advaluetemp[1];//I0
			break;			
		case 0://AB
		case 1:
		default:									
			advalue[adsampcnt][0] = advaluetemp[3];//Ia
			advalue[adsampcnt][1] = advaluetemp[5];//Ib
			advalue[adsampcnt][2] = advaluetemp[4];//Ic
			temp1 = advaluetemp[3];
			temp1 = temp1 + advaluetemp[5];			
			temp1 = temp1 + advaluetemp[4];			
			advalue[adsampcnt][3] = temp1;//I0				
			break;
/*
		case 1:
		case 2:				
			advalue[adsampcnt][0] = advaluetemp[3];//Ia
			advalue[adsampcnt][1] = advaluetemp[5];//Ib
			advalue[adsampcnt][2] = advaluetemp[4];//Ic
			advalue[adsampcnt][3] = advaluetemp[1];//I0
			break;
		case 0:
		default:						
			advalue[adsampcnt][0] = advaluetemp[3];//Ia
			temp1 = advaluetemp[3];
			advalue[adsampcnt][1] = advaluetemp[5];//Ib
			temp1 = temp1 + advaluetemp[5];
			advalue[adsampcnt][2] = advaluetemp[4];//Ic
			temp1 = temp1 + advaluetemp[4];			
			advalue[adsampcnt][3] = temp1;//I0				
			break;
*/
	}		
	switch(wpd800_cfg.Wpd_Param.bType)
	{
		case 1:						
		case 3:						
			advalue[adsampcnt][4] = advaluetemp[2];//Uab
			advalue[adsampcnt][5] = 0-advaluetemp[0];//Ubc=0-Ucb
			advalue[adsampcnt][6] = advaluetemp[0]-advaluetemp[2];//Uca
			advalue[adsampcnt][4]=_fsadvalue(wpd800_cfg.CL_Param.KPreciUAB,advalue[adsampcnt][4]);//Uab
			advalue[adsampcnt][5]=_fsadvalue(wpd800_cfg.CL_Param.KPreciUBC,advalue[adsampcnt][5]);//Ubc			
			advalue[adsampcnt][6]=_fsadvalue(wpd800_cfg.CL_Param.KPreciUCA,advalue[adsampcnt][6]);//Uca
			advalue[adsampcnt][7] = 0x0;//U0			
			break;
		case 0:
		case 2:						
		default:				
			advalue[adsampcnt][4] = advaluetemp[2];//Ua
			advalue[adsampcnt][5] = advaluetemp[1];//Ub
			advalue[adsampcnt][6] = advaluetemp[0];//Uc
			advalue[adsampcnt][4]=_fsadvalue(wpd800_cfg.CL_Param.KPreciUA,advalue[adsampcnt][4]);//Ua
			advalue[adsampcnt][5]=_fsadvalue(wpd800_cfg.CL_Param.KPreciUB,advalue[adsampcnt][5]);//Ub
			advalue[adsampcnt][6]=_fsadvalue(wpd800_cfg.CL_Param.KPreciUC,advalue[adsampcnt][6]);//Uc
			temp1=advalue[adsampcnt][4];
			temp1=temp1+advalue[adsampcnt][5];
			temp1=temp1+advalue[adsampcnt][6];			
			advalue[adsampcnt][7]=temp1;//U0			
			break;

/*
		case 1:						
		case 2:						
			temp1 = 0;			
			advalue[adsampcnt][4] = advaluetemp[2];//Uab
			temp2 = advaluetemp[2];//Uab
			temp3 = advaluetemp[0];//Ucb
			temp1 = temp1 - temp3;//Ubc
			advalue[adsampcnt][5] = temp1;//Ubc
			temp3 = temp3 - temp2;//Uca
			advalue[adsampcnt][6] = temp3;//Uca
			advalue[adsampcnt][7] = 0x0;//U0			

			advalue[adsampcnt][4]=_fsadvalue(wpd800_cfg.CL_Param.KLUABCLCALIB,advalue[adsampcnt][4]);//Ua
			advalue[adsampcnt][5]=_fsadvalue(wpd800_cfg.CL_Param.KLUBCCLCALIB,advalue[adsampcnt][5]);//Ua
			advalue[adsampcnt][6]=_fsadvalue(wpd800_cfg.CL_Param.KLUCACLCALIB,advalue[adsampcnt][6]);//Ua
			break;
		case 0:
		default:				
			temp1 = advaluetemp[2];//Ua
			temp2 = advaluetemp[1];//Ub
			temp3 = advaluetemp[0];//Uc
			//temp4 = temp1 + temp2 + temp3;
			advalue[adsampcnt][4] = temp1;//Ua
			advalue[adsampcnt][5] = temp2;//Ub
			advalue[adsampcnt][6] = temp3;//Uc
			//advalue[adsampcnt][7] = temp4;//U0			

			advalue[adsampcnt][4]=_fsadvalue(wpd800_cfg.CL_Param.KLUACLCALIB,advalue[adsampcnt][4]);//Ua
			advalue[adsampcnt][5]=_fsadvalue(wpd800_cfg.CL_Param.KLUBCLCALIB,advalue[adsampcnt][5]);//Ua
			advalue[adsampcnt][6]=_fsadvalue(wpd800_cfg.CL_Param.KLUCCLCALIB,advalue[adsampcnt][6]);//Ua
			temp1=advalue[adsampcnt][4];
			temp1=temp1+advalue[adsampcnt][5];
			temp1=temp1+advalue[adsampcnt][6];			
			advalue[adsampcnt][7]=temp1;//U0			
			break;
*/
	}					
	advalue[adsampcnt][8] = advaluetemp[6];//cIa
	advalue[adsampcnt][10] = advaluetemp[7];//cIc
	temp1 = 0-advaluetemp[6];		
	temp1=temp1-advaluetemp[7];//cIb=-cIa-cIc
	advalue[adsampcnt][9] = temp1;//cIb
	advalue[adsampcnt][8]=_fsadvalue(wpd800_cfg.CL_Param.KPreciIA,advalue[adsampcnt][8]);//cIa
	advalue[adsampcnt][9]=_fsadvalue(wpd800_cfg.CL_Param.KPreciIB,advalue[adsampcnt][9]);//cIb
	advalue[adsampcnt][10]=_fsadvalue(wpd800_cfg.CL_Param.KPreciIC,advalue[adsampcnt][10]);//cIc

	*p++=T0TC;		

	ftpointercnt = adsampcnt;
	freqpointercnt = adsampcnt;
	meapointercnt = adsampcnt;
	dfpointercnt = adsampcnt;
	adsampcnt++;
	adsampcnt &= adsampnum;   			
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -