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

📄 main.c

📁 ATmega128和ads7864实现ATP闭环控制
💻 C
字号:
//ICC-AVR application builder : 2007-10-30 15:43:17
#include "public.h"


#define Fy0 	61242
#define FyL 	60742
#define FyH 	61742

#define RadPer1MHz 	0.001

#define Rad0 	0.087266	//5度


//方程的系数

#define xishuA	4.9201506335
#define xishuB	-11.4057818550
#define xishuC	-4.9964661567

//const u8 ucHEX2BCD[3000][3];


u8 ucHex2BCD(u8 ucIn)//  十六进制转BCD
{
	u8 uctemp;

	uctemp=ucIn%10;
	uctemp=uctemp|(((ucIn%100)/10)<<4);

	return uctemp;

}
void HEX2BCD(u32 ulHex,u8* pucOutBuff)
{
	u8 uctemp;

	pucOutBuff[2]=ulHex%10;
	ulHex=ulHex/10;
	pucOutBuff[2]=pucOutBuff[2]|((ulHex%10)<<4);
	ulHex=ulHex/10;
	pucOutBuff[1]=ulHex%10;
	ulHex=ulHex/10;
	pucOutBuff[1]=pucOutBuff[1]|((ulHex%10)<<4);
	ulHex=ulHex/10;
	pucOutBuff[0]=ulHex%10;
	ulHex=ulHex/10;
	pucOutBuff[0]=pucOutBuff[0]|((ulHex%10)<<4);

}

//输出控制频率
//输入参数:	ulFX X轴频率,单位kHz
//		ulFY Y轴频率,单位kHz
void OutputFrequency(u32 ulFX,u32 ulFY)
{
	u8 ucFX[3],ucFY[3];
	if((ulFX<40000)||(ulFX>70000))	return;
	if((ulFY<40000)||(ulFY>70000))	return;
	
	HEX2BCD(ulFX,ucFX);
	HEX2BCD(ulFY,ucFY);


	


	DISABLEXOUT;
	DISABLEYOUT;

	SPISend(ucFX[0]);
	SPISend(ucFX[1]);
	SPISend(ucFX[2]);
	SPISend(ucFY[0]);
	SPISend(ucFY[1]);
	SPISend(ucFY[2]);

	ENABLEXOUT;
	ENABLEYOUT;
}


void OutputFrequency1(void)
{
	
	DISABLEXOUT;
	DISABLEYOUT;

	SPISend(0x06);
	SPISend(0x10);
	SPISend(0);
	SPISend(0);
	SPISend(0);
	SPISend(0);

	ENABLEXOUT;
	ENABLEYOUT;
}

void OutputFrequency2(void)
{

	DISABLEXOUT;
	DISABLEYOUT;

	SPISend(0x07);
	SPISend(0x00);
	SPISend(0x00);
	SPISend(0);
	SPISend(0);
	SPISend(0);

	ENABLEXOUT;
	ENABLEYOUT;
}





void OutputFrequency3(u8 ucFX)
{
	DISABLEXOUT;
	DISABLEYOUT;

	SPISend(0x06);
	SPISend(ucFX);
	SPISend(0);
	SPISend(0);
	SPISend(0);
	SPISend(0);

	ENABLEXOUT;
	ENABLEYOUT;
}


u32 ulGetFrequency(u32 ulNowF,double dNowRad2)
{
	double dNowF,dNextF;
	u32 ulNextF;
	
	dNowF=((double)ulNowF)/(double)1000000;

	dNextF=-1-xishuA*dNowF-xishuB*dNowRad2;
	dNextF=dNextF/xishuC;
	
	ulNextF=dNextF*1000000;
	return ulNextF;
}



void main(void)
{
	u32	i=0xFFFFFF;
	u16 j,k;
	u16 usADDATA[4];
	double dADDATA[4];
	double dEx,dEy;
	double dTotalData;

	double dEy1T,dEy2T,dEyTotal;

	double dDeltaRad,dRad2;

	double dFy;

	s32 slEy;
	
	u32 ulFX,ulFY;

	u8 ucFlag;


	u8 ucFX=99;


	SysInit();

	
	ulFX=45000;
	ulFY=Fy0;


	ulFY=61000;
	OutputFrequency(ulFY,ulFX);

	
	//ulFY=70000;
	//OutputFrequency3(ucFX);

/*
	ucFlag=0;
	while(1)
	{
		if(ucFlag)	
		{
			OutputFrequency2();
			ucFlag=0;
		}
		else						
		{
			OutputFrequency1();
			ucFlag=1;
		}
		delayus(200);
		delayus(100);
		//delayus(200);
		//delayus(200);
		//delayus(200);
		//delayus(200);
		//delayms(10);
	}
	*/
	delayms(10);

	
	while(1)
	{
		NOP();
		delayms(3);
		usAD_GetData(usADDATA);
		//dADDATA[0]=(double)usADDATA[0];
		//dADDATA[1]=(double)usADDATA[1];
		//dADDATA[2]=(double)usADDATA[2];
		//dADDATA[3]=(double)usADDATA[3];
		//dTotalData=dADDATA[QDA]+dADDATA[QDB]+dADDATA[QDC]+dADDATA[QDD];
		

		//dEx=(dADDATA[QDA]+dADDATA[QDD]-dADDATA[QDB]-dADDATA[QDC])/dTotalData;
		//dEy=(dADDATA[QDA]+dADDATA[QDB]-dADDATA[QDC]-dADDATA[QDD])/dTotalData;

		slEy=usADDATA[QDA];
		slEy=slEy+usADDATA[QDB];
		slEy=slEy-usADDATA[QDC];
		slEy=slEy-usADDATA[QDD];
		
		if(slEy!=0)
		{
			if(slEy>0) 	
			{	
				ulFY=ulFY+100;
				if(ulFY>70000)	ulFY=70000;
			}
			else 		
			{	
				ulFY=ulFY-100;
				if(ulFY<40000)	ulFY=40000;
			}
			OutputFrequency(ulFY,ulFX);
		}
		
		NOP();
		NOP();
	}


	while(1)
	{
		usAD_GetData(usADDATA);
		if(usADDATA[QDD]>0x6FFF)	
			ucFX=ucFX+1;
		else		//if(usADDATA[QDD]<10)					
			ucFX=ucFX-1;
		delayms(3);
		OutputFrequency3(ucHex2BCD(ucFX));

	}


	
	while(1)
	{
		usAD_GetData(usADDATA);
		if(usADDATA[QDD]>100)	
			OutputFrequency2();
		else		if(usADDATA[QDD]<10)					
			OutputFrequency1();
		//delayms(3);

	}




	while(1)
	{
		OutputFrequency1();
		delay(0xFF);
		delay(0xFF);
		OutputFrequency2();
		delay(0xFF);
		delay(0xFF);
	}






	
	dEy1T=0;
	dEy2T=0;
	for(i=0;i<1000;i++)
	{
		ulFY=60500;
		OutputFrequency(ulFY,ulFX);
		delayms(10);
		usAD_GetData(usADDATA);
		dADDATA[0]=(double)usADDATA[0];
		dADDATA[1]=(double)usADDATA[1];
		dADDATA[2]=(double)usADDATA[2];
		dADDATA[3]=(double)usADDATA[3];
		dTotalData=dADDATA[QDA]+dADDATA[QDB]+dADDATA[QDC]+dADDATA[QDD];
		

		//dEx=(dADDATA[QDA]+dADDATA[QDD]-dADDATA[QDB]-dADDATA[QDC])/dTotalData;
		dEy=(dADDATA[QDA]+dADDATA[QDB]-dADDATA[QDC]-dADDATA[QDD])/dTotalData;
		dEy1T=dEy1T+dEy;

		ulFY=61500;
		OutputFrequency(ulFY,ulFX);
		delayms(10);
		usAD_GetData(usADDATA);
		dADDATA[0]=(double)usADDATA[0];
		dADDATA[1]=(double)usADDATA[1];
		dADDATA[2]=(double)usADDATA[2];
		dADDATA[3]=(double)usADDATA[3];
		dTotalData=dADDATA[QDA]+dADDATA[QDB]+dADDATA[QDC]+dADDATA[QDD];
		

		//dEx=(dADDATA[QDA]+dADDATA[QDD]-dADDATA[QDB]-dADDATA[QDC])/dTotalData;
		dEy=(dADDATA[QDA]+dADDATA[QDB]-dADDATA[QDC]-dADDATA[QDD])/dTotalData;
		dEy2T=dEy2T+dEy;
	}

	NOP();
	dEy1T=dEy1T/1000;
	dEy2T=dEy2T/1000;
	NOP();
	NOP();
	dEx=(dEy1T+dEy2T);
	dEyTotal=(dEy1T-dEy2T);
	NOP();
	NOP();


	ulFY=Fy0;
	OutputFrequency(ulFY,ulFX);
	while(1)
	for(i=0;i<1000;i++)
	{
		delayms(10);
		usAD_GetData(usADDATA);
		dADDATA[0]=(double)usADDATA[0];
		dADDATA[1]=(double)usADDATA[1];
		dADDATA[2]=(double)usADDATA[2];
		dADDATA[3]=(double)usADDATA[3];
		dTotalData=dADDATA[QDA]+dADDATA[QDB]+dADDATA[QDC]+dADDATA[QDD];
		
		dEy=(dADDATA[QDA]+dADDATA[QDB]-dADDATA[QDC]-dADDATA[QDD])/dTotalData;

		dDeltaRad=(dEy*RadPer1MHz)/dEyTotal;//偏移的弧度

		dRad2=Rad0-dDeltaRad;
		ulFY=ulGetFrequency(ulFY,dRad2);
		OutputFrequency(ulFY,ulFX);
	}

	while(1)
		NOP();
	


	

	while(1)
	{
		NOP();
		//ulAD_GetData(ulADDATA);
		usAD_GetData(usADDATA);
		dADDATA[0]=(double)usADDATA[0];
		dADDATA[1]=(double)usADDATA[1];
		dADDATA[2]=(double)usADDATA[2];
		dADDATA[3]=(double)usADDATA[3];
		dTotalData=dADDATA[QDA]+dADDATA[QDB]+dADDATA[QDC]+dADDATA[QDD];
		

		dEx=(dADDATA[QDA]+dADDATA[QDD]-dADDATA[QDB]-dADDATA[QDC])/dTotalData;
		dEy=(dADDATA[QDA]+dADDATA[QDB]-dADDATA[QDC]-dADDATA[QDD])/dTotalData;

		
		if(dEy!=0)
		{
			if(dEy>0) 	
			{	
				if(ulFY<70000)	ulFY=ulFY+100;
			}
			else 		
			{	
				if(ulFY>40000)	ulFY=ulFY-100;
			}
		//	OutputFrequency(ulFY,ulFX);
		}
		
		NOP();
		NOP();
	}


	while(1)
		NOP();
}


⌨️ 快捷键说明

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