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

📄 main.c

📁 基于AVR的一种程序,智能控制器,可用于低压无功补偿部分,
💻 C
📖 第 1 页 / 共 2 页
字号:
#include		"LF2407.H"
#include		"public.h"
#include		"main.H"
#include 		"math.h"
#include	    "string.h"
#include 		"stdlib.h"


void	inline	Disable(void)
{
	asm(" setc	INTM ");	
}				

void	inline	Enable(void)
{
	 asm(" clrc  INTM ");	 
}

void interrupt nothing(void)
{
	Enable();
	return;
}

/*高优先级有ADC中断*/
void interrupt c_int1(void)
{
	uint i;		
	if(*PIVR==0X04)
		{
		  asm(" clrc  SXM ");               /*抑制符号扩展*/		     
		    
		   Enable();
		              			         			         			         			
			samp0[samp]=*RESULT0>>6;							
			
			samp1[samp]=*RESULT1>>6;					
			
			samp2[samp]=*RESULT2>>6;			
			
			samp3[samp]=*RESULT3>>6;			
			
			samp4[samp]=*RESULT4>>6;			
			
			samp5[samp]=*RESULT5>>6;		
			
			pin_count++;                         /*频率计数器*/		
			time_count++;	                       	
			samp++;
			if(samp>35)
				{
					samp=0;						
					memcpy(&samp6,&samp0,0x24);
					memcpy(&samp7,&samp1,0x24);
					memcpy(&samp8,&samp2,0x24);
					memcpy(&samp9,&samp3,0x24);
					memcpy(&samp10,&samp4,0x24);
					memcpy(&samp11,&samp5,0x24);
					for(i=0;i<4;i++)
					{
						if(tou_flag[i]==1)
							{
								tq_time[i]++;
								if(tq_time[i]>SET_T*50)
									{
										dongzuo[i]=1;
										tq_time[i]=0;
									}		
							}	
						if(qie_flag[i]==1)
							{
								q_time[i]++;
								if(q_time[i]>SET_T*50)
								    {
								        dzuo_q[i]=1;
								        q_time[i]=0;
								    }		
							}						
					}
					if(led_flag==1)
					    led_count++;
					if(led_count>1500)
					   {
					     led_count=0;
					     led_flag=0;
					   }
				}
			
			*ADCTRL2=*ADCTRL2|0x4200;
			*ADCTRL2=*ADCTRL2&0X0BFFF;	        		
		}		
	*IFR=*IFR|0X001;
	*EVAIFRB=*EVAIFRB|0X0FFFF;
	Enable();
}i

/*中断2*/
void interrupt c_int2(void)
{
  *EVAIFRA=*EVAIFRA|0X0FFFF;
  *IFR=*IFR&0X002;	
  Enable();
  return;
}

/*低优先级的外部中断1,用于测频模块*/
void interrupt c_int6(void)
{   
  if(*PIVR==0X01)
   {  			
   	Enable();
   	if(pin_count>40)pin_count=0;
   	if(pin_count>30&&pin_count<40)
   		{	
  	    pin_lv1=pin_lv2;		
	      pin_lv2=*T2CNT;
	      pin_lv=pin_count;
	      pin_count=0;		
	    }
	*XINT1CR=0X8007;
   }	
  *IFR=*IFR&0X020;   
}

/*低优先级的串口中断,*PIVR=6为串口接收,*PIVR=7为串口发送*/
void interrupt uarttr()
{
	switch(*PIVR)
	{
		case 6: 
			receive[rece_count++]=*SCIRXBUF;
			if(rece_count>999)rece_count=0;
			rece_flag=1;
			*IFR=0X10;
			Enable();			
			break;	
		default:break;
	}
}

//初始化模块
void  Initial(void)
{
	 uint temp;		
	 asm(" setc 	INTM ");
	 asm(" clrc		OVM ");
	 asm(" clrc		CNF ");
	 *SCSR1=0x80fe;         /* clk=10M*4;  cpuclk=40M */	 
	 *WDCR=0x0e8;
	 
	 WSGR=0x6DB;
	 
/********************************************************/
   /* 定时器一,周期中断; */
   /* 定时器556us周期中断   初始化 */
   /* 中断2;中断向量为0x27; */
   /* 每周波采样36点; 36*556us=20MS */   
/********************************************************/

    *EVAIFRA = 0xFFFF;
    *EVAIFRB = 0xFFFF;
    *EVAIMRA = 0x0000;          /*T1周期中断使能*/  
    *EVAIMRB = 0x0001;   
 		 
 		*GPTCONA=0X0400;        /*周期中断标志来启动AD转换*/		        
 		*T2PER = 0x56C;         /*20000us/36=555.55us中断一次;555.55*(40/16)=1388=0X56C;22222*25ns;*/	 		
 		*T2CNT = 0; 
 		*T2CON = 0x144c;        /*定时器1连续增记数模式;时钟/16;*/  
/*********************************************************/
/*测量频率 外中断一次;*/
/*********************************************************/ 			
     *XINT1CR=0X8007;  
/********************************************************/
/*i/o口 初始化 */
/********************************************************/
		*MCRA=*MCRA&0X0F0FF;
		*PBDATDIR=*PBDATDIR&0X0F0F0;    /*按键*/  		
/********************************************************/
 /*时钟初始化;*/ 
/********************************************************/
	//	*MCRA=*MCRA&0x1fff;
	//  *PBDATDIR=*PBDATDIR|0x0e0c0; /* iopb6=clk; iopb7=i/o;  scl sda=1;*/
		*MCRA=*MCRA&0x0fff;
	  *PBDATDIR=*PBDATDIR|0x0f0c0; /* iopb6=clk; iopb7=i/o;  scl sda=1;*/
/********************************************************/
 /*电容出口初始化;*/ 
/********************************************************/
		*MCRC=*MCRC&0x0f000;
		*PEDATDIR=0X0ff00;    
		*PFDATDIR=0X0f00;    
		//*MCRC=*MCRC&0X0fffe;
	  //*PEDATDIR=*PEDATDIR|0X101;    
	  
/********************************************************/
 /*ad中断初始化;*/ 
/********************************************************/       

/********************************************************/
/* data flash 存储数据初始化; */ 
/********************************************************/
	
	*SPICCR=0X0047;
	*SPICTL=0X0006;
	*SPIBRR=0X0009;
	*MCRB=0X001C;
	*PCDATDIR=*PCDATDIR|0X2020;	     /*IOPC5为输出方式;即SPISTE;*/
	*SPICCR=*SPICCR|0X0080;
	*SPIPRI=0x0030;
	*SPITXBUF=0x5500;
	while((*SPISTS&0x0040)==0);
    temp=*SPIRXBUF;
/********************************************************/		 
/* 串行口初始化 */
/********************************************************/		 
	*SCICCR=0x7;                /* 8bit no even/odd */
	*SCICTL1=0x13; 
	*SCICTL2=0X02;	             
	*SCIHBAUD=0X2;
	*SCILBAUD=0X08;              /* 9600bps */
	*SCICTL1=0X33;
	*SCIPRI=0X60;
	*MCRA|=0X03;	

/********************************************************/		 
  *IMR=0x31;            /* 开中断2; 开中断1;*/
	*IFR=0xffff;	
/********************************************************/		 
}
//AD初始化函数
void	Ad_Init(void)
{
	
/*	*ADCTRL1=0x280;             /*匹配阻抗为1K; 启动/停止模式;*/
	*ADCTRL1=0X0;		
	*ADCTRL2=*ADCTRL2|0x500;	
	*MAXCONV=0x05;
	*CHSELSEQ1=0x3210;
	*CHSELSEQ2=0x54;
	*CHSELSEQ3=0x0;
	*CHSELSEQ4=0x0;	
	
}

//变量初始化
void Soft_Init(void)
{		
	memset(&samp0,0,0x1b0);
	memset(&u_abc,0,0x258);
  memset(f_abc,5000,0x14);     
  
  memset(&up1_data.avr_u[0],0,19);     
  memset(&up2_data.avr_xb[0][0],0,102);     
  memset(&up3_data.set_shuju[0],0,19);     
  memset(&up4_data.tj_shuju[0],0,160);   
        
  rece_count=0;
  serial_count=0;
  rece_flag=0;  
  
  p_key=0;
	p_mode=0;
	p_screen=0X0FF;
	enter_flag=0;       /*修改参数确认键标志*/
	screen_flag=0;
	
}
//计算频率函数
uint js_f(void)
{
	ulong value1;
	uint f,temp_per;
	temp_per=*T2PER;
	value1=0;
	value1=(pin_lv-1)*400;
	value1*=(temp_per+1);	
	value1+=(temp_per+pin_lv2+1-pin_lv1)*400;
	value1/=1000;
	f=100000000/value1;		
	return(f);	
}

//计算电压电流
void Mea_Pq(int *addr1,int *addr2,uint abc)
{
	float temp_ur,temp_ui,temp_ir,temp_ii;
	float bianbi[6];	
	uint i;
	temp_ur=0;
	temp_ui=0;
	temp_ir=0;
	temp_ii=0;
	for(i=0;i<6;i++)
	{
		if(bl_xishu[i]>1100||bl_xishu[i]<900)bl_xishu[i]=1000;
		bianbi[i]=bl_xishu[i];		
		bianbi[i]/=1000;		
	}	
	
	for(i=0;i<36;i++)
	{
		temp_ur+=*(addr1+i)*cs0[i];
		temp_ui+=*(addr1+i)*cs1[i];
	}
	temp_ur/=FOUR_D;
	temp_ui/=FOUR_D;	
	temp_ur*=ui_xishu;
	temp_ui*=ui_xishu;
	temp_ur*=bianbi[abc];
	temp_ui*=bianbi[abc];
	u_abc[abc][mea_count]=sqrt(temp_ur*temp_ur+temp_ui*temp_ui);
	
	for(i=0;i<36;i++)
	{
		temp_ir+=*(addr2+i)*cs0[i];
		temp_ii+=*(addr2+i)*cs1[i];
	}
	temp_ir/=FOUR_D;
	temp_ii/=FOUR_D;	
	temp_ir*=ci_xishu;
	temp_ii*=ci_xishu;
	temp_ir*=bianbi[abc+3];
	temp_ii*=bianbi[abc+3];
//	i_abc[abc][mea_count]=sqrt(temp_ir*temp_ir+temp_ii*temp_ii)*ct_array[SET_CT]/5;
	i_abc[abc][mea_count]=sqrt(temp_ir*temp_ir+temp_ii*temp_ii);
	//if(i_abc[abc][mea_count]<0.03)i_abc[abc][mea_count]=0;                  /*30MA*/
//		else i_abc[abc][mea_count]=i_abc[abc][mea_count]*ct_array[SET_CT]/5;
		
	p_abc[abc][mea_count]=(temp_ur*temp_ir+temp_ui*temp_ii)*ct_array[SET_CT]/500;
	q_abc[abc][mea_count]=(temp_ui*temp_ir-temp_ur*temp_ii)*ct_array[SET_CT]/500;
	
	c_abc[abc][mea_count]=p_abc[abc][mea_count]/sqrt((p_abc[abc][mea_count]*p_abc[abc][mea_count]+q_abc[abc][mea_count]*q_abc[abc][mea_count]));
		
}
//计算谐波FFT
float Xiebo_Fft(int * PP,uint i)
{
	float Valr,Vali,Max,Min,Value;

⌨️ 快捷键说明

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