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

📄 main.c

📁 基于陀螺仪原理的惯性导航程序 用于测量量角速度
💻 C
字号:
/**********************************************************************************************
main.c file
作者:lig
建立日期:2006-4-25
修改日期:2006-4-25
版本:V1.0
**********************************************************************************************/


#include <ADuC7020.H>
#include "my_type.h"
#include "LED.H"
#include "interrupt.h"
#include "Timer.h"
#include "UART.H"
#include "ADC.h"
#include "others.h"
#include "math.h"
#include "slave.h"



/*********************************************************************************************/
////////////////////////////////////////////////
extern	uint8 pdata;
extern  uint8 pmax;
extern  uint8 pmin;
extern  uint16 datas[6];
////////////////////////////
uint16  AD_value[3];	  //最近的3次AD采样值

uint16  A_value[2];
uint16  A_S_value[2][32];

sint32  Z_w_value;
double  Z_w_result;  //固定坐标系下角度
uint8   temp1;
uint16 count1=0;//test

unsigned char Z_Hbit,Z_Lbit,Z_Sbit;//Z 的高位 低位 符号位
int ZERO_V=4523; //若度数向下飘,增大ZERO_V
unsigned char zus=0;
unsigned int x,z_time=0;
sint32 z_temp,z_temp1;
////////////////////////////////////////////////
void demarcate(unsigned char flag_demarcate)
{
	unsigned char z_i = 4,z_j = 5;
//	sint32 		  z_max_error[11],z_w_value_min,z_w_value_max;

	if(!flag_demarcate)
	{
		x = 0;
	}
	else
	{
		x = 51;
	}
	z_temp = 0;
	zus=0;
	z_time=0;
	count1=0;
	temp1=0;
	do
	{
		do
		{
			if(zus)
	   	   {
				z_temp=z_temp+Z_w_value ;	
				z_time++;
				zus = 0;		
			}



		}while(z_time<z_i);

		z_temp=z_temp/z_i;
		if(x<50)
		{
			ZERO_V=ZERO_V-(int)((z_temp1-z_temp)/z_j);
		}
		else
		{
			if((z_temp-30)>z_temp1)
			{
				ZERO_V++;
			}
			if((z_temp+30)<z_temp1)
			{
				ZERO_V--;
			}
		}
		z_temp1 = z_temp;
		z_temp = 0;
		z_time = 0;	
		x++;
//			print_Z_w();
		if(x>30)
		{	
			z_i=7;
			z_j=30;
		}
		if(x>50)
		{
			z_i=150;
		}

	}
	while(x<(57+6*flag_demarcate))	;
	


}

void SysClkInit(void)
{
	 PLLKEY1=0xAA;
	 PLLCON=0x01;   //PLL配置  
	 PLLKEY2=0x55;
	 POWKEY1=0x01;
	 POWCON=0x00;  //CPU时钟配置为41.78MHz
	 POWKEY2=0xF4;
// while(!(PLLSTA & 0x01));
}

///////////////////////////////////////////////////////////////////////////////////////////////


/*********************************************************************************************/
void FIQ_Handler(void) __fiq   //FIQ中断服务程序
{ 
	int i=0;
  	WatchDog();

	if(FIQSTA & TIMER0)	   //读取FIQ中断状态,判断FIQ中断源
	{                        //Timer0中断	   1/128秒
		T0CLRI=0;                //清Timer0中断
		AD_value[0]=AD_value[1];
		AD_value[1]=AD_value[2];

	    AD_value[2]=read_ADC(2); //根据通道号读ADC的值
		AD_value[2]=szlb(AD_value[2]);  //滤波
		WatchDog();
///////////////////////////////////////积分//////////////////////////////////////////////////////

		if(count1==3)																					 
		{  
		   Z_w_value=Z_w_value+(AD_value[2]+AD_value[0]-ZERO_V);//3310			   //注意RS150 零点不一定是2.5V
	//	   Z_w_result=(Z_w_value>>8)*0.122;   //变换为度	2.5V*1000/(5mV*4096)  RS300 clockwise 为正  
	//	   Z_w_result=Z_w_value*0.00095/2.0;	   //0.122/128         			   // RS300
		   Z_w_result=-Z_w_value*0.00152;	//19-38 ->128Hz //	152->32Hz		 2.5*1000/(128*2*12.5mv*4096)  RS150	   du
		 count1=0;
		 zus++;
		 }
		else
		 {count1++;}

	return;
  	}
    if(FIQSTA & UART)    
	{ 	
/*	   temp1=COMRX;
	   if(temp1=='o')
	   {
	   send_a_byte('o');
	   }
	   else{send_a_byte('a');} 
	   */
	   ON_LED42();
	   UART_R_ISR();
	   return;
	 }
	if(FIQSTA & TIMER3)	   //读取IRQ中断状态,判断IRQ中断源
	  {						   //Timer3中断
	   double temp;
	   temp=Z_w_result;       // Watchdog interrupt allows saving...
							   //... data before reset if necessary
	   T3CLRI=0;
	   T3LD = 0x1000;		// 0x1000/32768 = 125ms
	
	   RSTSTA = 0x4;	       	// Software reset 
	   Z_w_result=temp;
	   return;
	  }
  
}
///////////////////////////////////////////////////////////////////////////////////////////////


union 
{
 uint32 TimeData;
 time_type Time;
}RealTime;
 
 
void main(void)
{

	 uint8 i,j;
	///////////////数据初始化/////////////////////////
	 uint16  temp;
 	 Z_COMMUNI_INIT();
//	 Z_COMMUNI_INIT

	 pdata=0;
	 pmax=0;
	 pmin=0;
	 for(i=0;i<6;i++)
	   {datas[i]=1927;}
	 for(i=0;i<3;i++)
	   { AD_value[i]=1927; }
	 
	  Z_w_value=-90/0.00152;  
	  Z_w_result=0;	 //固定坐标系下位移
	  temp1=0;
	  z_temp= Z_w_value;
	  ////////////////////
	   A_value[0]=A_value[1]= 2096;
	   for(i=0;i<2;i++)
	      for(j=0;j<30;j++)
	  		 {A_S_value[i][j]= 2096;}
	  ////////////////////
	////////////////////////////////////////////////////
	 SysClkInit();
	  EN_TXD();
	  EN_LED42();
	  OFF_TXD();
	  OFF_LED42();
	 cls();
	 ADC_init();
	
	 WatchDog();

	 Timer0Init();
	 Timer3Init();
     UART_init();
 	 
// 	 init();	 
	 WatchDog();
	  print_Z_w();
//	 send_a_byte('b');
//	 send_a_byte('c');
//	 send_a_byte('d');
 ON_LED42();
zus=0;

//ON_TXD();
//while(1)
//{
//Z_TXD(0xdd);
//}
//自动标定
demarcate(0);
	 
//Delay_X_ms(1000);
  
 z_time = 0;



	 Z_w_value=-90/0.00152; 
	 ON_LED42();
//自动标定完后闪烁	
	 zus=0;
   do{
		 ON_LED42();
		 for(z_time=0;z_time<65000;z_time++)
		 {
		 ;
		 }
		 OFF_LED42();
		 for(z_time=0;z_time<65000;z_time++)
		 {
		 ;
		 }
		 zus++;
	 }while(zus<30);
//	 ON_TXD();
//	   print_Z_w();
 //***********************************
 //	 Z_COMMUNI_INIT();
//	 while(1);
	 while(1)
	 {

	  //  ON_TXD();
	    
/*		 if (z_temp>Z_w_value)
		  {
		 	 ZERO_V--;
		  }
		  else
		  {
		  	 ZERO_V++;
		  }
		  z_temp=Z_w_value ;
		
 */
 		z_flag_newins = Z_GETYOU();
		if(z_flag_newins)	//								//接收中断,处理
		{	
			int z_tempangle=0;
		//	Z_TXD(flag_pri_tim);
		//	Z_TXD(bigp[flag_pri_tim].instruction);
		   switch(bigp[flag_pri_tim].instruction)
		   {
		   		case 2:
				{
				//	ON_TXD();
					z_tempangle=bigp[flag_pri_tim].x[1]<<8;
					z_tempangle=z_tempangle+bigp[flag_pri_tim].x[2];

					Z_w_value=-z_tempangle/0.00152;					
				}
				break;
				case 3:
				{
			//	print_Z_w();
					ZERO_V++;
				//	OFF_TXD();
				}
				break;
				case 4:
				{
					ZERO_V--;
				//	OFF_TXD();
				}
				break;
				case 5:
				{
					demarcate(1);
				}
				break;
		   }
		}
 /*
		if(z_flag_newins==1)
		{  
		   int z_tempangle=0;
		   switch(z_instruction)
		   {
		   		case 2:
				{
					z_tempangle=z_global_receive_data.dat[0]<<8;
					z_tempangle=z_tempangle+z_global_receive_data.dat[1];
					Z_w_value=z_tempangle/0.00152;
					OFF_TXD();
				}
				
		   }
		
		}
*/
        temp=((int)(Z_w_result));
	    Z_Hbit=temp>>8;
		Z_Lbit=temp & 0x00ff;

		z_global_send_bufn[1].head=0x02;
		z_global_send_bufn[1].dat[0]= Z_Lbit;
		z_global_send_bufn[1].dat[1]= Z_Hbit;
//		z_global_send_buf[1].dat[2]= Z_Sbit;
//		z_global_send_buf[1].dat[3]= 0;
	  WatchDog();
	  print_Z_w();	//调试W值
//      A_value[0]=read_ADC(0);
//	  A_value[1]=read_ADC(1);
//	  OFF_LED42(); 
	  Delay_X_ms(1000);//0.25S		 //	调试W时要调整倒1000
  	}
}
///////////////////////////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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