📄 fchev_can.c
字号:
/*** Setup ADC and configuration ***/
*ADCTRL1=0x4000; /*reset ADC */
asm("NOP");
*ADCTRL1=0x0010;
/*
bit 15 0: Reserved;
bit 14 0: no action;
bit 13-12 00: Immediate stop on suspend;
bit 11-8 0000: 2 x Tclk
bit 7 1: Fclk = CLK/2,Tclk = 2 × (1/CLK)(example, for CLK = 40 MHz, Tclk = 50 ns)
bit 6 0: Start-stop mode..
bit 5 0: ADC interrupt request priority=high
bit 4 0: Dual-sequencer mode.
bit 3 0: Calibration mode disabled
bit 2 0: Full reference voltage is applied to the ADC input
bit 1 1: VREFHI is used as precharge value at ADC input
bit 0 0: Self-test mode disabled */
*ADCTRL2=0x4242;
/*
bit 15 0: No action
bit 14 1: Immediately reset sequencer to state CONV00
bit 13 0: Clears a pending SOC trigger.
bit 12 0: Sequencer is Idle (i.e., waiting for trigger)
bit 11-10 00: Interrupt is Disabled
bit 9 1: This bit must be cleared by the user writing a 1 to it.
bit 8 0: SEQ1 cannot be started by EVA trigger.
bit 7 0: Disable External signal start-of-conversion bit for SEQ1
bit 6 1: Immediately resets SEQ2 to an initial “pretriggered” state,
bit 5 0: Clears a Pending SOC trigger for SEQ2.
bit 4 0: Sequencer is idle
bit 3-2 00: Interrupt is Disabled
bit 1 1: ,RESET,No interrupt event.
bit 0 0: SEQ2 cannot be started by EVB trigger. */
*MAX_CONV=0x0003; /* Number of conversions=4*/
*CHSELSEQ1=0x3210; /*Input Channels Selected order:0-15 */
*CHSELSEQ2=0x7654;
*CHSELSEQ3=0xBA98;
*CHSELSEQ4=0xFEDC;
/*=======================================================================*/
/*** Configure IOPB0 pin as an output ***/
*PBDATDIR=0x0100;
/*** Other setup ***/
/* initialize the LED index:OFF STATE */
LED=LED_STATE;
LED6_counter=0; /* initialize the user6-9 LED flag */
CAN_TFLAG=0x0000;/*发送时间计数初值*/
*T2CON=*T2CON|0x40; /*Enable timer operations*/
/*** Enable global interrupts ***/
asm(" CLRC INTM"); /* enable global interrupts */
/*** Proceed with main routine ***/
while(1); /* endless loop, wait for interrupt */
}
/*分支处理中断子程序 */
void t2timer_isr(void)
{ int err,temp,xn,yn,Iref,u,fbk;
*ADCTRL2=*ADCTRL2|0x2000;/*SRART AD conversion*/
*EVAIFRB =*EVAIFRB & 0x0001; /*** clear the T2PINT flag ***/
*TCR=0x2000; /* ;清 TA3 和MIF3标志位*/
temp_RCR=*RCR;
temp_RCR=temp_RCR&0x0040;
/*ouput of AD*/
loop:
end_ad=*ADCTRL2&0x1000; /*wait for the end of conversion of adbit12*/
while(end_ad)goto loop;
*ADCTRL2=*ADCTRL2|0x4000; /*Immediately reset sequencer to state CONV00*/
channel_0=(*RESULT0)>>6;
channel_1=(*RESULT1)>>6;
channel_2=(*RESULT2)>>6;
channel_3=(*RESULT3)>>6;
Ib=channel_0; /*the result of AD for the */
If=channel_1; /*the current of battery&Fuel cell and the bus voltage*/
Ubus=channel_2;
/*++++++++++++++++++++++++++++++++++++++*/
/*filter*/
xn=Ib;
fir.input=xn;
fir.calc(&fir);
yn=fir.output;
/*++++++++++++++++++++++++++++++++++++++*/
Ib=yn;
/* err=0x01c7-Ib;
if(err>0)
{
P_FC_ref=P_FC_ref-1;
}
if(err<0)
{P_FC_ref=P_FC_ref+1;
}
if(P_FC_ref<0) P_FC_ref=0;
if(P_FC_ref>0x2f) P_FC_ref=0x2f; */
/* temp=qexp(0.5); */
Iref=0x01d5;
fbk=Ib;
pid.pid_ref_reg1=Iref;
pid.pid_fb_reg1=fbk;
pid.calc(&pid);
u=pid.pid_out_reg1; /*0000~0x7FFF*/
P_FC_ref=((long)u*0x3c36L)>>18;
if(P_FC_ref<0) P_FC_ref=0;
if(P_FC_ref>0x2f) P_FC_ref=0x2f;
/* u=(u^0x8000)>>1;*/
/*++++++++++++++++++++*/
/* ;CAN查询接收程序 */
if(temp_RCR==0x0040)
{ *RCR=0x0040; /* ;复位 RMP2 和 MIF2*/
*CAN_IFR=0xFFFF; /*;清全部中断标志*/
mbx2_a=*MBX2A;
mbx2_b=*MBX2B;
mbx2_c=*MBX2C;
mbx2_d=*MBX2D;
LED_STATE=LED_STATE^0x0002; /* FLASH THE LED7 */
LED=LED_STATE;
*MCR=0x2480; /* ;DBO=1,CDR=0,ABO=1,STM=0 */
/*===================*/
/**MCR=0x24C0; */
/*========================*/
*MDER=0x004C; /*;ME2=ME3=1,MBX2接收, MBX3发送 */
}
/*+++++++++++++++++++++++++++++++++*/
/*COMMUNICATIOIN WITH PC VIA RS232*/
/* tx_cnt++;*/
/*if(tx_cnt==20)*/
/* {*/
/**SCITXBUF=0x55; */
/*while(*SCICTL2&0x0080);*/ /*is scirxbuf empty*/
/* tx_cnt=0;*/
/*} */
/* *SCITXBUF=mbx2_a;
*SCITXBUF=mbx2_a>>8;
*SCITXBUF=mbx2_b;
*SCITXBUF=mbx2_b>>8;
*SCITXBUF=mbx2_c;
*SCITXBUF=mbx2_c>>8;
*SCITXBUF=mbx2_d;
*SCITXBUF=mbx2_d>>8;*/
/*receive data and send out*/
/* if(*SCIRXST&0x0040)
{ temp=*SCIRXBUF;
*SCITXBUF=temp; */
/*while(*SCICTL2&0x0080);*/ /*is scirxbuf empty?*/
/* }*/
/*++++++++++++++++++++++++++++++++++++++*/
/*CAN周期发送程序*/
if(CAN_TFLAG==0x000A)
{ *MDER=0x0000; /* ;邮箱不使能 */
*MCR=0x0100; /* ;CDR=1,数据改变请求 */
*MBX3A=-P_FC_ref;/*P_FC_ref; */
*MBX3B=0x0200;
*MBX3C=0x0400;
*MBX3D=0x0400;
*MCR=0x2480; /* ;DBO=1,CDR=0,ABO=1,STM=0 */
/*===================*/
/**MCR=0x24C0; */
/*========================*/
*MDER=0x004C; /*;ME2=ME3=1,MBX2接收, MBX3发送 */
*TCR=0x0020; /*;邮箱3发送请求 */
temp_TCR=*TCR;
temp_TCR=temp_TCR&0x2000;
if(temp_TCR=0x2000)
{LED_STATE=LED_STATE^0x0004;
LED=LED_STATE;
CAN_TFLAG=0;
}
LED8_counter=0x0000;
}
/*** DAC output ***/
DAC0=Ib; /*output the result of Ib to DAC0*/
DAC1=yn; /*output the result of Ib to DAC1*/
DAC2=Ib; /*output the result of If to DAC2*/
DAC3=Ib; /*output the result of Ubus to DAC3*/
DACUD=temp; /*trigger the DAC to output */
/*+++++++++++++++++*/
*SCITXBUF=0x99;
delay();
*SCITXBUF=P_FC_ref>>8;
delay();
*SCITXBUF=P_FC_ref;
delay();
*SCITXBUF=0x77;
/*++++++++++++++++*/
/*辅助观测程序*/
*PBDATDIR=*PBDATDIR^0x0001; /* XOR the IOPB0 bit to toggle the pin */
CAN_TFLAG++; /*发送时间计数*/
LED6_counter++; /*the total interrupter number*/
if(LED6_counter==50)
{LED_STATE=LED_STATE^0x0001; /* FLASH THE LED6 */
LED=LED_STATE;
LED6_counter=0;} /*RESET THE LED TIME COUNTER*/
}
void can_isr(void)
{}
void sci_init(void)
{ *MCRA=*MCRA|0x03;
*SCICCR=0x0027;
/* 0 0 1 0 0 1 1 1
| | | | | | | |
| | | | | 8 bits data
| | | | |
| | | | no address bit
| | | self
| | enable varify
| odd
1stop
*/
*SCICTL1=0x0003;/*SW RESET=0 FOR CONFIG SCI*/
/*0 0 0 0 0 0 1 1
| | | | | | | Rx ENA
| | | | | | Tx ENA
| | | | | SLEEP?
| | | | TX WAKE
| | | RESERVE
| | SW RESET ,FOR CONFIG SCICTL1
| RX ERR INT ENA
RESERVE
*/
*SCICTL2=0x0000;
/*0 0 0 0 0 0 0 0
| | | | | | | TX INT ENA
| | | | | | RX/BKINT ENA
| | | | | RESERVED
| | | | RESERVED
| | | RESERVED
| | RESERVED
| TX EMPTY
TXRDY
*/
*SCIHBAUD=0x0002;
*SCILBAUD=0x0007; /*40*10^6/(9600*8)-1=0207H */
*SCICTL1=0x0023; /*End CONFIG*/
/*0 0 1 0 0 0 1 1
| | | | | | | Rx ENA
| | | | | | Tx ENA
| | | | | SLEEP?
| | | | TX WAKE
| | | RESERVE
| | SW RESET ,FOR CONFIG SCICTL1
| RX ERR INT ENA
RESERVE
*/
}
void delay(void)
{ int i;
for(i=1;i<3000;i++)
{ asm(" NOP");
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -