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