main.c

来自「PSOC 电动自行车代码 器件采用CYPRESS新电动自行车器件CY8C245」· C语言 代码 · 共 885 行 · 第 1/2 页

C
885
字号
#include <m8c.h>        // part specific constants and macros
#include "PSoCAPI.h"    // PSoC API definitions for all User Modules
#include "adc.h"
#include "para.h"
#include "isr.h"
#include "i2c.h"

#pragma interrupt_handler Timer_ISR_C
#pragma interrupt_handler HALL_ISR_C
#pragma interrupt_handler PWM_ISR_C
#pragma interrupt_handler COMP_ISR_C

void HALL_ISR_C(void);
void PWM_ISR_C(void);
void COMP_ISR_C(void);
void system_init(void);
void lock_motor_50us(PROC_PROCESS *ppc);
void get_work_parameters(SYSSTAT *st);
void check_cruise_entry(SYSSTAT *st,PROC_PROCESS *ppc);
void init_bus_current(ADC *adres,PROC_PROCESS *ppc,SYSSTAT *st);
void adjust_motor_run_maxcurrent(PROC_PROCESS *ppc,SYSSTAT *st);
void battery_voltage_detect(ADC *adr,BATVCHK *bv,SYSSTAT *st,PROC_PROCESS *ppc);
void process_speed_command(SYSSTAT *st,PROC_PROCESS *ppc,ADC *adres);
void inactive_ctrl(SYSSTAT *st,PROC_PROCESS *ppc);
void delay_cycle(unsigned int cs);
void motor_ctrlout(PROC_PROCESS *ppc,SYSSTAT *st);
unsigned char system_status_indicator(DISP_STRU *dsreg,SYSSTAT *st);
unsigned char get_ctrlout_setni(PROC_PROCESS *ppc,SYSSTAT *st);
unsigned char LEAKAGE_CURRENT_CHECK(SYSSTAT *st,PROC_PROCESS *ppc,ADC *sp);
unsigned char check_mosfet(SYSSTAT *st,PROC_PROCESS *ppc,ADC *sp,unsigned char intfg);
unsigned char block_run_process(SYSSTAT *st,PROC_PROCESS *ppc);
unsigned char sample_adc(unsigned char chan);
unsigned char cruisein_count,halfsecond;
void debugled(void);
PROC_PROCESS proc_process;
ADC adc;
SYSSTAT sysstat;
BATVCHK batvchk;
DISP_STRU dispreg;
void debugled(void)
{
	while(1){
		proc_process.msg.PRT2DRbak&=~LEDPORT;
		PRT2DR=proc_process.msg.PRT2DRbak;
		delay_cycle(200);
		proc_process.msg.PRT2DRbak|=LEDPORT;
		PRT2DR=proc_process.msg.PRT2DRbak;
		delay_cycle(200);
	}
}
void debug_motor(void)
{
    PWM_WritePulseWidth(0x7f);
	proc_process.msg.position_prev=0x1;
	proc_process.msg.pwmena=3;
	while(1){
	set_next_ctrlseq(&sysstat,&proc_process);
	proc_process.msg.portena=proc_process.msg.ctrlout_set;
	motor_ctrlout(&proc_process,&sysstat);
    delay_cycle(20000);
	proc_process.msg.position_prev=proc_process.msg.position_next;
	}
}
void main()
{
	unsigned tt2;
	system_init();
	vI2CInit();
	lock_motor_50us(&proc_process);
	get_work_parameters(&sysstat);
	
	init_bus_current(&adc,&proc_process,&sysstat);
	check_mosfet(&sysstat,&proc_process,&adc,0); 
	adc.msg.battery_voltage=sample_adc(battery_v_chan);
	adc.msg.brake_voltage=sample_adc(brake_in_chan);
    PWM_Start();
    PWM_EnableInt();
//	debug_motor();
    INT_MSK0 = INT_MSK0 | 0X22; //Enable GPIO & V_COMP interrupt
    PRT2IE = 0X7;
  	adc.msg.samplechannel=BATTERY;
	while(ADC_CR0&ADC_CR0_ADC_READY)
	{	
		tt2=ADC_DL;
		}
	ADC_CR0=battery_v_chan+ADC_CR0_ADC_EN+ADC_CR0_ADC_START;	
 	M8C_EnableGInt;	
	while(1)
	{
		I2CSBuff.b[0]=sysstat.msg.st0;
		I2CSBuff.b[1]=proc_process.msg.position_prev;
		adjust_motor_run_maxcurrent(&proc_process,&sysstat);
	
		if(sysstat.msg.st3&bitmain_loop_timerce)
		{
			sysstat.msg.st3&=~bitmain_loop_timerce;//sysstat.bits.main_loop_timerce=0;
			check_cruise_entry(&sysstat,&proc_process);
			process_speed_command(&sysstat,&proc_process,&adc);
			battery_voltage_detect(&adc,&batvchk,&sysstat,&proc_process);
			if(halfsecond>HALFSECOND){
				halfsecond=0;
				block_run_process(&sysstat,&proc_process);
				sysstat.msg.st3^=bithalfs;//sysstat.bits.halfs=sysstat.bits.halfs? 0:1;
			}
			else
				halfsecond++;
			system_status_indicator(&dispreg,&sysstat);
		}
	}
}
void system_init(void)
{
	unsigned char i;
	i=0;
	while(i<39)
	{
		proc_process.val[i]=0;
		i++;
	}
    sysstat.val[0]=0;
    sysstat.val[1]=0;    
    sysstat.val[2]=0;    
    sysstat.val[3]=0;    
    sysstat.msg.st1|=bitts_reset;
    adc.val[0]=0;
    adc.val[1]=0;
    adc.val[2]=0;
    adc.val[3]=0;
    adc.val[4]=0;
    batvchk.val[0]=0;
    batvchk.val[1]=0;
    batvchk.val[2]=0;
    batvchk.val[3]=0;
    dispreg.val[0]=0;
    dispreg.val[1]=0;
    dispreg.val[2]=0;
    dispreg.val[3]=0;

	inactive_ctrl(&sysstat,&proc_process);

	ADC_CR0 = ADC_CR0_CH_P00|ADC_CR0_ADC_EN;
    ADC_CR1 = 0x00;

    CMPPRG_SetRef(CMPPRG_REF0_125);   
    CMPPRG_Start(CMPPRG_HIGHPOWER);    
    PGA_SetGain(PGA_G8_00);
    PGA_Start(PGA_HIGHPOWER);
}	
void lock_motor_50us(PROC_PROCESS *ppc)
{
		// detect low side mosfet
		// on all low side mosfet
		PRT1DR=0;
		delay_cycle(100);
		PRT1DR=MASKPWML;
}

void motor_ctrlout(PROC_PROCESS *ppc,SYSSTAT *st)
{
	if((st->msg.st0&bitABS_BRAKE_ENA)&&(!(st->msg.st2&bitABS_BRAKE_OK)))
	{
		PRT1GS=(ppc->msg.portena&MASKPWML)^MASKPWML;
	}
	else
	{
		if(ppc->msg.pwmena&bitPWMON)
		{	
			if(ppc->msg.pwmena&bitLPWMON)
				PRT1GS=ppc->msg.portena;
			else
				PRT1GS=ppc->msg.portena&MASKPWMH;
		}
		else
		{
			PRT1GS=0;
		}
	}
	PRT1DR=ppc->msg.portena^MASKPWML;
}

unsigned char sample_adc(unsigned char chan)
{
	unsigned char count;
	unsigned int adres;
	count=8;
	while(ADC_CR0&ADC_CR0_ADC_READY)
		adres=ADC_DL;
	adres=0;
//	ADC_CR0=0;//chan+ADC_CR0_ADC_EN;
//	delay_cycle(20);
	ADC_CR0=chan+ADC_CR0_ADC_EN;
//	delay_cycle(3);
	while(count)
	{
		ADC_CR0=chan+ADC_CR0_ADC_EN+ADC_CR0_ADC_START;
		while(ADC_CR0&ADC_CR0_ADC_START)//!ADC_CR0&ADC_CR0_ADC_READY)//(ADC_CR0&ADC_CR0_ADC_START)&&
		{
			count=count;
		}		
		adres+=ADC_DL;
		count--;
	}
//	ADC_CR0=0;
	adres=(adres/8)&0xff;
	count=(unsigned char)adres;
	return(count);
}

void get_work_parameters(SYSSTAT *st)
{
	if(sample_adc(cruise_sele_ena_chan)>0x50)
		st->msg.st0&=~bitcruise_ena;//st->bits.cruise_ena=0;
	else
		st->msg.st0|=bitcruise_ena;//st->bits.cruise_ena=1;
		
	if(sample_adc(hallphase_sele_ena_chan)>0x50)
//		st->msg.st0|=bithallphase60;//st->bits.hallphase60=1;
		st->msg.st0&=~bithallphase60;//st->bits.hallphase60=0;			
	else
//		st->msg.st0&=~bithallphase60;//st->bits.hallphase60=0;	
		st->msg.st0|=bithallphase60;//st->bits.hallphase60=1;
		
		
	if(sample_adc(abs_sele_ena_chan)>0x50)
		st->msg.st0&=~bitabs_ena;//st->bits.abs_ena=0;	
	else
		st->msg.st0|=bitabs_ena;//st->bits.abs_ena=1;	
}


void adjust_motor_run_maxcurrent(PROC_PROCESS *ppc,SYSSTAT *st)
{
	unsigned char para1,para2,para3;

	if(st->msg.st2&bitBLOCK_RUN_P1S_OK)//st->bits.BLOCK_RUN_P1S_OK)
	{	para1=SHUTOFF_1ST_MAXCURRENT;
		para2=para1+ppc->msg.current_dcoffset;
	}
	else if(ppc->msg.speed_profile<0x60)//&&->speed_profile<0x74)	
	{
		para1=LOWSPEEDRUN_MAXCURRENT;
		para2=para1+ppc->msg.current_dcoffset;
	}
	else
	{
		para1=(ppc->msg.speed_profile-0x60)/8;
		para1=LOWSPEEDRUN_MAXCURRENT-para1;
		para2=para1;
		if(ppc->msg.speed_profile==0xff)
			para2=para1+7;
		para2=para1+ppc->msg.current_dcoffset;
	}
//		if(ppc->msg.speed_profile==0xff)
//			para2=(LOWSPEEDRUN_MAXCURRENT-0x0d-0x0a-3);
//		else if(ppc->msg.speed_profile>0xe0)
//			para2=(LOWSPEEDRUN_MAXCURRENT-0x0d-0x0a-0x06-1-1);
//		else if(ppc->msg.speed_profile>0xa8)
//		{	para1=(ppc->msg.speed_profile-0xa9)>>2;
//			para2=(LOWSPEEDRUN_MAXCURRENT-0x0d-0x0a-1)-(para1>>1);
//		}
//		else if(ppc->msg.speed_profile>0x7c)
//		{
//			para1=(ppc->msg.speed_profile-0x7d)>>1;
//			para2=(LOWSPEEDRUN_MAXCURRENT-0x0d-1)-(para1>>1);
//		}	
//		else
//		{
//			para1=ppc->msg.speed_profile-0x61;
//			para2=(LOWSPEEDRUN_MAXCURRENT-1)-(para1>>1);
//		}	
//	}
//	para2+=	ppc->msg.current_dcoffset;
	if(para1<ppc->msg.IERR_BY_BATDOWN)
		ppc->msg.RATED_CURRENT=ppc->msg.LSPWM_SWITCH_I;
	else
	{
		if(para2<ppc->msg.LSPWM_SWITCH_I)
			ppc->msg.RATED_CURRENT=ppc->msg.LSPWM_SWITCH_I;
		else
			ppc->msg.RATED_CURRENT=para2;	
	}
//	I2CSBuff.b[0]=ppc->msg.speed_profile;	
//	I2CSBuff.b[1]=ppc->msg.RATED_CURRENT;
//	I2CSBuff.b[2]=para1;
//	I2CSBuff.b[3]=para2;
//	I2CSBuff.b[4]=ppc->msg.IERR_BY_BATDOWN;
}

void check_cruise_entry(SYSSTAT *st,PROC_PROCESS *ppc)
{
	unsigned char count,count_L;
	if(!(st->msg.st0&bitBRAKE_VALID))//st->bits.BRAKE_VALID)
	{
		if(st->msg.st0&bitcruise_ena)//st->bits.cruise_ena)
		{
			count=8;count_L=0;
			while(count)
			{
				if(!CRUISE_IN)
					count_L++;
				count--;	
			}
			if(count_L==8)
			{
				if(st->msg.st2&bitcruisein_altfg)//st->bits.cruisein_altfg)
				{
					cruisein_count=0;
				}
				else
				{
					cruisein_count++;
					if(cruisein_count>2)
					{
						st->msg.st2|=bitcruisein_altfg;//st->bits.cruisein_altfg=1;
						if(st->msg.st0&bitcruise_on)//st->bits.cruise_on)
							st->msg.st0&=~bitcruise_on;//st->bits.cruise_on=0;
						else if(ppc->msg.speed_profile)
							st->msg.st0|=bitcruise_on;//st->bits.cruise_on=1;
						else
						{
							st->msg.st2&=~bitcruisein_altfg;//st->bits.cruisein_altfg=0;
							cruisein_count=0;
						}			
					}	
				}	
			}
			else
			{
				st->msg.st2&=~bitcruisein_altfg;//st->bits.cruisein_altfg=0;
				cruisein_count=0;
			}			
		}
	}
	else
		st->msg.st0&=~bitcruise_on;//st->bits.cruise_on=0;
}
const unsigned char spcmdindx[47]={ 0x08 , 0x08 , 0x0c , 0x10 , 0x14 , 0x18 , 0x1C\
            , 0x20 , 0x24 , 0x28 , 0x2C , 0x30 , 0x34 , 0x38\
            , 0x3C , 0x41 , 0x46 , 0x4B , 0x53 , 0x5A , 0x61\
            , 0x68 , 0x70 , 0x78 , 0x80 , 0x88 , 0x90 , 0x98\
            , 0xA0 , 0xA8 , 0xB0 , 0xB8 , 0xC0 , 0xC7 , 0xCD\
            , 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)
						{
							check_mosfet(&sysstat,&proc_process,&adc,1);
						}
					}		
					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)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?