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

📄 zzj.c

📁 TMS320F2812 的 CAN 总线程序 变速箱电液换档程序的一个实例 当然还需要完善
💻 C
字号:
/************************************************************************************
	版权(c) 	2003-		北京合众达电子技术有限责任公司			                *
*  	设计者:	戴展波	
*************************************************************************************/
#include "DSP28_Device.h"

int32 i = 0;
Uint32 PI_GearOutSpeed=0;
int KDState = 0; 
int OldGPIOB11 = 1;
int INTCount = 0;
int CurrentGear = 3;  
int EngineSpeed = 0,ThrottlePosition = 0,LoadPercent = 0,WaterTemp = 0;   
float OilPressure = 0,SystemVolt = 0,TravelSpeed = 0,OilPress = 0; 
//int PowerSelect=0, ShiftGearMode = 0; 
//float WorkDevicePress = 0, HydroSystemPress = 0; 
//float ShiftValveAlarm= 0, BrakePress = 0,
float TransmitionPress = 0,TQConvertorPress=0; 
//int FuelPercent = 0,TQConvertorTemp = 0; 
float a1[16],vol,resistance,tmp;   
Uint32 Count1,Count2;  
void GearOut(void);
void KD(void);
void cansend(void);
void canreceive(void);
void AICal(void);

void main(void)
{

	/*初始化系统*/
	InitSysCtrl();

	/*关中断*/
	DINT;
	IER = 0x0000;
	IFR = 0x0000;
	
	/*初始化PIE*/
	InitPieCtrl();

	/*初始化PIE中断矢量表*/
	InitPieVectTable();	
	
	/*初始化外设*/
    InitPeripherals();
 	
	/*设置CAN中断服务程序入口地址*/
	EALLOW;	
	//PieVectTable.ECAN0INTA = &ECAN0INTA_ISR;
	//PieVectTable.ECAN1INTA = &ECAN1INTA_ISR;   
	PieVectTable.CAPINT4 =  &CAPINT4_ISR;   
	//PieVectTable.ADCINT = &ADCINT_ISR;
	EDIS;  
	
    /*开中断*/
	//IER |= M_INT5;
	IER |= (M_INT9|M_INT5|M_INT1);
	EINT;   // Enable Global interrupt INTM
	ERTM;	// Enable Global realtime interrupt DBGM
       
	/*while(AdcRegs.ADC_ST_FLAG.bit.SEQ1_BSY==0)
	{			

		AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;

	}*/       
	for(;;)
	{
		KickDog();	
		GearOut();
		/*for(i= 0; i< 100000; i++){} 
		for(i= 0; i< 100000; i++){} 
		for(i= 0; i< 100000; i++){} 
		for(i= 0; i< 100000; i++){} 
		for(i= 0; i< 100000; i++){}*/ 
		AICal();
	   	cansend();
		canreceive(); 
		
	};
} 	


void KD(void)
{
	//注取消KD状态,挡位由前进2挡变化到其它挡位,再次按下KD键,挡位由前进变为后退
	if((GpioDataRegs.GPADAT.bit.GPIOA14 == 0) && (GpioDataRegs.GPBDAT.bit.GPIOB9 == 1) && (GpioDataRegs.GPBDAT.bit.GPIOB10 == 1)) 
	{
		if((OldGPIOB11 == 1) && (GpioDataRegs.GPBDAT.bit.GPIOB11 == 0))
		{
			if(KDState == 0)	
				KDState = 1;
			else
				KDState = 0;
		}
	}
	
	OldGPIOB11 = GpioDataRegs.GPBDAT.bit.GPIOB11;
	
	if(KDState == 1)
	{
		if(!((GpioDataRegs.GPADAT.bit.GPIOA14 == 0) && (GpioDataRegs.GPBDAT.bit.GPIOB9 == 1) && (GpioDataRegs.GPBDAT.bit.GPIOB10 == 1)))
			KDState = 0;
	}
}

void GearOut(void)
{
	//GPIOA13 mid
	//GPIOA14 fore
	//GPIOA15 back
	//GPIOB9  A
	//GPIOB10 B
	//GPIOB11 KD
	
	//GPIOA0 MV
	//GPIOA1 MR
	//GPIOA2 M1
	//GPIOB0 M2
	//GPIOB1 M4
		
	//判断KD状态
	KD();	
	
	//中位
	if(GpioDataRegs.GPADAT.bit.GPIOA13 == 0)
	{
		GpioDataRegs.GPADAT.bit.GPIOA0 = 1;//MV
		GpioDataRegs.GPADAT.bit.GPIOA1 = 1;//MR
		GpioDataRegs.GPADAT.bit.GPIOA2 = 1;//M1
		GpioDataRegs.GPBDAT.bit.GPIOB0 = 1;//M2
		GpioDataRegs.GPBDAT.bit.GPIOB1 = 1;//M4
		CurrentGear = 3;
	}
	else if(GpioDataRegs.GPADAT.bit.GPIOA14 == 0)
	{
		//前进1挡
		if(((GpioDataRegs.GPBDAT.bit.GPIOB9 == 0) && (GpioDataRegs.GPBDAT.bit.GPIOB10 == 1)) || ((GpioDataRegs.GPBDAT.bit.GPIOB9 == 1) && (GpioDataRegs.GPBDAT.bit.GPIOB10 == 1) && (KDState == 1)))
		{
			GpioDataRegs.GPADAT.bit.GPIOA0 = 0;
			GpioDataRegs.GPADAT.bit.GPIOA1 = 1;
			GpioDataRegs.GPADAT.bit.GPIOA2 = 0;
			GpioDataRegs.GPBDAT.bit.GPIOB0 = 1;
			GpioDataRegs.GPBDAT.bit.GPIOB1 = 1;
			CurrentGear = 4;
		}	
		//前进2挡
		else if((GpioDataRegs.GPBDAT.bit.GPIOB9 == 1) && (GpioDataRegs.GPBDAT.bit.GPIOB10 == 1))
		{
			GpioDataRegs.GPADAT.bit.GPIOA0 = 0;
			GpioDataRegs.GPADAT.bit.GPIOA1 = 1;
			GpioDataRegs.GPADAT.bit.GPIOA2 = 1;
			GpioDataRegs.GPBDAT.bit.GPIOB0 = 0;
			GpioDataRegs.GPBDAT.bit.GPIOB1 = 1;
			CurrentGear = 5;
		}
		//前进3挡
		else if((GpioDataRegs.GPBDAT.bit.GPIOB9 == 1) && (GpioDataRegs.GPBDAT.bit.GPIOB10 == 0))
		{
			GpioDataRegs.GPADAT.bit.GPIOA0 = 0;
			GpioDataRegs.GPADAT.bit.GPIOA1 = 1;
			GpioDataRegs.GPADAT.bit.GPIOA2 = 1;
			GpioDataRegs.GPBDAT.bit.GPIOB0 = 1;
			GpioDataRegs.GPBDAT.bit.GPIOB1 = 1;
			CurrentGear = 6;
		}	
		//前进4挡
		else if((GpioDataRegs.GPBDAT.bit.GPIOB9 == 0) && (GpioDataRegs.GPBDAT.bit.GPIOB10 == 0))
		{
			GpioDataRegs.GPADAT.bit.GPIOA0 = 1;
			GpioDataRegs.GPADAT.bit.GPIOA1 = 1;
			GpioDataRegs.GPADAT.bit.GPIOA2 = 1;
			GpioDataRegs.GPBDAT.bit.GPIOB0 = 1;
			GpioDataRegs.GPBDAT.bit.GPIOB1 = 0;
			CurrentGear = 7;
		}
	}
	else if(GpioDataRegs.GPADAT.bit.GPIOA15 == 0)
	{
		//后退1挡
		if((GpioDataRegs.GPBDAT.bit.GPIOB9 == 0) && (GpioDataRegs.GPBDAT.bit.GPIOB10 == 1))
		{
			GpioDataRegs.GPADAT.bit.GPIOA0 = 1;
			GpioDataRegs.GPADAT.bit.GPIOA1 = 0;
			GpioDataRegs.GPADAT.bit.GPIOA2 = 0;
			GpioDataRegs.GPBDAT.bit.GPIOB0 = 1;
			GpioDataRegs.GPBDAT.bit.GPIOB1 = 1;
			CurrentGear = 2;
		}
		//后退2挡
		else if((GpioDataRegs.GPBDAT.bit.GPIOB9 == 1) && (GpioDataRegs.GPBDAT.bit.GPIOB10 == 1))
		{
			GpioDataRegs.GPADAT.bit.GPIOA0 = 1;
			GpioDataRegs.GPADAT.bit.GPIOA1 = 0;
			GpioDataRegs.GPADAT.bit.GPIOA2 = 1;
			GpioDataRegs.GPBDAT.bit.GPIOB0 = 0;
			GpioDataRegs.GPBDAT.bit.GPIOB1 = 1;
			CurrentGear = 1;
		}
		//后退3挡
		else if(((GpioDataRegs.GPBDAT.bit.GPIOB9 == 1) && (GpioDataRegs.GPBDAT.bit.GPIOB10 == 0)) || ((GpioDataRegs.GPBDAT.bit.GPIOB9 == 0) && (GpioDataRegs.GPBDAT.bit.GPIOB10 == 0))) 
		{
			GpioDataRegs.GPADAT.bit.GPIOA0 = 1;
			GpioDataRegs.GPADAT.bit.GPIOA1 = 0;
			GpioDataRegs.GPADAT.bit.GPIOA2 = 1;
			GpioDataRegs.GPBDAT.bit.GPIOB0 = 1;
			GpioDataRegs.GPBDAT.bit.GPIOB1 = 1;
			CurrentGear = 0;
		}
	}
}

void cansend(void)
{          
	Uint32 MDRH,MDRL,tmp;                     
	/*EngineSpeed = 2000;
	ThrottlePosition = 89;
	SystemVolt = 26.7;
	OilPressure = 102;
	WaterTemp = 85; 
	TQConvertorPress = 23.4;
	TransmitionPress = 45.6;
	PI_GearOutSpeed = 2000;*/
	if(WaterTemp < 0) WaterTemp = 40;
	 
	MDRL = EngineSpeed;
	MDRL = MDRL<<16;
	MDRL = MDRL + (int)(TravelSpeed*10);
	ECanaMboxes.MBOX0.MDRL.all = MDRL;
	MDRH = ThrottlePosition;
	MDRH = MDRH<<16;
	MDRH = MDRH + (int)(SystemVolt*10);
	ECanaMboxes.MBOX0.MDRH.all = MDRH;
	//ECanaMboxes.MBOX0.MDRL.bit.LOW_WORD = (int)(TravelSpeed*10);  
	//ECanaMboxes.MBOX0.MDRL.bit.HI_WORD = EngineSpeed;
	//ECanaMboxes.MBOX0.MDRL.all = EngineSpeed*65536 + (int)(TravelSpeed*10);
	//ECanaMboxes.MBOX0.MDRH.all = ThrottlePosition*65536 + (int)(SystemVolt*10);//FuelPercent<<24 + ThrottlePosition<<16 + SupplyVolt;
	
	MDRL = (int)TQConvertorPress;
	MDRL = MDRL<<24;
	tmp = (PI_GearOutSpeed/256);
	tmp = tmp<<16;
	MDRL = MDRL + tmp;
	tmp = (int)OilPressure;
	tmp = tmp<<8;
	MDRL = MDRL + tmp;
	MDRL = MDRL + WaterTemp;
	ECanaMboxes.MBOX1.MDRL.all = MDRL;
	
	MDRH = (PI_GearOutSpeed%256);
	MDRH = MDRH<<8;
	MDRH = MDRH + (int)TransmitionPress;
	ECanaMboxes.MBOX1.MDRH.all = MDRH;
	//ECanaMboxes.MBOX1.MDRL.all = (int)TQConvertorPress*16777216 + (PI_GearOutSpeed/256)*65536 + (int)OilPressure*256 + WaterTemp;//TQConvertorPress<<24 + TQConvertorTemp<<16 + OilPress<<8 + WaterTemp;
	//ECanaMboxes.MBOX1.MDRH.all = (PI_GearOutSpeed%256)*256 + (int)TransmitionPress;//ShiftValveAlarm<<16 + BrakePress<<8 + TransmitionPress;
	
	ECanaMboxes.MBOX2.MDRL.all = CurrentGear;//PowerSelect<<16 + ShiftGearMode<<8 + CurrentGear;
	//ECanaMboxes.MBOX2.MDRH.all = 0;
	ECanaMboxes.MBOX2.MDRH.bit.LOW_WORD = PI_GearOutSpeed;  
	ECanaMboxes.MBOX2.MDRH.bit.HI_WORD = 0; 
	
	ECanaMboxes.MBOX3.MDRL.all = 0xFF;//WorkDevicePress<<24 + HydroSystemPress<<16 + LoadPercent;
	ECanaMboxes.MBOX3.MDRH.all = 0xFF;//CANSystemVolt<<8 + CANOilPress;
	//邮箱信息成功发送后CANTRS相应标志位复位
	//查询方式方式时以下7行放开
	while (ECanaRegs.CANTRS.all == 0) 
	{ 
		ECanaRegs.CANTRS.bit.TRS0 = 1;
		ECanaRegs.CANTRS.bit.TRS1 = 1;
		ECanaRegs.CANTRS.bit.TRS2 = 1;
		ECanaRegs.CANTRS.bit.TRS3 = 1;
	} 
}

void canreceive(void)
{       
	Uint32 MDRH,MDRL; 
	MDRL = ECanaMboxes.MBOX31.MDRL.all;
	MDRL = MDRL & 0xFF000000;
	MDRL = MDRL >> 24;	
	MDRH = ECanaMboxes.MBOX31.MDRH.all;
	MDRH =MDRH & 0x000000FF; 
	EngineSpeed = (int)((MDRH*256 + MDRL)*0.125);   

	
	MDRL = ECanaMboxes.MBOX30.MDRL.all;
	MDRL = MDRL & 0x0000FF00; 
	MDRL = MDRL >> 8;
	ThrottlePosition = (int)(MDRL*0.4); 
	MDRL = ECanaMboxes.MBOX30.MDRL.all; 
	MDRL = MDRL & 0x00FF0000; 
	MDRL = MDRL >> 16;
	LoadPercent = MDRL;   
	  
	MDRL = ECanaMboxes.MBOX29.MDRL.all;
	MDRL = MDRL & 0x000000FF; 
	WaterTemp = MDRL - 40;    
	
	MDRL = ECanaMboxes.MBOX28.MDRL.all;
	MDRL = MDRL & 0x000000FF; 
	OilPressure = MDRL;//(float)MDRL*4;//(单位为KPa,100KPa = 1Bar)         
	
	MDRH = ECanaMboxes.MBOX27.MDRH.all;
	MDRH = MDRH & 0x0000FFFF; 
	SystemVolt = MDRH*0.05;
	
	//EngineSpeed := REAL_TO_UINT((BYTE_TO_REAL(ms.DATA5)*256 + BYTE_TO_REAL(ms.DATA4))*0.125);	
	//ThrottlePosition := REAL_TO_UINT((BYTE_TO_UINT(ms.DATA2)*0.4));
	//LoadPercent := BYTE_TO_UINT(ms.DATA3);   
	//WaterTemp := BYTE_TO_USINT(ms.DATA1) -40;  
	//OilPressure :=REAL_TO_USINT( BYTE_TO_REAL(ms.DATA1)*4/ 10);  
	//SystemVolt := REAL_TO_USINT((BYTE_TO_REAL(ms.DATA6)*256 + BYTE_TO_REAL(ms.DATA5))*0.05);
}
   
void AICal(void)
{
	a1[5]=((float)AdcRegs.RESULT6)*3.0/65520.0; 
	a1[7]=((float)AdcRegs.RESULT8)*3.0/65520.0;  
	//机油压力计算 
	/*vol=a1[5];
	resistance=(470*vol)/(12-vol);
	tmp=(-0.04342+0.00378*resistance+0.0000111*resistance*resistance)*10*10;
	if(tmp<0)
		OilPress=0;  
	else
		OilPress=tmp;*/ 
	//操作压力计算0~25bar 变速箱油压
	vol=a1[5]*5/3;
	resistance=(470*vol)/(12-vol);
	tmp=(-0.0268+0.00682*resistance+0.0000277*resistance*resistance)*10*10;
	if(tmp<0)
		TransmitionPress=0;
	else
		TransmitionPress=tmp;
	//变矩器油压计算0~10bar
	vol= a1[7]*5/3;
	resistance=(470*vol)/(12-vol);
	tmp=(-0.04342+0.00378*resistance+0.0000111*resistance*resistance)*10*10;
	if(tmp < 0) 
		TQConvertorPress=0;
	else
		TQConvertorPress=tmp;
				
	AdcRegs.ADCTRL2.bit.SOC_SEQ1=1;
} 
//===========================================================================
// No more.
//===========================================================================

⌨️ 快捷键说明

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