main.c
来自「PSOC 电动自行车代码 器件采用CYPRESS新电动自行车器件CY8C245」· C语言 代码 · 共 885 行 · 第 1/2 页
C
885 行
{
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)
{
// I2CSBuff.b[5]=ppc->msg.OV_MINRATEDI_ERR;
if(ppc->msg.OV_MINRATEDI_ERR>8)//8
//// if(ppc->msg.ovcount>0xe0)
{
// I2CSBuff.b[2]=ppc->msg.position_change_cnt;
if(ppc->msg.position_change_cnt<=SLOW_POSALT_CNT_SV)
{
// I2CSBuff.b[6]=ppc->msg.pos_alt_acccounter;
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);
}
// else
// I2CSBuff.b[4]=0xbb;
}
// else
// I2CSBuff.b[4]=0xaa;
}
// else
// I2CSBuff.b[4]=0xee;
}
}
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.PRT2DRbak|=LEDPORT;
dsreg->msg.LED_DISP_TIMES=0;
dsreg->msg.LED_DISP_TUNIT=0;
PRT2DR=proc_process.msg.PRT2DRbak;
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.PRT2DRbak&=(~LEDPORT);
}
else
{ st->msg.st3|=bitledst;//st->bits.ledst=1;
proc_process.msg.PRT2DRbak|=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.PRT2DRbak&=(~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;
}
}
proc_process.msg.PRT2DRbak|=(cruise_disp+Low_BATV_disp+abs_disp);
if(st->msg.st1&bitLOW_BATTERY)//st->bits.LOW_BATTERY)
{
proc_process.msg.PRT2DRbak&=(~Low_BATV_disp);
}
else if(st->msg.st0&bitcruise_on)
{
proc_process.msg.PRT2DRbak&=(~cruise_disp);
}
else if(st->msg.st0&bitBRAKE_VALID)
{
proc_process.msg.PRT2DRbak&=(~abs_disp);
}
PRT2DR=proc_process.msg.PRT2DRbak;
return(0);
}
void inactive_ctrl(SYSSTAT *st,PROC_PROCESS *ppc)
{
PRT1DR=MASKPWML;
PRT1GS = 0;
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;
ppc->msg.pwmena=0;
delay_cycle(0x18);
// ppc->msg.portena=0;
inactive_ctrl(st,ppc);
while(ADC_CR0&ADC_CR0_ADC_START)
{
ib=0;
}
ib=ADC_DL;
// note ***
//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 intfg)
{
unsigned char ib;
ppc->msg.pwmena=0;
// ppc->msg.portena=0;
inactive_ctrl(st,ppc);
// detect low side mosfet
// on all low side mosfet
PRT1DR=0;
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;
PRT1DR=0;
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
// on all high side mosfet
PRT1DR=MASKPWMH+MASKPWML;
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{
PRT1DR=0;
ib=LEAKAGE_CURRENT_CHECK(st,ppc,sp);
if(!(st->msg.st1&bitSSIDE_DRV_LEAKAGE_OVI))//st->bits.SSIDE_DRV_LEAKAGE_OVI)
{
if(intfg) M8C_DisableGInt;
reset_hallposition(st,ppc);
if(intfg) M8C_EnableGInt;
}
}
return(0);
}
//********************************************************************
unsigned char GET_HALL_POSITION(void)
{
unsigned char cnt,posa,posb;
cnt=4;
posb=0;
while(cnt)
{
posa=HALLINPUT;
if(posa!=posb)
{
posb=posa;
cnt=4;
}
cnt--;
}
return(posb);
}
//********************************************************************
unsigned char 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;
inactive_ctrl(st,ppc);
ppc->msg.speed_profile=0;
return(1);
}
else
return(0);
}
//********************************************************************
unsigned char get_ctrlout_setni(PROC_PROCESS *ppc,SYSSTAT *st)
{
unsigned char errno;
errno=0;
ppc->msg.position_next=ppc->msg.position_prev;
if((st->msg.st2&bitaltout_seqcfg))//st->bits.altout_seqcfg)
{
if(!(st->msg.st0&bithallphase60))//st->bits.hallphase60)
{
switch(ppc->msg.position_prev)
{
case 0x2:{
ppc->msg.ctrlout_set=PWML0+PWMH1;//0x28;
break;
}
case 0x6:{
ppc->msg.ctrlout_set=PWML0+PWMH2;//0x30;
break;
}
case 0x4:{
ppc->msg.ctrlout_set=PWML1+PWMH2;//0x50;
break;
}
case 0x5:{
ppc->msg.ctrlout_set=PWML1+PWMH0;//0x44;
break;
}
case 0x1:{
ppc->msg.ctrlout_set=PWML2+PWMH0;//0x84;
break;
}
case 0x3:
{
ppc->msg.ctrlout_set=PWML2+PWMH1;//0x88;
break;
}
default:{
errno=1;
break;
}
}
}
else
{
switch(ppc->msg.position_prev)
{
case 0x0:{
ppc->msg.ctrlout_set=PWML0+PWMH1;//0x28;
break;
}
case 0x4:{
ppc->msg.ctrlout_set=PWML0+PWMH2;//0x30;
break;
}
case 0x6:{
ppc->msg.ctrlout_set=PWML1+PWMH2;//0x50;
break;
}
case 0x7:{
ppc->msg.ctrlout_set=PWML1+PWMH0;//0x44;
break;
}
case 0x3:{
ppc->msg.ctrlout_set=PWML2+PWMH0;//0x84;
break;
}
case 0x1:{
ppc->msg.ctrlout_set=PWML2+PWMH1;//0x88;
break;
}
default:{
errno=1;
break;
}
}
}
}
else
{
if(!(st->msg.st0&bithallphase60))//st->bits.hallphase60)//?
{
switch(ppc->msg.position_prev)
{
case 0x3:{
ppc->msg.ctrlout_set=PWML0+PWMH1;//0x28;
break;
}
case 0x2:{
ppc->msg.ctrlout_set=PWML0+PWMH2;//0x30;
break;
}
case 0x6:{
ppc->msg.ctrlout_set=PWML1+PWMH2;//0x50;
break;
}
case 0x4:{
ppc->msg.ctrlout_set=PWML1+PWMH0;//0x44;
break;
}
case 0x5:{
ppc->msg.ctrlout_set=PWML2+PWMH0;//0x84;
break;
}
case 0x1:{
ppc->msg.ctrlout_set=PWML2+PWMH1;//0x88;
break;
}
default:{
errno=1;
break;}
}
}
else
{
switch(ppc->msg.position_prev){
case 0x1:{
ppc->msg.ctrlout_set=PWML0+PWMH1;//x28;
break;
}
case 0x0:{
ppc->msg.ctrlout_set=PWML0+PWMH2;//0x30;
break;
}
case 0x4:{
ppc->msg.ctrlout_set=PWML1+PWMH2;//0x50;
break;
}
case 0x6:{
ppc->msg.ctrlout_set=PWML1+PWMH0;//0x44;
break;
}
case 0x7:{
ppc->msg.ctrlout_set=PWML2+PWMH0;//0x84;
break;
}
case 0x3:{
ppc->msg.ctrlout_set=PWML2+PWMH1;//0x88;
break;
}
default:{
errno=1;
break;
}
}
}
}
return(errno);
}
//********************************************************************
//********************************************************************
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+0x6;//0x6
ppc->msg.max_leakagecurrent=ppc->msg.current_dcoffset+0x16;//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.current_dcoffset-0x22;//ppc->msg.LSPWM_SWITCH_I-0x28;
ppc->msg.LEBMF_CURRENT=ppc->msg.current_dcoffset-0xa;//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,&adc);
}
//********************************************************************
void COMP_ISR_C(void)
{
comp_isr(&sysstat,&proc_process);
}
//********************************************************************
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?