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

📄 ad_drive.c

📁 基于c的电动机保护程序
💻 C
字号:
#include "hardware_intc.h"
#include "hardware_reg.h"
#include "AD_Drive.h"
#include "Fix_Dsp.h"
#include "nucleus.h"
#include "Mototype.h"
#include "modbusdef.h"

#define Pa_parameter IA_linerAdjust*UA_linerAdjust_I

extern NU_TASK _Modbus_Task;
extern void modebus_framdiv(void);
extern NU_TASK			GUI_TASK;
extern NU_HISR         _Errwav_Write2Flash;

extern float yxjtest2[100];
extern int yxjtestcal;

#define	size1	0.00122100122

//外部函数
extern void Timer_init(unsigned char index, unsigned long time);
extern void init_SPI(void);
extern unsigned short SPI_Transfer(unsigned short command);
VOID WatchDog_Timer_Expire(void);

//外部数据
extern Data_In			datalist[DATA_CALCULATE_SIZE];
extern int			 	readIndex;
extern int			 	writeIndex;
extern NU_HISR			PROTECT_TASK;
extern char Task_Suspended;
extern int Break_flag;
extern TJDTimingNode noAlarmT;
NU_SEMAPHORE   Semaphore;

//自定义数据
unsigned int 	ii,i1;
float 	data[100];
Data_In 		data_in;

struct _AD_data
{
	unsigned long IA,
				IB,
				IC,
				I0,
				Ua,
				Ub,
				Uc,
				VREF;
}AD_data;
unsigned int 	readTime = 0;

void init_ReadAD(void)
{
	SPI_Transfer(AD_START);
}

void readAD_Init(void)
{
	init_SPI();
	Timer_init(2, 75000);
	SPI_Transfer(AD_START);
}

void cleanTimerInt()
{
	volatile unsigned long clear_int;
	while(*(RP)(T2_IMSR) & 0x01){
		clear_int = *(RP)(T2_ISCR);
		clear_int = *(RP)(T_ISCR);
		WatchDog_Timer_Expire();
	}
	


}

void enableTimer()
{
	*(RP)(T2_CR) &= 0x06;
	*(RP)(T2_CR) |= 0x01;	
}


int AfterBrake_count;
int ErrRecWave_flag;
int AD_OK = 0;
void read_AD(void)
{	
	U32 AD_sample;
	int i;
	
	AD_OK = 0;
	init_SPI();
	//Timer_init(2, 75000);
	NOP();
	SPI_Transfer(AD_START);
//*(volatile unsigned long *)PORTA_DATA |= 0x10; 
	cleanTimerInt();
	//read process
	for (i = 0; i < 8; i++)
	{
		AD_sample = (SPI_Transfer(AD_READ) & 0xFFFF);
		switch ((AD_sample&0xF000) >> 12)
		{
			case 0:
				AD_data.IA = (AD_sample & 0xFFF);
				break;
			case 1:
				AD_data.IB = (AD_sample & 0xFFF);
				break;
			case 2:
				AD_data.IC = (AD_sample & 0xFFF);
				break;
			case 3:
				AD_data.Ua = (AD_sample & 0xFFF);
				break;
			case 4:
				AD_data.Ub = (AD_sample & 0xFFF);
				break;
			//data[i1 % 100] = AD_sample;
			case 5:
				AD_data.Uc = (AD_sample & 0xFFF);
				break;
			case 6:
				AD_data.I0 = (AD_sample & 0xFFF);
				break;
			//i1++; 
			case 7:
				AD_data.VREF = (AD_sample & 0xFFF);
				break;
			default :
				break;
		}
		//data[i1 % 100] = AD_data.IB - AD_data.VREF;
		
	}
	AD_Convert();
/*********************************************************/	
	//memcpy(&datalist[writeIndex].IA, &AD_data.IA, sizeof(Data_In)); /* 采集16通道同步输出     */ 
    writeIndex = (writeIndex + WRITE_INDEX_INCREASE) % DATA_CALCULATE_SIZE; 
    readTime++;
    if(readTime == READ_INDEX_INCREASE)
    {
        if(Task_Suspended == 1)
        {
        	NU_Activate_HISR(&PROTECT_TASK);
        	Task_Suspended = 0;
        	
		
        }
        else
        {
        	Task_Suspended = 1;             
        }
        if (readIndex >= DATA_CALCULATE_SIZE)      
        {
        	readIndex = readIndex % DATA_CALCULATE_SIZE;
        }
    	if ((readIndex - writeIndex - READ_INDEX_INCREASE < 0) && (writeIndex - readIndex <15))
        {
        	ii++;
        	readIndex = (writeIndex + 1 + READ_INDEX_INCREASE) % DATA_CALCULATE_SIZE;
        	/* used for test */
        	if(ii>99)
        	{
        		ii = 0;
        	}
        }
        //i1++;
        readTime = 0;	
    }	
    
	 modebus_framdiv();
   
  
    
    
  //  *(volatile unsigned long *)PORTA_DATA &= ~0x10; 
}





VOID WatchDog_Pulse(VOID)
{
	INT dog = 0;
	*(volatile unsigned long *)PORTA_DATA |= 0x10;      //pull high
	for(dog=1;dog<5;dog++);
	*(volatile unsigned long *)PORTA_DATA &= ~0x10;      //pull low
}

VOID WatchDog_Timer_Expire(void)
{
	static unsigned long WDG_Tick = 0;
	WDG_Tick++;
	if (WDG_Tick >= 600)
	{
		WatchDog_Pulse();
		WDG_Tick = 0;
	}
	//*(volatile unsigned long *)PORTH_DATA |= 0x20;
	///watch dog
}

double IA_Channel = 0;
double IB_Channel = 0;
double IC_Channel = 0;
double UA_Channel = 0;
double UB_Channel = 0;
double UC_Channel = 0;
double I0_Channel = 0;
int testerrwave = 0;
float Pa = 0;
float Pb = 0;
float Pc = 0;
float Pa_temp = 0;
float Pb_temp = 0;
float Pc_temp = 0;
int Power_cal = 0;
int eeee = 0;


void AD_Convert(void)
{

	IA_Channel = IA_AD_Channel;
 	IB_Channel = IB_AD_Channel;
	 IC_Channel = IC_AD_Channel;
	 UA_Channel = UA_AD_Channel;
	 UB_Channel = UB_AD_Channel;
	 UC_Channel = UC_AD_Channel;
	I0_Channel = I0_AD_Channel;
	data_in.IA = AD_data.IA * size1;
	data_in.IB = AD_data.IB * size1;
	data_in.IC = AD_data.IC * size1;
	data_in.Ua = AD_data.Ua * size1;
	data_in.Ub = AD_data.Ub * size1;
	data_in.Uc = AD_data.Uc * size1;
	data_in.I0 = AD_data.I0 * size1;
	data_in.VREF = AD_data.VREF * size1; 
   
    
	//datalist[writeIndex].IA = (data_in.IA - data_in.VREF)*1.05;
	
	//datalist[writeIndex].IB = (data_in.IB - data_in.VREF)*1.04;
	//datalist[writeIndex].IC = (data_in.IC - data_in.VREF)*1.04;
	/*
	#ifdef wujiao
	datalist[writeIndex].IA = (data_in.IA - data_in.VREF)*1.08;
	
	datalist[writeIndex].IB = (data_in.IB - data_in.VREF)*1.07;
	datalist[writeIndex].IC = (data_in.IC - data_in.VREF)*1.07;
	#else
	datalist[writeIndex].IA = (data_in.IA - data_in.VREF)*1.05;
	
	datalist[writeIndex].IB = (data_in.IB - data_in.VREF)*1.04;
	datalist[writeIndex].IC = (data_in.IC - data_in.VREF)*1.04;
	#endif
	datalist[writeIndex].Ua = data_in.Ua - data_in.VREF;
	datalist[writeIndex].Ub = data_in.Ub - data_in.VREF;
	datalist[writeIndex].Uc = data_in.Uc - data_in.VREF;
	datalist[writeIndex].I0 = (data_in.I0 - data_in.VREF)*1.04;
	datalist[writeIndex].VREF = data_in.VREF;
*/
	
	/*
	datalist[writeIndex].IA = (data_in.IA  )*IA_Channel;
	
	datalist[writeIndex].IB = (data_in.IB )*IB_Channel;
	datalist[writeIndex].IC = (data_in.IC )*IC_Channel;
	
	datalist[writeIndex].Ua = (data_in.Ua )*UA_Channel;
	datalist[writeIndex].Ub = (data_in.Ub )*UB_Channel;
	datalist[writeIndex].Uc = (data_in.Uc )*UC_Channel;
	datalist[writeIndex].I0 = (data_in.I0 )*I0_Channel;
	datalist[writeIndex].VREF = data_in.VREF;
	*/
	
	datalist[writeIndex].IA = data_in.IA  ;
	
	datalist[writeIndex].IB = data_in.IB ;
	datalist[writeIndex].IC = data_in.IC ;
	
	datalist[writeIndex].Ua = data_in.Ua ;
	datalist[writeIndex].Ub = data_in.Ub ;
	datalist[writeIndex].Uc = data_in.Uc ;
	datalist[writeIndex].I0 = data_in.I0 ;
	datalist[writeIndex].VREF = data_in.VREF;
	

	
	/*
	Pa_temp += (data_in.IA-data_in.VREF) *( data_in.Ua - data_in.VREF);	
	
	
	if(20==Power_cal)
	{
		
		//eeee = IA_linerAdjust*UA_linerAdjust_I;
		
		Pa = Pa_temp*Pa_parameter*0.05;
	
		Power_cal = 0;
		Pa_temp = 0;
		eeee++;
	}
	Power_cal++;
	  yxjtest2[eeee] = Pa;
      NOP();
     
      NOP();
      eeee %= 100;

*/
/*************************故障录波用数据*******************/	
	
	
	
	/*
	testerrwave++;
	datalist[writeIndex].Ua = 0.01+testerrwave;
	
	*/
	
	
	
	
	
	
	
	
	/*
	
	
	if(  !ErrRecWave_flag) //ErrRecWave_flag在录波函数最后清零 在跳闸函数里置位
	{
		Data_BackUp_Process( datalist[writeIndex] );
	}
	else
	{
		//在录波函数最后清零
		 AfterBrake_count++; //在录波函数最后清零
		
		if( AfterBrake_count < 40) //故障后再录两个周波  一共四个周波
		{
			Data_BackUp_Process( datalist[writeIndex] );
			
	  		
		
		}
		if( AfterBrake_count == 40)
		{
			NU_Activate_HISR(&_Errwav_Write2Flash);
		}		
	
	}
	
	
	
	*/
	
	
	




}

⌨️ 快捷键说明

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