isrv1.c
来自「PSOC 电动自行车代码 器件采用CYPRESS新电动自行车器件CY8C245」· C语言 代码 · 共 665 行 · 第 1/2 页
C
665 行
ppc->msg.ctrlout_set=0x30;
break;
}
case 0x10:{
ppc->msg.position_next=0x14;
ppc->msg.ctrlout_set=0x50;
break;
}
case 0x11:{
ppc->msg.position_next=0x10;
ppc->msg.ctrlout_set=0x44;
break;
}
case 0x1:{
ppc->msg.position_next=0x11;
ppc->msg.ctrlout_set=0x84;
break;
}
default:{
ppc->msg.position_next=0x1;
ppc->msg.ctrlout_set=0x88;
break;}
}
}
else
{
switch(ppc->msg.position_prev){
case 0x0:{
ppc->msg.position_next=0x1;
ppc->msg.ctrlout_set=0x28;
break;
}
case 0x10:{
ppc->msg.position_next=0x0;
ppc->msg.ctrlout_set=0x30;
break;
}
case 0x14:{
ppc->msg.position_next=0x10;
ppc->msg.ctrlout_set=0x50;
break;
}
case 0x15:{
ppc->msg.position_next=0x14;
ppc->msg.ctrlout_set=0x44;
break;
}
case 0x5:{
ppc->msg.position_next=0x15;
ppc->msg.ctrlout_set=0x84;
break;
}
default:{
ppc->msg.position_next=0x5;
ppc->msg.ctrlout_set=0x88;
break;}
}
}
}
}
else
{
/* if(st->msg.st1&bitSSIDE_DRV_LEAKAGE_OVI)//st->bits.SSIDE_DRV_LEAKAGE_OVI)
{
ppc->msg.portena=0;
ppc->msg.pwmena=3;
ppc->msg.duty_cycle=0;
motor_ctrlout(st,ppc);
// ppc->msg.portena=0;
// ppc->msg.pwmena&=~bitLPWMON;
// st->msg.st0|=bitCTRL_PORT_INACTIVE;//st->bits.CTRL_PORT_INACTIVE=1;
// PWM_WritePulseWidth(0);
// PRT1GS = (PRT1GS & 0x33);
// PRT2GS = (PRT2GS & 0x3f);
// ppc->msg.PRT1DRbak = (ppc->msg.PRT1DRbak & 0x33)|0x88;
// ppc->msg.PRT2DRbak = (ppc->msg.PRT2DRbak & 0x3f)|0x80;
// PRT1DR=ppc->msg.PRT1DRbak;
// PRT2DR=ppc->msg.PRT2DRbak;
// motor_ctrlout(ppc);
}
*/
// analog sample check & process
//else
if(adr->msg.samplechannel==BUSCURRENT)
{
// wait adc finished
while(ADC_CR0&ADC_CR0_ADC_START){};
// PRT3DR^=cruise_disp;
adr->msg.bus_current=(adr->msg.bus_current+ADC_DL)>>1;
// if(st->bits.ovi_faultint||st->bits.BLOCK_RUN_P2S_OK)
if((st->msg.st1&bitovi_faultint)||(st->msg.st2&bitBLOCK_RUN_P2S_OK))
{
ppc->msg.speed_profile=ppc->msg.speed_profile>4? ppc->msg.speed_profile-4:0;
}
else if(st->msg.st1&bitinvalid_position)//st->bits.invalid_position)
{
ppc->msg.speed_profile=0;
ppc->msg.portena=0;
ppc->msg.duty_cycle=ppc->msg.speed_profile;
motor_ctrlout(st,ppc);
return;
}
else if(st->msg.st0&bitABS_BRAKE_ENA)//st->bits.ABS_BRAKE_ENA)
{
// abs brake process
if(!(st->msg.st2&bitABS_BRAKE_OK))//st->bits.ABS_BRAKE_OK)
{
if(st->msg.st2&bitABS_BRAKE_FINALDELAY)//st->bits.ABS_BRAKE_FINALDELAY)
{
ppc->msg.abs_delaycount++;
if(ppc->msg.abs_delaycount>20000)
st->msg.st2|=bitABS_BRAKE_OK;//st->bits.ABS_BRAKE_OK=1;
}
else if((ppc->msg.prev_pos_ontime>0x800)||(ppc->msg.cur_pos_ontime>0x800))
{
// st->bits.ABS_BRAKE_OK=1;
ppc->msg.pwmena=3;
ppc->msg.portena=0xe0;
st->msg.st0|=bitCTRL_PORT_INACTIVE;//st->bits.CTRL_PORT_INACTIVE=1;
ppc->msg.speed_profile=0xff;
st->msg.st2|=bitABS_BRAKE_FINALDELAY;//st->bits.ABS_BRAKE_FINALDELAY=1;
ppc->msg.abs_delaycount=0;
}
else if((ppc->msg.prev_pos_ontime>0x400)||(ppc->msg.cur_pos_ontime>0x400))
{
// if(st->msg.st0&bitCTRL_PORT_INACTIVE)//st->bits.CTRL_PORT_INACTIVE)
// {
// reset_hallposition(st,ppc);
// }
ppc->msg.pwmena=bitPWMON+bitLPWMON;
ppc->msg.portena=0xe0;
if(ppc->msg.speed_profile>0xe0)
{
ppc->msg.speed_profile=0xe0;
}
else
ppc->msg.speed_profile+=2;
}
else
{
if(st->msg.st0&bitCTRL_PORT_INACTIVE)//st->bits.CTRL_PORT_INACTIVE)
{ ppc->msg.portena=(ppc->msg.ctrlout_set<<3)&0xe0;
st->msg.st0&=~bitCTRL_PORT_INACTIVE;
}
ppc->msg.pwmena=bitPWMON+bitLPWMON;
if(adr->msg.bus_current>ppc->msg.current_dcoffset)
{ ppc->msg.speed_profile= (ppc->msg.speed_profile<0xfc)? ppc->msg.speed_profile+2:0xff;
}
else
{
if((ppc->msg.current_dcoffset-adr->msg.bus_current)>5)
ppc->msg.speed_profile= ppc->msg.speed_profile>0x33? ppc->msg.speed_profile-2:0x33;
}
}
}
else
{
ppc->msg.pwmena=0;
ppc->msg.portena=0x0;
st->msg.st0|=bitCTRL_PORT_INACTIVE;// st->bits.CTRL_PORT_INACTIVE=1;
ppc->msg.speed_profile=0;
}
}
else
{
if(st->msg.st0&bitBRAKE_VALID)//st->bits.BRAKE_VALID)
{
ppc->msg.speed_profile=ppc->msg.speed_profile>2? ppc->msg.speed_profile-2:0;
}
else
{
if(adr->msg.bus_current<ppc->msg.LSPWM_SWITCH_I)
{
ppc->msg.pwmena&=~bitLPWMON;// disable low side pwm enable
ppc->msg.OV_MINRATEDI_ERR=0;
}
else
{
ppc->msg.OV_MINRATEDI_ERR=adr->msg.bus_current-ppc->msg.LSPWM_SWITCH_I;
ppc->msg.pwmena|=bitLPWMON;// enable low side pwm enable
}
if(adr->msg.bus_current<ppc->msg.RATED_CURRENT)// not ovi rated current process
{
if(ppc->msg.speed_command>ppc->msg.speed_profile)// increase output ctrl level
{
if((ppc->msg.RATED_CURRENT-adr->msg.bus_current)<6)
{
ppc->msg.count++;
if(ppc->msg.count>8)
{
ppc->msg.count=0;
ppc->msg.speed_profile++;
}
}
else{
ppc->msg.count=0;
ppc->msg.speed_profile++;
}
}
else// decrease output control level
{
if(ppc->msg.speed_command<(ppc->msg.speed_profile-2))
{
ppc->msg.speed_profile-=2;
}
else
ppc->msg.speed_profile=ppc->msg.speed_command;
}
}
else
{
ppc->msg.count=0;
ppc->msg.OV_RATEDT_ERR=adr->msg.bus_current-ppc->msg.RATED_CURRENT;
if(ppc->msg.OV_RATEDT_ERR>5)
{
ppc->msg.speed_profile=ppc->msg.speed_profile>4? ppc->msg.speed_profile-4:0;
}
else
{
ppc->msg.speed_profile=ppc->msg.speed_profile>0? ppc->msg.speed_profile-1:0;
}
}
if(st->msg.st0&bitCTRL_PORT_INACTIVE)//st->bits.CTRL_PORT_INACTIVE)
{ ppc->msg.portena=ppc->msg.ctrlout_set;
st->msg.st0&=~bitCTRL_PORT_INACTIVE;
}
}
// update pwm dutycycle
if(adr->msg.bus_current<ppc->msg.LSPWM_SWITCH_I)
{
ppc->msg.pwmena&=~bitLPWMON;// disable low side pwm enable
}
// set pwm duty_cycle, start pwm output with port out enable
}
ppc->msg.duty_cycle=ppc->msg.speed_profile;
// PWM_WritePulseWidth(ppc->msg.duty_cycle);
motor_ctrlout(st,ppc);
}
else if(adr->msg.samplechannel==BATTERY)
{
while(ADC_CR0&ADC_CR0_ADC_START){};
adr->msg.battery_voltage=(adr->msg.battery_voltage+ADC_DL)>>1;
}
else if(adr->msg.samplechannel==TS)
{
while(ADC_CR0&ADC_CR0_ADC_START){};
adr->msg.ts_voltage=(adr->msg.ts_voltage+ADC_DL)>>1;
}
else if(adr->msg.samplechannel==BRAKE)
{
while(ADC_CR0&ADC_CR0_ADC_START){};
adr->msg.brake_voltage=(adr->msg.brake_voltage+ADC_DL)>>1;
// if((!st->bits.SSIDE_DRV_LEAKAGE_OVI&&((st->bits.BRAKE_LEVEL&&(adr->msg.brake_voltage>0x66))|| \
(!st->bits.BRAKE_LEVEL&&(adr->msg.brake_voltage<0x70))))||st->bits.SSIDE_DRV_LEAKAGE_OVI)
if((!(st->msg.st1&bitSSIDE_DRV_LEAKAGE_OVI)&&(((st->msg.st0&bitBRAKE_LEVEL)&&(adr->msg.brake_voltage>0x66))|| \
(!(st->msg.st0&bitBRAKE_LEVEL)&&(adr->msg.brake_voltage<0x70))))||(st->msg.st1&bitSSIDE_DRV_LEAKAGE_OVI))
{
st->msg.st0&=~bitcruise_on;//st->bits.cruise_on=0;
st->msg.st0|=bitBRAKE_VALID;//st->bits.BRAKE_VALID=1;
if(st->msg.st0&bitabs_ena)//st->bits.abs_ena)
st->msg.st0|=bitABS_BRAKE_ENA;//st->bits.ABS_BRAKE_ENA=1;
}
else
{
st->msg.st0&=~bitBRAKE_VALID;//st->bits.BRAKE_VALID=0;
st->msg.st0&=~bitABS_BRAKE_ENA;// st->bits.ABS_BRAKE_ENA=0;
st->msg.st2&=~bitABS_BRAKE_OK;//st->bits.ABS_BRAKE_OK=0;
st->msg.st2&=~bitABS_BRAKE_FINALDELAY;// st->bits.ABS_BRAKE_FINALDELAY=0;
ppc->msg.abs_delaycount=0;
}
}
}
// set next sample channel
if((ppc->msg.looptimer&0xff)==0) // set sample brake voltage
{
// set sample channel: brake voltage
// start sample
// set sample channel code
ADC_CR0=(ADC_CR0&7)|brake_in_chan;
adr->msg.samplechannel=BRAKE;
// ppc->msg.PRT1DRbak^=abs_disp;
// PRT1DR=ppc->msg.PRT1DRbak;
}
else if((ppc->msg.looptimer&0x7f)==0)
{
// set sample channel: ts voltage
// start sample
// set sample channel code
ADC_CR0=(ADC_CR0&7)|ts_chan;
adr->msg.samplechannel=TS;
// ppc->msg.PRT2DRbak^=Low_BATV_disp;
// PRT2DR=ppc->msg.PRT2DRbak;
}
else if((ppc->msg.looptimer&0x3f)==0)
{
// set sample channel: battery voltage
// start sample
// set sample channel code
ADC_CR0=(ADC_CR0&7)|battery_v_chan;
adr->msg.samplechannel=BATTERY;
// ppc->msg.PRT1DRbak^=LEDPORT;
// PRT1DR=ppc->msg.PRT1DRbak;
}
else
{
// set sample channel: bus current
// start sample
// set sample channel code
ADC_CR0=(ADC_CR0&7)|buscurrent_chan;
adr->msg.samplechannel=BUSCURRENT;
// PRT3DR^=cruise_disp;
}
while(ADC_CR0&ADC_CR0_ADC_READY)
tt=ADC_DL;
//ADC_CR0|=ADC_CR0_ADC_START;
}
}
void hall_position_isr(PROC_PROCESS *ppc,SYSSTAT *st)
{
hall_position_check(ppc,st);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?