mainv1.c
来自「PSOC 电动自行车代码 器件采用CYPRESS新电动自行车器件CY8C245」· C语言 代码 · 共 984 行 · 第 1/2 页
C
984 行
, 0xD3 , 0xD9 , 0xDE , 0xE2 , 0xE6 , 0xEA , 0xF0\
, 0xF5 , 0xFA , 0xFF , 0xFF , 0xFF };
void process_speed_command(SYSSTAT *st,PROC_PROCESS *ppc,ADC *adres)
{
unsigned char Vts,indx,spcmd;
if(st->msg.st1&bitLOW_BATTERY)//st->bits.LOW_BATTERY)
{
st->msg.st0&=~bitcruise_on;//st->bits.cruise_on=0;
st->msg.st1&=~bitmotor_run;//st->bits.motor_run=0;
ppc->msg.speed_command=0;
}
else
{
if(!(st->msg.st0&bitABS_BRAKE_ENA))//st->bits.ABS_BRAKE_ENA)
{
if(!(st->msg.st0&bitcruise_on))//st->bits.cruise_on)
{
Vts=adres->msg.ts_voltage;
if((Vts>=TS_SAMPLE_MIN)&&(Vts<ts_sample_maxlimit))
{
if(Vts>=TS_SAMPLE_MAX) spcmd=0xff;
else
{
indx=(Vts-TS_SAMPLE_MIN)/2;
spcmd=spcmdindx[indx];
}
if(st->msg.st1&bitts_reset)//st->bits.ts_reset)
{ st->msg.st1&=~bitovi_faultint;//st->bits.ovi_faultint=0;
if(!(st->msg.st2&bitABS_BRAKE_OK))//st->bits.ABS_BRAKE_OK)
{
M8C_DisableGInt;
check_mosfet(&sysstat,&proc_process,&adc);
M8C_EnableGInt;
}
}
st->msg.st1&=~bitts_reset;//st->bits.ts_reset=0;
if(st->msg.st1&bitinvalid_position)//st->bits.invalid_position)
{
ppc->msg.speed_command=0;
st->msg.st1&=~bitmotor_run;//st->bits.motor_run=0;
}
else
{
ppc->msg.speed_command=spcmd;
st->msg.st1|=bitmotor_run;//st->bits.motor_run=1;
}
}
else
{
st->msg.st0&=~bitcruise_on;//st->bits.cruise_on=0;
st->msg.st1|=bitts_reset;//st->bits.ts_reset=1;
st->msg.st1&=~bitmotor_run;//st->bits.motor_run=0;
ppc->msg.speed_command=0;
st->msg.st2&=~bitBLOCK_RUN_P2S_OK;//st->bits.BLOCK_RUN_P2S_OK=0;
ppc->msg.block_run_timer=0;
st->msg.st2&=~bitBLOCK_RUN_P1S_OK;//st->bits.BLOCK_RUN_P1S_OK=0;
}
}
}
else
{
st->msg.st0&=~bitcruise_on;//st->bits.cruise_on=0;
st->msg.st1|=bitts_reset;//st->bits.ts_reset=1;
st->msg.st1&=~bitmotor_run;//st->bits.motor_run=0;
ppc->msg.speed_command=0;
st->msg.st2&=~bitBLOCK_RUN_P2S_OK;//st->bits.BLOCK_RUN_P2S_OK=0;
ppc->msg.block_run_timer=0;
st->msg.st2&=~bitBLOCK_RUN_P1S_OK;//st->bits.BLOCK_RUN_P1S_OK=0;
}
}
}
void battery_voltage_restore(BATVCHK *bv,SYSSTAT *st)
{
bv->msg.FUL_BATTERY_CHK_ONTIMER++;
if(bv->msg.FUL_BATTERY_CHK_ONTIMER>BATTERY_RECOVER_ONTIME)
{
bv->msg.FUL_BATTERY_CHK_ONTIMER--;
bv->msg.LOW_BATTERY_CHK_ONTIMER=0;
st->msg.st1&=~bitLOW_BATTERY;//st->bits.LOW_BATTERY=0;
}
}
void battery_voltage_detect(ADC *adr,BATVCHK *bv,SYSSTAT *st,PROC_PROCESS *ppc)
{
if(adr->msg.battery_voltage>NORMAL_BATTERY_V_WITH_NOLOADER)
{
bv->msg.IERR_BY_BATDOWN=0;
battery_voltage_restore(bv,st);
}
else
{
bv->msg.IERR_BY_BATDOWN=NORMAL_BATTERY_V_WITH_NOLOADER-adr->msg.battery_voltage;
if(bv->msg.IERR_BY_BATDOWN>MAX_BATTERY_VOLTAGE_ERR){
bv->msg.IERR_BY_BATDOWN=MAX_BVE_EQ_IERR;
}else
bv->msg.IERR_BY_BATDOWN=(bv->msg.IERR_BY_BATDOWN>>1)+bv->msg.IERR_BY_BATDOWN;
if(adr->msg.battery_voltage>NORMAL_BATTERY_V_WITH_LOADER)
{
if(st->msg.st1&bitLOW_BATTERY)//st->bits.LOW_BATTERY)
{
if(adr->msg.battery_voltage>(NORMAL_BATTERY_V_WITH_LOADER+3))
battery_voltage_restore(bv,st);
}
}
else{
bv->msg.LOW_BATTERY_CHK_ONTIMER++;
if(ppc->msg.OV_MINRATEDI_ERR>0x0b){
if(bv->msg.LOW_BATTERY_CHK_ONTIMER>=HLOADER_BATLV_VALID_ONTIME){
bv->msg.FUL_BATTERY_CHK_ONTIMER=0;
bv->msg.LOW_BATTERY_CHK_ONTIMER=0;
st->msg.st1|=bitLOW_BATTERY;//st->bits.LOW_BATTERY=1;
}
}else if(bv->msg.LOW_BATTERY_CHK_ONTIMER>=LLOADER_BATLV_VALID_ONTIME){
bv->msg.FUL_BATTERY_CHK_ONTIMER=0;
bv->msg.LOW_BATTERY_CHK_ONTIMER=0;
st->msg.st1|=bitLOW_BATTERY;//st->bits.LOW_BATTERY=1;
}
}
}
}
unsigned char block_run_process(SYSSTAT *st,PROC_PROCESS *ppc)
{
ppc->msg.block_run_timer++;
if(st->msg.st1&bitmotor_run)//st->bits.motor_run)
{
if(!(st->msg.st0&bitBRAKE_VALID))//st->bits.BRAKE_VALID)
{
if(ppc->msg.position_change_cnt<0x100){
if(ppc->msg.OV_MINRATEDI_ERR>=8){
if(ppc->msg.position_change_cnt<=SLOW_POSALT_CNT_SV){
ppc->msg.pos_alt_acccounter+=ppc->msg.position_change_cnt;
ppc->msg.position_change_cnt=0;
if(ppc->msg.pos_alt_acccounter>CONTINUE_SLOW_POSALT_ACCCNT_SV){
if(ppc->msg.block_run_timer>SHUTOFF_STEP2ND_DELAY){
st->msg.st2|=bitBLOCK_RUN_P2S_OK;//st->bits.BLOCK_RUN_P2S_OK=1;
st->msg.st0&=~bitcruise_on;//st->bits.cruise_on=0;
}else if(ppc->msg.block_run_timer>SHUTOFF_STEP1ST_DELAY)
st->msg.st2|=bitBLOCK_RUN_P1S_OK;//st->bits.BLOCK_RUN_P1S_OK=1;
return(0);
}
}
}
}
}
}
ppc->msg.block_run_timer=0;
st->msg.st2&=~bitBLOCK_RUN_P1S_OK;//st->bits.BLOCK_RUN_P1S_OK=0;
ppc->msg.position_change_cnt=0;
ppc->msg.pos_alt_acccounter=0;
return(1);
}
unsigned char system_status_indicator(DISP_STRU *dsreg,SYSSTAT *st)
{
if(st->msg.st1&bitSSIDE_DRV_LEAKAGE_OVI)//st->bits.SSIDE_DRV_LEAKAGE_OVI)
{
if(st->msg.st1&bitHSIDE_DRV_LEAKAGE_OVI)//st->bits.HSIDE_DRV_LEAKAGE_OVI)
dsreg->msg.LED_DISP_TIMES=0x08;
else
dsreg->msg.LED_DISP_TIMES=0x0a;
}
else if(st->msg.st0&bitcruise_on)//st->bits.cruise_on)
dsreg->msg.LED_DISP_TIMES=0x06;
else if(st->msg.st1&bitovi_faultint)//st->bits.ovi_faultint)
dsreg->msg.LED_DISP_TIMES=0x0e;
else if(st->msg.st0&bitBRAKE_VALID)//st->bits.BRAKE_VALID)
dsreg->msg.LED_DISP_TIMES=0x04;
else if(st->msg.st1&bitinvalid_position)//st->bits.invalid_position)
dsreg->msg.LED_DISP_TIMES=0x0c;
else if(st->msg.st1&bitLOW_BATTERY)//st->bits.LOW_BATTERY)
dsreg->msg.LED_DISP_TIMES=0x10;
else if(!(st->msg.st1&bitmotor_run))//st->bits.motor_run)
dsreg->msg.LED_DISP_TIMES=2;
else
{
st->msg.st3&=~bitledst;//st->bits.ledst=0;
proc_process.msg.PRT1DRbak&=(~LEDPORT);
dsreg->msg.LED_DISP_TIMES=0;
dsreg->msg.LED_DISP_TUNIT=0;
PRT1DR=proc_process.msg.PRT1DRbak;
return(0);
}
if(dsreg->msg.LED_DISP_TIMES>dsreg->msg.LED_DISP_COUNTER)
{
if(dsreg->msg.LED_DISP_TUNIT==0)
{
if(st->msg.st3&bitledst)//st->bits.ledst)
{ st->msg.st3&=~bitledst;//st->bits.ledst=0;
proc_process.msg.PRT1DRbak&=(~LEDPORT);
}
else
{ st->msg.st3|=bitledst;//st->bits.ledst=1;
proc_process.msg.PRT1DRbak|=LEDPORT;
}
}
dsreg->msg.LED_DISP_TUNIT++;
if(dsreg->msg.LED_DISP_TUNIT>6)
{
dsreg->msg.LED_DISP_TUNIT=0;
dsreg->msg.LED_DISP_COUNTER++;
}
}
else
{
st->msg.st3&=~bitledst;//st->bits.ledst=0;
proc_process.msg.PRT1DRbak&=(~LEDPORT);
dsreg->msg.LED_DISP_TUNIT++;
if(dsreg->msg.LED_DISP_TUNIT>0x0a)
{
dsreg->msg.LED_DISP_TUNIT=0;
dsreg->msg.LED_DISP_COUNTER=0;
}
}
PRT1DR=proc_process.msg.PRT1DRbak;
return(0);
}
void inactive_ctrl(SYSSTAT *st,PROC_PROCESS *ppc)
{
PWM_WritePulseWidth(0X00);
PRT1GS |= 0xcc; //(PRT1GS & 0x33);
PRT2GS |= 0xc0; //(PRT2GS & 0x3f);
ppc->msg.PRT1DRbak = (ppc->msg.PRT1DRbak & 0x33)|0x88;
ppc->msg.PRT2DRbak = (ppc->msg.PRT2DRbak & 0x3f)|0x80;
PRT1DR=ppc->msg.PRT1DRbak|(PRT1DR&MASKOPRT1DR);
PRT2DR=ppc->msg.PRT2DRbak|(PRT2DR&MASKOPRT2DR);
ppc->msg.portena=0;
// ppc->msg.pwmena=3;
// PRT1DR=ppc->msg.PRT1DRbak;
// PRT2DR=ppc->msg.PRT2DRbak;
st->msg.st0|=bitCTRL_PORT_INACTIVE;//st->bits.CTRL_PORT_INACTIVE=1;
}
void delay_cycle(unsigned int cs)
{
while(cs)
{
cs--;
}
}
unsigned char LEAKAGE_CURRENT_CHECK(SYSSTAT *st,PROC_PROCESS *ppc,ADC *sp)
{
unsigned char ib;
sp->msg.samplechannel=BUSCURRENT;
while(ADC_CR0&ADC_CR0_ADC_READY) ib=ADC_DL;
ADC_CR0=buscurrent_chan|ADC_CR0_ADC_EN|ADC_CR0_ADC_START;
delay_cycle(0x18);
inactive_ctrl(st,ppc);
while(ADC_CR0&ADC_CR0_ADC_START)
{
ib=0;
}
ib=ADC_DL;
I2CSBuff.b[2]=ib; //debug
// note ***
//st->msg.st1&=~bitSSIDE_DRV_LEAKAGE_OVI;
if(ib>ppc->msg.max_leakagecurrent)
st->msg.st1|=bitSSIDE_DRV_LEAKAGE_OVI;//st->bits.SSIDE_DRV_LEAKAGE_OVI=1;
return(ib);
}
//********************************************************************
unsigned char check_mosfet(SYSSTAT *st,PROC_PROCESS *ppc,ADC *sp)
{
unsigned char ib;
inactive_ctrl(st,ppc);
// detect low side mosfet
PRT1GS &= 0x33;
PRT2GS &= 0x3f;
ppc->msg.PRT1DRbak = (ppc->msg.PRT1DRbak & 0x33);// on all low side mosfet
ppc->msg.PRT2DRbak = (ppc->msg.PRT2DRbak & 0x3f);
PRT1DR=ppc->msg.PRT1DRbak|(PRT1DR&MASKOPRT1DR);
PRT2DR=ppc->msg.PRT2DRbak|(PRT2DR&MASKOPRT2DR);
ib=LEAKAGE_CURRENT_CHECK(st,ppc,sp);
if(st->msg.st1&bitSSIDE_DRV_LEAKAGE_OVI)//st->bits.SSIDE_DRV_LEAKAGE_OVI)
{
if((ib-ppc->msg.max_leakagecurrent)<6)
{
st->msg.st1&=~bitSSIDE_DRV_LEAKAGE_OVI;//st->bits.SSIDE_DRV_LEAKAGE_OVI=0;
ppc->msg.PRT1DRbak = (ppc->msg.PRT1DRbak & 0x33);// on all low side mosfet
ppc->msg.PRT2DRbak = (ppc->msg.PRT2DRbak & 0x3f);
PRT1DR=ppc->msg.PRT1DRbak|(PRT1DR&MASKOPRT1DR);
PRT2DR=ppc->msg.PRT2DRbak|(PRT2DR&MASKOPRT2DR);
ib=LEAKAGE_CURRENT_CHECK(st,ppc,sp);
if(st->msg.st1&bitSSIDE_DRV_LEAKAGE_OVI)//st->bits.SSIDE_DRV_LEAKAGE_OVI)
return(0);
}
else return(0);
}
//detect high side mosfet
ppc->msg.PRT1DRbak = (ppc->msg.PRT1DRbak & 0x33)|0xc0;// on all high side mosfet
ppc->msg.PRT2DRbak = (ppc->msg.PRT2DRbak & 0x3f)|0xc0;
PRT1DR=ppc->msg.PRT1DRbak|(PRT1DR&MASKOPRT1DR);
PRT2DR=ppc->msg.PRT2DRbak|(PRT2DR&MASKOPRT2DR);
ib=LEAKAGE_CURRENT_CHECK(st,ppc,sp);
if(st->msg.st1&bitSSIDE_DRV_LEAKAGE_OVI)//st->bits.SSIDE_DRV_LEAKAGE_OVI)
st->msg.st1|=bitHSIDE_DRV_LEAKAGE_OVI;//st->bits.HSIDE_DRV_LEAKAGE_OVI=1;
else
{
ppc->msg.PRT1DRbak = (ppc->msg.PRT1DRbak & 0x33);// on all low side mosfet
ppc->msg.PRT2DRbak = (ppc->msg.PRT2DRbak & 0x3f);
PRT1DR=ppc->msg.PRT1DRbak|(PRT1DR&MASKOPRT1DR);
PRT2DR=ppc->msg.PRT2DRbak|(PRT2DR&MASKOPRT2DR);
ib=LEAKAGE_CURRENT_CHECK(st,ppc,sp);
if(!(st->msg.st1&bitSSIDE_DRV_LEAKAGE_OVI))//st->bits.SSIDE_DRV_LEAKAGE_OVI)
{
reset_hallposition(st,ppc);
}
}
return(0);
}
//********************************************************************
unsigned char GET_HALL_POSITION(void)
{
unsigned char cnt,posa,posb;
cnt=4;
posb=0;
while(cnt)
{
posa=PRT2DR&HALLMASK;
if(posa!=posb)
{
posb=posa;
cnt=4;
}
cnt--;
}
return(posb);
}
//********************************************************************
void reset_hallposition(SYSSTAT *st,PROC_PROCESS *ppc)
{
unsigned char cnt;
cnt=0;
while(cnt<5){
ppc->msg.position_prev=GET_HALL_POSITION();
st->msg.st1&=~bitinvalid_position;//st->bits.invalid_position=0;
if(!get_ctrlout_setni(ppc,st))
break;
cnt++;
}
if(cnt>4){
st->msg.st1|=bitinvalid_position;//st->bits.invalid_position=1;
ppc->msg.duty_cycle=0;
ppc->msg.speed_profile=0;
inactive_ctrl(st,ppc);
}
}
//********************************************************************
unsigned char get_ctrlout_setni(PROC_PROCESS *ppc,SYSSTAT *st)
{
unsigned char errno;
errno=0;
if(st->msg.st0&bithallphase60)//st->bits.hallphase60)
{
if((ppc->msg.position_prev==0x4) || (ppc->msg.position_prev==0x11))
return(1);
else
{
ppc->msg.position_next=ppc->msg.position_prev;
switch(ppc->msg.position_prev)
{
case 0x5://0x30://000101
{
// ppc->msg.position_next=0x15;//0x70;
ppc->msg.ctrlout_set=0x88;
break;
}
case 0x1://0x10://000001
{
// ppc->msg.position_next=0x5;//0x30;
ppc->msg.ctrlout_set=0x28;
break;
}
case 0x00:
{
// ppc->msg.position_next=0x1;//0x10;
ppc->msg.ctrlout_set=0x30;
break;
}
case 0x10://0x40://010000
{
// ppc->msg.position_next=0x00;
ppc->msg.ctrlout_set=0x50;
break;
}
case 0x14://0x60://010100
{
// ppc->msg.position_next=0x10;//0x40;
ppc->msg.ctrlout_set=0x44;
break;
}
case 0x15://0x70://010101
{
// ppc->msg.position_next=0x14;//0x60;
ppc->msg.ctrlout_set=0x84;
break;
}
}
return(0);
}
}
else
{
if((ppc->msg.position_prev==0x00) || (ppc->msg.position_prev==0x15))
return(1);
else
{
ppc->msg.position_next=ppc->msg.position_prev;
switch(ppc->msg.position_prev)
{
case 0x1://0x10:
{
// ppc->msg.position_next=0x11;//0x50;
ppc->msg.ctrlout_set=0x88;
break;
}
case 0x5://0x30:
{
// ppc->msg.position_next=0x1;//0x10;
ppc->msg.ctrlout_set=0x28;
break;
}
case 0x4://0x20:
{
// ppc->msg.position_next=0x5;//0x30;
ppc->msg.ctrlout_set=0x30;
break;
}
case 0x14://0x60:
{
// ppc->msg.position_next=0x4;//0x20;
ppc->msg.ctrlout_set=0x50;
break;
}
case 0x10://0x40:
{
// ppc->msg.position_next=0x14;//0x60;
ppc->msg.ctrlout_set=0x44;
break;
}
case 0x11://0x50:
{
// ppc->msg.position_next=0x10;//0x40;
ppc->msg.ctrlout_set=0x84;
break;
}
}
return(0);
}
}
}
//********************************************************************
void init_bus_current(ADC *adres,PROC_PROCESS *ppc,SYSSTAT *st)
{
ppc->msg.current_dcoffset=sample_adc(buscurrent_chan);
ppc->msg.LSPWM_SWITCH_I=ppc->msg.current_dcoffset+0x06;
ppc->msg.max_leakagecurrent=ppc->msg.LSPWM_SWITCH_I+0x10;
if(ppc->msg.current_dcoffset>0x3c)
if(ppc->msg.current_dcoffset<0x5c)
if(st->msg.st0&bitabs_ena)//st->bits.abs_ena)
{
ppc->msg.HEBMF_CURRENT=ppc->msg.LSPWM_SWITCH_I-0x28;
ppc->msg.LEBMF_CURRENT=ppc->msg.LSPWM_SWITCH_I-0x10;
}
}
//********************************************************************
void PWM_ISR_C(void)
{
pwm_isr(&sysstat,&proc_process,&adc);
}
//********************************************************************
void HALL_ISR_C(void)
{
hall_position_isr(&proc_process,&sysstat);
}
//********************************************************************
void COMP_ISR_C(void)
{
// comp_isr(&sysstat,&proc_process);
}
//********************************************************************
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?