📄 zzj.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 + -