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 + -
显示快捷键?